#python #docker #testing #deep-learning #pytorch
#python #docker #тестирование #глубокое обучение #pytorch
Вопрос:
Я пытаюсь создать несколько тестов CI для модели глубокого обучения и поэтому создал Dockerfile для установки PyTorch и всех моих требований и, наконец, запуска тестов.
FROM pytorch/pytorch
ADD . / project/
RUN (cd project/; pip install -r requirements.txt)
CMD ( cd project/; pytest -v --cov=my_project)
Тесты в основном вычисляют изображение из 0-1 и сравнивают его с эталонным изображением (сохраненным как npy). Тест проверяет
, находится ли среднее значение L2 для пикселей ниже порогового значения 1e-7
.
diff_image = np.linalg.norm(target_image_np - reference_image_np, axis=2)
avg_error = np.mean(diff_image)
assert avg_error < 1e-7
Тесты проходят 12/15 тестовых примеров. Однако 3 случая терпят неудачу довольно сильно.
=========================== short test summary info ============================
FAILED test_nst.py::test_nst_gatys - assert 0.0021541715 < 1e-07
FAILED test_nst.py::test_nst_gatys_style - assert 0.12900369 < 1e-07
FAILED test_nst.py::test_nst_wct - assert 0.027357593 < 1e-07
=================== 3 failed, 12 passed in 670.27s (0:11:10) ===================
Странно то, что это происходит ТОЛЬКО на сервере CI. На моей локальной машине все тесты проходят. У кого-нибудь есть идея, почему это происходит? Насколько я знаю, использование процессора, а также фиксированных начальных значений должно возвращать как минимум результаты, которые отличаются только численно.
Спасибо за любые отзывы!
Ответ №1:
Я сам нашел решение. Требуется установить количество потоков равным единице. Наконец, это весь код, необходимый для получения воспроизводимых результатов на разных машинах.
np.random.seed(42)
torch.manual_seed(42)
os.environ["PYTHONHASHSEED"] = "42"
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
torch.set_num_threads(1)
Комментарии:
1. Я ломал голову над этой проблемой уже около 5 часов. Если это решение, я тебя поцелую
2. Я трачу более 1 дня, чтобы подумать о том, в чем разница… Пока я не увидел этот пост. Очень благодарен…