Недетерминированное поведение для обучения нейронной сети на GPU, реализованное в PyTorch, и с фиксированным случайным начальным числом

Я наблюдал странное поведение конечной точности, когда я запускаю точно такой же эксперимент (тот же код для обучения нейронной сети для классификации изображений) с одним и тем же случайным семенем на разных графических процессорах (машинах). Я использую только один GPU. Точнее, когда я провожу эксперимент на одной машине_1, точность составляет 86,37. Когда я провожу эксперимент на machine_2, точность составляет 88,0. Когда я провожу эксперимент несколько раз на одной машине, вариативности нет. Версии PyTorch и CUDA одинаковы. Не могли бы вы помочь мне выяснить причину и исправить?

Machine_1: NVIDIA-SMI 440.82 Версия драйвера: 440.82 Версия CUDA: 10.2

Machine_2: NVIDIA-SMI 440.100 Версия драйвера: 440.100 Версия CUDA: 10.2

Чтобы исправить случайное семя, я использую следующий код:

random.seed(args.seed)
os.environ['PYTHONHASHSEED'] = str(args.seed)
np.random.seed(args.seed)
torch.manual_seed(args.seed)
torch.cuda.manual_seed(args.seed)
torch.backends.cudnn.benchmark = False
torch.backends.cudnn.deterministic = True

Отвечает ли это на ваш вопрос? Обучение моделей PyTorch на разных машинах приводит к разным результатам </ а>   —  person Evgeny Krivosheev    schedule 18.05.2021

См. также:  PyTorch - одна из переменных, необходимых для вычисления градиента, была изменена операцией на месте.
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Evgeny Krivosheev

    Вот что я использую:

    import torch
    import os
    import numpy as np
    import random
    
    def set_seed(seed):
        torch.manual_seed(seed)
        torch.cuda.manual_seed_all(seed)
        torch.backends.cudnn.deterministic = True
        torch.backends.cudnn.benchmark = False
        np.random.seed(seed)
        random.seed(seed)
        os.environ['PYTHONHASHSEED'] = str(seed)
    
    set_seed(13)
    

    Убедитесь, что у вас есть единственная функция, которая устанавливает семена с одного раза. Если вы используете Jupyter notebooks, время выполнения ячейки может вызвать это. Также может быть важен порядок функций внутри. У меня никогда не было проблем с этим кодом. Вы можете часто вызывать set_seed() в коде.

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: