torch.backends.cudnn系列用法

前置知识

CUDA

CUDA是NVIDIA推出的用于自家GPU的并行计算框架,也就是说CUDA只能在NVIDIA的GPU上运行,而且只有当要解决的计算问题是可以大量并行计算的时候才能发挥CUDA的作用。

cuDNN

cuDNN(CUDA Deep Neural Network library):是NVIDIA打造的针对深度神经网络的加速库,是一个用于深层神经网络的GPU加速库。如果你要用GPU训练模型,cuDNN不是必须的,但是一般会采用这个加速库。

代码一:

torch.backends.cudnn.benchmark = True

作用:
设置 torch.backends.cudnn.benchmark=True 将会让程序在开始时花费一点额外时间,为整个网络的每个卷积层搜索最适合它的卷积实现算法,进而实现网络的加速。
设置这个 flag 可以让内置的 cuDNN 的 auto-tuner 自动寻找最适合当前配置的高效算法,来达到优化运行效率的问题

注意事项1:
适用场景是网络结构固定(不是动态变化的),网络的输入形状(包括 batch size,图片大小,输入的通道)是不变的,其实也就是一般情况下都比较适用。反之,如果卷积层的设置一直变化,网络的输入数据在每次 iteration 都变化的话,会导致 cnDNN 每次都会去寻找一遍最优配置,这样反而会降低运行效率。

注意事项2:
Benchmark模式会提升计算速度,但是由于计算中有随机性,每次网络前馈结果略有差异。如果想要避免这种结果波动,设置:

torch.backends.cudnn.deterministic = True

 上述代码使得实验结果可以重现。

作为 CuDNN 的背景,重要的是要认识到,对于许多操作,CuDNN 有几种实现,我们称它们为不同的算法。

现在 cudnn.deterministic 将只允许那些(被认为是)确定性的 CuDNN 算法。不过,对于接下来的事情至关重要,可能还剩下几个。这意味着,如果您在同一系统上使用相同的输入运行相同的 CuDNN 操作(相同的机器具有相同的 CPU、GPU 和 PyTorch、CUDA、CuDNN 版本不变),如果 CuDNN 选择他们可用的集合中的相同算法。
现在,通常 CuDNN 具有关于选择哪种算法的启发式方法,这大致取决于输入形状、步幅(也称为内存布局)和 dtype。这些启发式方法涵盖了广泛的案例,但是,由于它们是启发式方法,它们有时可能会选择效率较低的算法。为了改进启发式算法的使用,如果您设置 cudnn.benchmark,CuDNN 库将对几种算法进行基准测试,并选择它认为最快的算法。有一些关于何时以及如何完成的规则​​(您必须查看他们的文档以获取详细信息,经验法则:如果您有固定的输入大小,则很有用)。这可能意味着即使设置了确定性标志,基准测试也可能会选择不同的算法(由于主机箱上运行的其他东西等)。因此,在打开 cudnn.deterministic 时关闭 cudnn.benchmark 似乎是一种很好的做法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值