训练中torch.backends.cudnn.benchmark的使用

通过设置torch.backends.cudnn.benchmark为True,可以在PyTorch中为卷积神经网络选择最佳的cuDNN算法,从而显著提高运行速度。该方法适用于模型结构固定且输入尺寸不变的情况。

训练中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来加速训练

参考:https://zhuanlan.zhihu.com/p/73711222

#### 含义 - `torch.backends.cudnn.benchmark = True`:当设置为`True`时,PyTorch会在每次运行卷积层时,在多个卷积算法中自动寻找最适合当前硬件和输入数据尺寸的算法,以达到最快的运行速度。这是通过在后台运行一些基准测试来实现的,所以会在程序开始时增加一些额外的时间开销,但后续的卷积操作会更快[^1]。 - `torch.backends.cudnn.deterministic = False`:当设置为`False`时,允许CuDNN使用非确定性算法。非确定性算法可能会在相同的输入下产生稍微不同的结果,但通常会有更好的性能。相反,当设置为`True`时,CuDNN使用确定性算法,保证每次运行的结果都是相同的。 #### 使用场景 - **`torch.backends.cudnn.benchmark = True`**:适用于输入数据的尺寸固定,且追求极致的推理或训练速度的场景。例如,在图像分类任务中,如果所有输入图像的尺寸都是固定的,开启这个选项可以显著提高模型的运行速度。在训练大规模深度学习模型时,也可以通过开启这个选项来加速训练过程。 - **`torch.backends.cudnn.deterministic = False`**:当对结果的可重复性要求不高,更注重性能时,可以将其设置为`False`。比如在模型的开发和调试阶段,或者在进行大规模的训练时,为了提高训练效率,可以牺牲一定的结果确定性。 #### 影响 - **性能方面**:`torch.backends.cudnn.benchmark = True`通常会提高卷积操作的性能,尤其是在GPU上。因为它会选择最优的算法,减少卷积操作的时间开销。而`torch.backends.cudnn.deterministic = False`允许使用非确定性算法,也可能会提高性能,但具体效果取决于硬件和算法的实现。 - **结果可重复性方面**:`torch.backends.cudnn.benchmark = True`本身不会影响结果的可重复性,但如果同时设置`torch.backends.cudnn.deterministic = False`,则会破坏结果的可重复性。也就是说,每次运行相同的代码,可能会得到稍微不同的结果。 以下是设置这两个参数的代码示例: ```python import torch # 设置benchmark为True torch.backends.cudnn.benchmark = True # 设置deterministic为False torch.backends.cudnn.deterministic = False ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值