AI编辑:我是小将

混合精度训练(mixed precision training)可以让模型训练在尽量不降低性能的情形下提升训练速度,而且也可以降低显卡使用内存。目前主流的深度学习框架都开始支持混合精度训练。对于PyTorch,混合精度训练还主要是采用NVIDIA开源的apex库。但是,PyTorch将迎来重大更新,那就是提供内部支持的混合精度训练,而且是自动混合精度训练:

  • torch.cuda.amp.autocast :自动为GPU op选择精度来提升训练性能而不降低模型准确度。

  • torch.cuda.amp.GradScaler : 对梯度进行scale来加快模型收敛,因为float16梯度容易出现underflow(梯度过小)

两者结合在一起,可以实现自动混合精度训练:

# Creates model and optimizer in default precisionmodel = Net().cuda()optimizer = optim.SGD(model.parameters(), ...)

# Creates a GradScaler once at the beginning of training.scaler = GradScaler()

for epoch in epochs:    for input, target in data:        optimizer.zero_grad()

        # Runs the forward pass with autocasting.        with autocast():            output = model(input)            loss = loss_fn(output, target)

        # Scales loss.  Calls backward() on scaled loss to create scaled gradients.        # Backward passes under autocast are not recommended.        # Backward ops run in the same precision that autocast used for corresponding forward ops.        scaler.scale(loss).backward()

        # scaler.step() first unscales the gradients of the optimizer's assigned params.        # If these gradients do not contain infs or NaNs, optimizer.step() is then called,        # otherwise, optimizer.step() is skipped.        scaler.step(optimizer)

        # Updates the scale for next iteration.        scaler.update()

可以看到,为了防止梯度的underflow,首先scaler.scale(loss).backward()会对loss乘以一个scale因子,然后backward时所有梯度都会乘以相同的scale因子,这样保证梯度有较大的magnitude而不会出现为0。我们不希望这个scale因子对学习速率产生影响,那么scaler.step(optimizer)会先unscale要更新的梯度然后再更新,如果梯度出现infs或者NaNs,optimizer将忽略这次迭代训练。

如果你想在梯度更新前对梯度进行clip,也是可以的:

scaler = GradScaler()

for epoch in epochs:    for input, target in data:        optimizer.zero_grad()        with autocast():            output = model(input)            loss = loss_fn(output, target)        scaler.scale(loss).backward()

        # Unscales the gradients of optimizer's assigned params in-place        scaler.unscale_(optimizer)

        # Since the gradients of optimizer's assigned params are unscaled, clips as usual:        torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm)

        # optimizer's gradients are already unscaled, so scaler.step does not unscale them,        # although it still skips optimizer.step() if the gradients contain infs or NaNs.        scaler.step(optimizer)

        # Updates the scale for next iteration.        scaler.update()

当然,混合精度训练肯定要支持分布式训练,由于autocast是thread local的,所以要注意以下不同的情形:

如果使用torch.nn.DataParallel

此时只有一个进程,而不同GPU上是各自的线程跑forward过程的,所以下面操作时无效的:

model = MyModel()dp_model = nn.DataParallel(model)

# Sets autocast in the main threadwith autocast():    # dp_model's internal threads won't autocast.  The main thread's autocast state has no effect.    output = dp_model(input)    # loss_fn still autocasts, but it's too late...    loss = loss_fn(output)

此时你需要对model的forward方法用autocast装饰:

MyModel(nn.Module):    ...    @autocast()    def forward(self, input):       ...

# AlternativelyMyModel(nn.Module):    ...    def forward(self, input):        with autocast():            ...model = MyModel()dp_model = nn.DataParallel(model)

with autocast():    output = dp_model(input)    loss = loss_fn(output)

如果使用torch.nn.parallel.DistributedDataParallel

一般情形下是单GPU进程的,此时原来的用来就没有问题,但是如果是多GPU一个进程那么就和上述问题一样,需要用autocast装饰model的forward。


更多内容见: https://pytorch.org/docs/master/notes/amp_examples.html#amp-examples

推荐阅读

堪比Focal Loss!解决目标检测中样本不平衡的无采样方法

超越BN和GN!谷歌提出新的归一化层:FRN

CVPR2020 论文系列一:VSGNet

PyTorch分布式训练简明教程

图神经网络入门

另辟蹊径!斯坦福大学提出边界框回归任务新Loss:GIoU

人人必须要知道的语义分割模型:DeepLabv3+

机器学习算法工程师


一个用心的公众号


pytorch显卡内存随训练过程而增加_PyTorch重大更新:将支持自动混合精度训练!...相关推荐

  1. PyTorch 1.6 发布:原生支持自动混合精度训练并进入稳定阶段

    PyTorch 1.6 稳定版已发布,此版本增加了许多新的 API.用于性能改进和性能分析的工具.以及对基于分布式数据并行(Distributed Data Parallel, DDP)和基于远程过程 ...

  2. PyTorch 1.6正式发布!新增自动混合精度训练、Windows版开发维护权移交微软

    点击上方"视学算法",选择加"星标"置顶 重磅干货,第一时间送达 本文转载自:机器之心 刚刚,Facebook 通过 PyTorch 官方博客宣布:PyTorc ...

  3. float32精度_PyTorch 1.6来了:新增自动混合精度训练、Windows版开发维护权移交微软...

    刚刚,Facebook 通过 PyTorch 官方博客宣布:PyTorch 1.6 正式发布!新版本增加了一个 amp 子模块,支持本地自动混合精度训练.Facebook 还表示,微软已扩大了对 Py ...

  4. torch.cuda.amp自动混合精度训练 —— 节省显存并加快推理速度

    torch.cuda.amp自动混合精度训练 -- 节省显存并加快推理速度 文章目录 torch.cuda.amp自动混合精度训练 -- 节省显存并加快推理速度 1.什么是amp? 2.为什么需要自动 ...

  5. 【slowfast复现 训练】训练过程 制作ava数据集 复现 SlowFast Networks for Video Recognition 训练 train

    目录 前言 一,ava相关文件准备 1.1 空间准备(500G) 1.2 整体ava文件结构 1.3 frames文件 1.4 frame_lists 文件 1.5 annotations 文件 二, ...

  6. 的训练过程_【能力模式】能力培养是一个训练过程,掌握三个要点,一个诀窍...

    人的能力是个训练的过程,这句话有多少人能懂呢?有多少人能够把这句话切实地执行呢?有多少人能够把这句话变成一种教育理念呢?我想人的能力是一个训练的过程,这句话能够完整地理解的,那你的生命中一定会变得精彩 ...

  7. Pytorch自动混合精度(AMP)训练

    相关问题:解决pytorch半精度amp训练nan问题 - 知乎 pytorch模型训练之fp16.apm.多GPU模型.梯度检查点(gradient checkpointing)显存优化等 - 知乎 ...

  8. PyTorch-混合精度训练

    简介 自动混合精度训练(auto Mixed Precision,amp)是深度学习比较流行的一个训练技巧,它可以大幅度降低训练的成本并提高训练的速度,因此在竞赛中受到了较多的关注.此前,比较流行的混 ...

  9. 混合精度训练-Pytorch

    目录 1.需求解读 2.F16和FP32的区别与联系 3.F16优点简介 4.F16缺点简介 5.混合精度训练代码实战 5.1 代码实现 5.2 代码解析 6.F16训练效果展示 7.个人总结 参考资 ...

最新文章

  1. SAP MM 物料主数据采购视图中的字段'Var. OUn'的作用?
  2. android电话拨号器
  3. ACM程序设计选修课——1030: Hungar的时尚球场(水题+耐心)
  4. visual studio 2015开发nodejs教程1搭建环境
  5. linux——脚本的练习示例二
  6. 树结构-------前缀树
  7. CSS 盒倒影 box-reflect属性
  8. 一文读懂babel编译流程,再也不怕面试官的刁难了
  9. CSDN 创始人蒋涛:选择长沙作“大本营”,打造开发者中心城市
  10. 对check list理解
  11. 思科的雾计算对物联网有何推助力?
  12. java 基础知识九 类与对象
  13. 蓝牙天线的介绍与选用
  14. Win10系统安装教程
  15. 关于丙类谐振功率放大器的工作原理
  16. 工会活动报名统计在微信里面_工会开发人员可以在索尼爱立信Xperia™PLAY上获得更多关注
  17. 计算机科学的刊物卷号,期刊的卷号和期号怎么看
  18. 项目记录——ANSYS Fluent入门翼型风洞模型计算
  19. 手机图片压缩大小的方法,用什么软件压缩
  20. esp8266烧录Html文件

热门文章

  1. 共享未授予用户在此计算机上设置家庭组,Win10系统关闭了家庭组如何共享文件?...
  2. 通讯录 app 使用哪种协议查找服务器上存储的联系人?,uniapp通讯录查找
  3. linux mysql 6.0.4 启动_MySQL Connector/J 6.x jdbc.properties 配置, mysql-connector-java-6.0.4.jar 异常...
  4. 菜刀php教程,Weevely(php菜刀)工具使用详解
  5. 城市流动劳动力的数学模型matlab,数学建模_人口预测
  6. 阿里云下mysql远程访问被拒绝_记一次MySQL数据库拒绝访问的解决过程
  7. linux下抓包工具 wireshark,网络抓包工具Wireshark的简单使用
  8. java swt designerpdf_eclipse学习笔记!(4) ----- SWT Designer 下 SWT常用组件
  9. 计算机教学改革主要内容,计算机教学改革主要内容和措施.doc
  10. 玩转SpringBoot 2.x 解析BeanPostProcessor原理篇