使能混合精度

概述

混合精度训练是在训练时混合使用单精度(float32)与半精度(float16)数据类型,将两者结合在一起,并使用相同的超参数实现了与float32几乎相同的精度。若用户使用Atlas 训练系列产品,则在迁移完成、训练开始之前,由于其架构特性限制,用户需要开启混合精度。使用float16代替float32有如下好处:

但是,混合精度训练受限于float16表达的精度范围,单纯将float32转换成float16会影响训练收敛情况。为了保证部分计算使用float16来进行加速的同时能保证训练收敛,这里推荐采用混合精度模块APEX来达到以上效果。混合精度模块APEX是一个集优化性能、精度收敛于一身的综合优化库。用户也可以选择使用PyTorch1.8.1及以上版本框架内置的AMP功能模块来使能混合精度。

更多混合精度原理介绍可参考PyTorch模型迁移和训练指南中“模型迁移与训练>自动混合精度(AMP)>概述”章节。

安装模块

混合精度模块的安装请参考CANN 软件安装指南安装开发环境>在昇腾设备上安装>安装深度学习框架>安装PyTorch章节。

特性支持

混合精度模块功能和优化描述如表1所示。

表1 混合精度模块功能

功能

开启方式举例

描述

O1配置模式

model, optimizer = amp.initialize(model, optimizer, opt_level="O1")
  • 白名单:使用Cube加速的算子,总是使用float16计算,例如Conv2d、Matmul。
  • 黑名单:对精度有要求的算子,总是使用float32计算,例如Softmax、BN。
  • 其他:按照当前输入类型运算,例如Relu,MaxPool。

O2配置模式

model, optimizer = amp.initialize(model, optimizer, opt_level="O2")

针对全网中float32数据类型的算子,按照内置优化策略,自动将部分float32的算子降低精度到float16,从而在精度损失很小的情况下提升性能并减少内存使用。

O3配置模式

model, optimizer = amp.initialize(model, optimizer, opt_level="O3")

全部算子使用float16计算。

静态Loss Scale功能

model, optimizer = amp.initialize(model, optimizer, opt_level="O2",loss_scale=128.0)

静态设置参数确保混合精度训练收敛。

动态Loss Scale功能

model, optimizer = amp.initialize(model, optimizer, opt_level="O2",loss_scale="dynamic")

动态计算Loss Scale值并判断是否溢出。

当前版本的实现方式主要为Python实现,不支持AscendCL或者CUDA优化。

使用混合精度模块

混合精度推理

按混合精度模型初始化后,正常执行模型正向计算即可。