随机数种子cudnn.benchmark与cudnn.deterministic

设置 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是算法内部问题

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值