训练中torch.backends.cudnn.benchmark的使用
训练中torch.backends.cudnn.benchmark的使用
一般将torch.backends.cudnn.benchmark设为True就可以大大提升卷积神经网络的运行速度。
原因:将会让程序在开始时花费一点额外时间,为整个网络的每个卷积层搜索最适合它的卷积实现算法,进而实现网络的加速
。
适用:适用场景是网络结构固定(不是动态变化的),网络的输入形状(包括 batch size,图片大小,输入的通道)是不变的
背景:
大多数主流深度学习框架都支持 cuDNN这个GPU加速库,来为训练加速。而卷积网络的具体计算方法又有很多,所以使用torch.backends.cudnn.benchmark就可以在 PyTorch 中对模型里的卷积层进行预先的优化,也就是在每一个卷积层中测试 cuDNN 提供的所有卷积实现算法,然后选择最快的那个
。这样在模型启动的时候,只要额外多花一点点预处理时间,就可以较大幅度地减少训练时间。
影响卷积运行的因素:
为什么我们可以提前选择每层的算法,即使每次我们送入网络训练的图片是不一样的?即每次网络的输入都是变化的,那么我怎么确保提前选出来的最优算法同样也适用于这个输入呢?原因就是,对于给定输入来说,其具体值的大小是不影响卷积的运行时间的,只有其尺寸才会影响
。举例来说,我们只要固定输入大小都是 (8, 64, 224, 224),即 batch_size 为 8,输入的通道为 64,宽和高为 224,那么卷积层的运行时间都是几乎不变的,无论其中每个像素具体的值是 0.1 还是 1000.0。
所以当网络的模型不会一直发生变化,且输入的大小不会一直变化的话就可以使用torch.backends.cudnn.benchmark=True来加速训练