混合精度训练

混合精度简介

混合精度为业内通用的性能提升方式,通过降低部分计算精度提升数据计算的并行度。混合精度训练方法是通过混合使用float16和float32数据类型来加速深度神经网络训练的过程,并减少内存使用和存取,从而可以训练更大的神经网络,同时又能基本保持使用float32训练所能达到的网络精度。

用户可以在脚本中通过配置“precision_mode”参数或者“precision_mode_v2”参数开启混合精度。

“precision_mode”与“precision_mode_v2”参数的详细说明可参见精度调优

开启“自动混合精度”的场景下,推荐使用LossScale优化器(LossScale优化器的迁移请参见替换LossScaleOptimizer),从而补偿降低精度带来的精度损失;若后续进行Profiling数据进行分析时,发现需要手工调整某些算子的精度模式,可以参考修改混合精度黑白名单自行指定哪些算子允许降精度,哪些算子不允许降精度。

精度模式设置

下面以将“precision_mode_v2”参数配置为“mixed_float16”为例,说明如何设置混合精度模式。

修改训练脚本,在初始化NPU设备前通过添加精度调优中的“precision_mode_v2”参数设置精度模式。

1
2
3
import npu_device as npu
npu.global_options().precision_mode_v2 = 'mixed_float16'  # 开启自动混合精度功能,表示混合使用float16和float32数据类型来处理神经网络的过程
npu.open().as_default()

修改混合精度黑白名单

开启自动混合精度的场景下,系统会自动根据内置的优化策略,对网络中的某些数据类型进行降精度处理,从而在精度损失很小的情况下提升系统性能并减少内存使用。

内置优化策略在“OPP安装目录/opp/built-in/op_impl/ai_core/tbe/config/<soc_version>/aic-<soc_version>-ops-info.json”,例如:
1
2
3
4
"Conv2D":{
    "precision_reduce":{
        "flag":"true"
},
  • precision_mode_v2配置为mixed_float16,precision_mode配置为allow_mix_precision_fp16/allow_mix_precision的场景:
    • 若取值为true(白名单),则表示允许将当前float32类型的算子,降低精度到float16。
    • 若取值为false(黑名单),则不允许将当前float32类型的算子降低精度到float16,相应算子仍使用float32精度。
    • 若网络模型中算子没有配置该参数(灰名单),当前算子的混合精度处理机制和前一个算子保持一致,即如果前一个算子支持降精度处理,当前算子也支持降精度;如果前一个算子不允许降精度,当前算子也不支持降精度。
  • precision_mode配置为allow_mix_precision_bf16的场景(仅在Atlas A2 训练系列产品上支持此配置):
    • 若取值为true(白名单),则表示允许将当前float32类型的算子,降低精度到bfloat16。
    • 若取值为false(黑名单),则不允许将当前float32类型的算子降低精度到bfloat16,相应算子仍旧使用float32精度。
    • 若网络模型中算子没有配置该参数(灰名单),当前算子的混合精度处理机制和前一个算子保持一致,即如果前一个算子支持降精度处理,当前算子也支持降精度;如果前一个算子不允许降精度,当前算子也不支持降精度。

用户可以在内置优化策略基础上进行调整,自行指定哪些算子允许降精度,哪些算子不允许降精度。