设置 torch.backends.cudnn.benchmark=True 将会让程序在开始时花费一点额外时间,为整个网络的每个卷积层搜索最适合它的卷积实现算法,进而实现网络的加速。适用场景是网络结构固定(不是动态变化的),网络的输入形状(包括 batch size,图片大小,输入的通道)是不变的,其实也就是一般情况下都比较适用。反之,如果卷积层的设置一直变化,将会导致程序不停地做优化,反而会耗费更多的时间。
torch.backends.cudnn.deterministic = True ,每次返回的卷积算法将是确定的。可以避免benchmark=True的差异。
某些操作(如卷积)在实现上使用了随机性,它们可能会引入一些随机性的元素,例如权重初始化、Dropout等。
如果是复现模型结果的话,应该用这个配置(李宏毅hw1)
def same_seed(seed):
'''Fixes random number generator seeds for reproducibility'''
# 使用确定性算法(deterministic algorithms),以确保相同的input,parameters和环境可以输出相同的output,使得训练结果可以复现。
torch.backends.cudnn.deterministics=True
# 由于使用GPU进行训练时,cuDNN会自动选择最高效的算法,导致训练结果难以复现,因此需要关闭benchmark模式。
torch.backends.cudnn.benchmark=False
#random.seed(seed)
np.random.seed(seed) # 根据输入的seed设置固定的numpy seed。
torch.manual_seed(seed) # 根据输入的seed值在torch中设置固定的起始参数。
if torch.cuda.is_available():
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed)# if you are using multi-GPU.
总之,方便复现、提升训练速度就:
torch.backends.cudnn.benchmark = False
不需要复现结果、想尽可能提升网络性能:
torch.backends.cudnn.benchmark = True
通过torch.backends.cudnn.benchmark = False限制了算法的选择这种不确定性,但是由于,算法本身也具有不确定性,因此可以通过设置:
torch.backends.cudnn.deterministic = True
保持可复现性
benchmark是算法之间问题,deterministic是算法内部问题