文章目录

  • 1080ti与2080ti区别
  • 在目标检测和分割任务中使用apex
  • 梯度累加(一般不在目标检测中使用)
  • torch.no_grad()

当我们没有足够的显卡训练模型时,apex和梯度累加是有效的减少显卡资源使用的手段。

1080ti与2080ti区别

1080ti与2080ti均为11G显存,在训练同样的模型时batch_size可以调到一样大。它们的主要区别在于2080ti具有很强的半精度浮点数计算能力。1080ti和2080ti的计算能力如下:

gtx 1080ti:
半精度浮点数:0.17TFLOPS
单精度浮点数:11.34TFLOPS
双精度浮点数:0.33TFLOPS
rtx 2080ti:
半精度浮点数:20.14TFLOPS
单精度浮点数:10.07TFLOPS
双精度浮点数:0.31TFLOPS

半精度浮点数即FP16,单精度浮点数即FP32,双精度浮点数即FP64。
在不使用apex的pytorch训练过程中,一般默认均为单精度浮点数,从上面的数据可以看到1080ti和2080ti的单精度浮点数运算能力差不多,因此不使用apex时用1080ti和2080ti训练模型时间上差别很小。
在文章:【庖丁解牛】从零实现RetinaNet(六):RetinaNet的训练与测试中,不使用apex时用2个2080ti训练时一个epoch要2h38min,而使用apex时用1个2080ti训练时一个epoch是2h31min,两者时间几乎一样,但是却少用了一张2080ti。这是因为在pytorch训练中使用apex时,此时大多数运算均为半精度浮点数运算,而2080ti的半精度浮点数运算能力是其单精度浮点数运算能力的两倍(1080ti几乎没有半精度浮点数运算能力)。这就为什么少用了一张2080ti但是一个epoch的训练时间差不多的原因。对于1080ti,由于其几乎没有半精度浮点数运算能力,即使使用apex,最终实际也是按单精度浮点数来计算的,因此起不到训练提速效果。

在目标检测和分割任务中使用apex

使用apex能够显著的降低显存占用25-30%,通常情况下同样显卡可以把batch_size扩大接近一倍,非常实用。
类似于base model第七弹中所述,我们先安装apex工具库。如果你是Python3.7环境,使用下列命令安装:

git clone https://github.com/NVIDIA/apex
cd apex
pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./

如果你是Python3.6环境,则使用下列命令安装:

git clone https://github.com/NVIDIA/apex
cd apex
pip install -v --no-cache-dir ./

安装完成后,在train.py中进行下列修改:

from apex import amp
......
......
# 定义好Model和optimizer后,增加下面这行代码:
amp.register_float_function(torch, 'sigmoid')
amp.register_float_function(torch, 'softmax')
model, optimizer = amp.initialize(model, optimizer, opt_level='O1')
# 反传梯度原本的代码是loss.backward(),改为下面两行代码:
with amp.scale_loss(loss, optimizer) as scaled_loss:scaled_loss.backward()

这里和base model第七弹中的区别是增加了两行amp.register_float_function函数。这个函数的作用是将模型所有sigmoid和softmax层强制使用FP32精度计算。因为FP16的位数较少,能保存数据的上限和下限的绝对值也变小了,在检测和分割问题中sigmoid和softmax层很容易在求和时导致数据溢出。在我的实验中,不使用amp.register_float_function时几乎每次都会在epoch5到8时loss变为nan,因此这个操作是十分必要的。对于分类任务,一般不加amp.register_float_function也不会溢出。

梯度累加(一般不在目标检测中使用)

当我们的显卡资源不够时,还可以考虑使用梯度累加。所谓梯度累加就是把一个大的batchsize分成若干次小batchsize计算梯度,每次梯度除以次数,然后进行梯度累加,这样若干次后累加的梯度就近似为大batchsize计算出来的梯度。需要说明的是,这种模拟是近似的,因为BN层仍然按照实际的小batchsize更新。
我们一般可以在分类任务中使用梯度累加,因为分类任务中即使划分为小batchsize时小batchsize也比较大(一般大于32),对BN层的影响有限。对于目标检测任务,由于总的batchsize本身就比较小,使用梯度累加会导致BN层的误差较大,所以我们一般不在目标检测中使用梯度累加。
在train.py中,进行下列修改,就可以实现梯度累加:

inputs, labels = inputs.cuda(), labels.cuda()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss = loss / args.accumulation_steps
loss.backward()if iter_index % args.accumulation_steps == 0:optimizer.step()optimizer.zero_grad()

其中,loss = loss / args.accumulation_steps根据累加次数把loss做除法,使得在不修改学习率的情况下最终累加的反传梯度数量级与原来一致(由于我们在累加的过程中考虑了多次小batchsize产生的loss,但又除以了累加次数,所以在loss.backward()多次累加后就近似相当于大batchsize计算出的loss产生的梯度)。最后,我们经过累加的梯度次数后才使用optimizer.step()更新一次网络参数,然后使用optimizer.zero_grad()将梯度清零。

torch.no_grad()

在测试时,我们不需要对所有变量计算梯度,只需要计算前向传播即可。我们可以用with torch.no_grad():包裹不需要计算梯度的那部分代码。虽然测试时因为没有loss.backward(),即使产生了梯度也不会更新变量,但使用后可以减少这部分计算梯度的计算量和梯度占用的显存。
要注意model.eval()和with torch.no_grad():是不同的,model.eval()只是把模型中所有BN层设置为评估模式,这样有前向计算时模型的BN层均值和标准差也不会更新。

【深度学习训练小技巧】1080ti与2080ti区别、apex与梯度累加相关推荐

  1. 深度学习训练的小技巧,调参经验。总结与记录。

    深度学习训练的小技巧,调参经验.总结与记录. 2016-10-23 23:07 390人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载. 经常会被问到你用深度学习训练 ...

  2. 深度学习 英文 训练阶段_半监督深度学习训练和实现小Tricks

    临近毕业,忽然想实现一下一些比较经典的半监督深度学习算法.恰逢一周前有个师妹问我有没有关于半监督深度学习训练技巧的文章,我一想,好像没有,便想自己写一篇. Talk is cheap, show yo ...

  3. 深度学习训练技巧总结

    参考: 1 技巧链接一!重要 技巧链接二!重要 技巧链接三!重要 模型训练技巧最直接的就是几个超参数的设置 根据图片大小来选择网络和超参数 如果图片不是很大比如3030,这种情况下做分类就不能用VGG ...

  4. 深度学习训练的时候gpu占用0_26秒单GPU训练CIFAR10,Jeff Dean也点赞的深度学习优化技巧...

    选自myrtle.ai 机器之心编译机器之心编辑部 26 秒内用 ResNet 训练 CIFAR10?一块 GPU 也能这么干.近日,myrtle.ai 科学家 David Page 提出了一大堆针对 ...

  5. 听Alluxio小姐姐讲述:Alluxio云上K8S部署如何加速深度学习训练

    Alluxio云上K8S部署如何加速深度学习训练 在2021 Alluxio Day V中,Alluxio核心研发工程师邱璐,为我们带来[Alluxio云上K8S部署如何加速深度学习训练]的分享 邱璐 ...

  6. 训练深度学习_深度学习训练tricks整理1

    深度学习训练tricks整理1 环境:pytorch1.4.0 + Ubuntu16.04 参考: 数据增强策略(一)​mp.weixin.qq.com https://zhuanlan.zhihu. ...

  7. 深度学习 | 训练及优化方法

    ---------------------------- 原文发表于夏木青 | JoselynZhao Blog,欢迎访问博文原文. ---------------------------- 深度学习 ...

  8. 机器学习和深度学习训练常见问题

    1. 如何解决正负类不平衡问题 类别不均衡时,不能使用accuracy作为分类器的评价指标.例如:当在对一个类别不均衡的数据集进行分类时得到了90%的准确度(Accuracy).当你进一步分析发现,数 ...

  9. 深度学习这么调参训练_深度学习调参技巧

    训练技巧对深度学习来说是非常重要的,作为一门实验性质很强的科学,同样的网络结构使用不同的训练方法训练,结果可能会有很大的差异.这里我总结了近一年来的炼丹心得,分享给大家,也欢迎大家补充指正. 参数初始 ...

最新文章

  1. 2012关于钱的Tips
  2. 计算机应用基础全套ppt,计算机应用基础全套PPT电子教案(完整版).ppt
  3. python读文件完整代码_python读文件逐行处理的示例代码分享
  4. 【快乐水题】495. 提莫攻击
  5. 一文读懂RPA与BPM的区别和联系
  6. 探讨继承与实现(二)
  7. 实时检测input的长度_目标检测——TinyYOLOv3
  8. 在Windows上安装Python
  9. .net C# Treeview的Node拖动,Node节点上下移动
  10. php 单例 重连,PHP单例模式详解
  11. STM32的Bootloader实现
  12. Docker系列(八)Docker的CS模式、守护进程的配置和操作
  13. 计算机网络中的数据传输方式—同步传输和异步传输
  14. 易风互联网邮件监控系统 v2.21 怎么用
  15. 研究人员创建一种安全的CAR T细胞疗法来对抗儿童的实体瘤
  16. 报表自动生成软件有哪些?热门报表自动生成软件推荐
  17. 几种不为人熟知的搜索引擎作弊方法(转)
  18. 理解深度学习.PDF、国外AIGC各模态产品梳理.pdf、构建企业级的私有大模型.pdf
  19. ios13 无法传参_小偷的终极克星!iOS13真正杀手锏:关机断网也可定位设备
  20. PHPStorm自动换行设置

热门文章

  1. 显示服务器密码的命令,PASSWORD 命令
  2. MySQL给表里的某个字段建立索引
  3. 最新盘点当今10个顶尖的机床系统及厂家
  4. 26-tcp可靠传输——停止等待协议
  5. 赛码网编程练习(四)
  6. 阿里云人脸人体--人物动漫化效果
  7. c语言实现贪吃蛇教程
  8. etlgr是什么服务器_什么是ETL?算了,你可能不懂
  9. java锁上升_Java内存模型FAQ(十一)新的内存模型是否修复了双重锁检查问题?...
  10. AttributeError: partially initialized module ‘pandas‘ has no attribute ‘set_option‘(报错处理)