深度学习中提高训练速度的办法,降低显存的技巧(适合没有太多计算资源的入门trick)

1、提高batchsize直到GPU RAM达到满负荷:显卡利用率不足
经常有程序跑得非常慢,但是一看占用率才3%,10%,这往往是因为CPU和GPU之间的速度不是很匹配。因为模型的计算基本都是在GPU上的,所以一般问题都出在载入数据的速度太慢了,当载入数据花了很久但模型计算飞快的解决,相对于GPU要等待很久才会工作,这样的占用率自然就不高了。当然也有可能不是数据的问题,而是模型本身就太简单了。

batch_size变大。这样可以一次性多载入数据到显存中,可以提高它的占用率,并且可以尽量占满GPU的内存。
Dataloader中的num_workers。这个参数可以多进程的载入数据提高效率,一般可以选用4,8,16等等。但是,这个数量并不是越多越好,因为worker越多,一些进程间的分配和协作+I/O问题反而会拖慢速度

2、在程序开始的位置设置torch.backends.cudnn.benchmark=True。将会让程序在开始时花费一点额外时间,为整个网络的每个卷积层搜索最适合它的卷积实现算法,进而实现网络的加速。适用场景是网络结构固定(不是动态变化的),网络的输入形状(包括 batch size,图片大小,输入的通道)是不变的,其实也就是一般情况下都比较适用。反之,如果卷积层的设置一直变化,将会导致程序不停地做优化,反而会耗费更多的时间。

3、在执行程序前输入torch.cuda.empty_cache。
理由:如果在python内调用pytorch有可能显存和GPU占用不会被自动释放,此时需要加入如下代码来删除一些不需要的变量 。

4、优化网络结构:当网络过于复杂,卷积层过多,会减慢训练速度。

5、一般默认情况下, 整个网络中采用的是32位的浮点数,如果切换到 16位的浮点数,其显存占用量将接近呈倍数递减
6/做梯度累积,将loss划分为n,即loss = loss / n, 当执行完n步再进行梯度更新

7、选择更小的数据类型

一般默认情况下, 整个网络中采用的是32位的浮点数,如果切换到 16位的浮点数,其显存占用量将接近呈倍数递减。

8、精简模型

在设计模型时,适当的精简模型,如原来两层的LSTM转为一层; 原来使用LSTM, 现在使用GRU; 减少卷积核数量; 尽量少的使用 Linear 等。

9、数据角度

对于文本数据来说,长序列所带来的参数量是呈线性增加的, 适当的缩小序列长度可以极大的降低参数量。

10、total_loss

考虑到 loss 本身是一个包含梯度信息的 tensor, 因此,正确的求损失和的方式为:

total_loss += loss.item()
释放不需要的张量和变量

采用del释放你不再需要的张量和变量,这也要求我们在写模型的时候注意变量的使用,不要随心所欲,漫天飞舞。

10、Relu 的 inplace 参数

激活函数 Relu() 有一个默认参数 inplace ,默认为Flase, 当设置为True的时候,我们在通过relu() 计算得到的新值不会占用新的空间而是直接覆盖原来的值,这表示设为True, 可以节省一部分显存。

11、梯度累积

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值