混合精度训练

概述

混合精度训练方法是通过混合使用float16和float32数据类型来加速深度神经网络训练的过程,并减少内存使用和存取,从而可以训练更大的神经网络。同时又能基本保持使用float32训练所能达到的网络精度。当前昇腾AI处理器支持如下几种训练精度模式,用户可以在训练脚本中设置。

昇腾AI处理器进行混合精度训练时,推荐Loss Scale,从而补偿降低精度带来的精度损失。

Estimator模式下设置精度模式

Estimator模式下,通过NPURunConfig中的precision_mode参数设置精度模式:
from npu_bridge.npu_init import *

npu_config=NPURunConfig(
  model_dir=FLAGS.model_dir,
  save_checkpoints_steps=FLAGS.save_checkpoints_steps,
  session_config=tf.ConfigProto(allow_soft_placement=True,log_device_placement=False),
  precision_mode="allow_mix_precision"
  )

sess.run模式下设置精度模式

sess.run模式下,通过session配置项precision_mode参数设置精度模式:
import tensorflow as tf
from npu_bridge.npu_init import *

config = tf.ConfigProto()

custom_op =  config.graph_options.rewrite_options.custom_optimizers.add()
custom_op.name =  "NpuOptimizer" 
custom_op.parameter_map["use_off_line"].b = True
custom_op.parameter_map["precision_mode"].s = tf.compat.as_bytes("allow_mix_precision")
config.graph_options.rewrite_options.remapping = RewriterConfig.OFF
config.graph_options.rewrite_options.memory_optimization = RewriterConfig.OFF

with tf.Session(config=config) as sess:
  print(sess.run(cost))

Keras模式下开启混合计算

与sess.run模式配置方式类似。

修改混合精度黑白灰名单

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

内置优化策略在“OPP安装目录/opp/built-in/op_impl/ai_core/tbe/config/ascend910/aic-ascend910-ops-info.json”,例如:

"Conv2D":{
    "precision_reduce":{
        "flag":"true"
},

用户可以在内置优化策略基础上进行调整,自行指定哪些算子允许降精度,哪些算子不允许降精度。下面介绍两种方法: