设置这个 flag 可以让内置的 cuDNN 的 auto-tuner 自动寻找最适合当前配置的高效算法,来达到优化运行效率的问题。
应该遵循以下准则:
如果网络的输入数据维度或类型上变化不大,也就是每次训练的图像尺寸都是一样的时候,设置 torch.backends.cudnn.benchmark = true 可以增加运行效率;
如果网络的输入数据在每次 iteration 都变化的话,会导致 cnDNN 每次都会去寻找一遍最优配置,这样反而会降低运行效率。
torch.backends.cudnn.benchmark = true
不知道为什么好多人写dropout和batchnormalization,这个只要稍微理解他们的原理就明白肯定要对train的值进行判断的,train值的功能目前也仅限于这两个层,对于别的层来说,train(True)和train(False)是没有任何区别的。而输入变量的volatile这个确实是个小坑,不光能加快速度,还可以大大减小内存开销。
有几条小技巧分享一下:
- torch.backends.cudnn.benchmark = True 在程序刚开始加这条语句可以提升一点训练速度,没什么额外开销。我一般都会加有时候可能是因为每次迭代都会引入点临时变量,会导致训练速度越来越慢,基本呈线性增长。
2.开发人员还不清楚原因,但如果周期性的使用torch.cuda.empty_cache()的话就可以解决这个问题。这个命令是清除没用的临时变量的。torchvision.transforms里的各种坑,等有空再说。
作者:功长真金
链接:https://www.zhihu.com/question/67209417/answer/303290223
来源:知乎