PyTorch ОЧЕНЬ разные результаты на разных машинах с использованием docker и CPU

#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 дня, чтобы подумать о том, в чем разница… Пока я не увидел этот пост. Очень благодарен…