问题
深度学习训练时,可以通过seed种子设置保持结果的可复现性,如下所示
def set_seed(my_seed):
os.environ['PYTHONHASHSEED'] = str(my_seed)
random.seed(my_seed)
np.random.seed(my_seed)
torch.manual_seed(my_seed)
torch.cuda.manual_seed(my_seed)
torch.cuda.manual_seed_all(my_seed)
torch.backends.cudnn.benchmark = False # This can slow down training
torch.backends.cudnn.deterministic = True
然而,我设置了上述的随机种子,仍然会无法保证每次的效果都是一致的。
解决
在中文网站搜索了一堆,都只是给出了设置随机种子。后面去谷歌,英文输入“ pytorch set seed fail to reproduce result ”,进入github的讨论
发现是由于DataLoader中的worker_num的问题。通过将其设置为0并且再结合如下的一行代码
torch.backends.cudnn.enabled = False
就可以实验结果保证一致性了。 (注意,上述的两者都需要同时的满足)
但是这样做会大大降低训练速度,因为num_workers = 0,所以一种更简单的方式是升级pytorch版本。例:torch1.90升级为torch1.11.0