深度学习调参笔记#2-可复现的细节(固定seed)

本文最后更新于:2022年7月21日 下午

深度学习调参笔记#2-可复现的细节(固定seed)

在深度学习中,要想让你的结果可完美复现出来,避免每次运行都看运气,那就要尽量避免不确定因素,本文以PyTorch为例,介绍相关的设置。

固定种子 seed

模型训练中,参数的初始化、数据的顺序等都具有一定的不确定性,而计算机通过种子生成伪随机数,所以固定种子还是十分有必要的。(但是固定一个神奇的种子来表面提升学习效果是不可取的)

下面这几项参考pytorch_lightning的种子设置:

1
2
3
4
5
random.seed(seed)  # 配置Python random库的随机种子
np.random.seed(seed) # 配置Numpy库的随机种子
torch.manual_seed(seed) # 配置torch的随机种子
torch.cuda.manual_seed(seed) # 配置单个GPU上的种子
torch.cuda.manual_seed_all(seed) # 配置所有GPU上的种子

配置使用确定性操作

即使固定了种子,算法的结果在不同设备(或者不同平台)上可能还是不同,所以假如对复现有很高要求,还要配置使用确定性操作。要注意的是,使用确定性操作往往会让算法变慢,需要进行速度和复现性的取舍。

1
2
3
4
5
6
7
# 将benchmark设置为False会让cudnn在有多种算法可选的情况下选择固定的一种
# 假如是True的话,cudnn会对多种算法进行测试,找到在你硬件上运行最快的那个算法,
# 然后再固定使用这个算法进行计算。
# 假如模型输入不会变化,比较规则,那设置成True可能会提高性能
# 假如模型输入会变化,那设置成True反而可能导致性能降低
# 不过要复现那还是设置成False吧~
torch.backends.cudnn.benchmark = False
1
2
3
# benchmark=False让选择的算法是固定的,然而这个算法本身可能还是non-deterministic的
# 所以设置deterministic=True可以让torch选择可确定的算法
torch.backends.cudnn.deterministic = True

参考资料:

torch.manual_seed — PyTorch 1.12 documentation

Reproducibility — PyTorch 1.12 documentation