评分并提供意见反馈 :
华为采用机器翻译与人工审校相结合的方式将此文档翻译成不同语言,希望能帮助您更容易理解此文档的内容。 请注意:即使是最好的机器翻译,其准确度也不及专业翻译人员的水平。 华为对于翻译的准确性不承担任何责任,并建议您参考英文文档(已提供链接)。
混合精度
概述
混合精度推理方法是通过混合使用float16和float32数据类型来加速深度神经网络推理的过程,并减少内存使用和存取,从而可以推理更大的神经网络。同时又能基本保持使用float32推理所能达到的网络精度。当前昇腾AI处理器支持如下几种推理精度模式,用户可以在推理脚本中设置。
- allow_fp32_to_fp16:当算子不支持float32数据类型时,直接降低精度到float16。当前不支持float32类型的算子都是卷积类算子,例如Conv2D、DepthwiseConv2D等,此类算子对精度不敏感,因此不会造成整网精度下降。
- force_fp16:当算子既支持float16又支持float32数据类型时,强制选择float16。默认情况下系统使用此种方式。在线推理场景下,推荐使用该配置项。
- must_keep_origin_dtype:保持原图精度。此种方式下,如果整网中有Conv2D算子,由于该算子仅支持float16类型,在原图输入是float32类型的情况下,推理会报错中止。
- allow_mix_precision:自动混合精度。可以针对全网中float32数据类型的算子,按照内置的优化策略,自动将部分float32的算子降低精度到float16,从而在精度损失很小的情况下提升系统性能并减少内存使用。但需要注意的是:当前昇腾AI处理器仅支持float32到float16的精度调整。
sess.run模式下设置精度模式
sess.run模式下,通过session配置项precision_mode参数设置精度模式:
import tensorflow as tf from npu_bridge.estimator import npu_ops from tensorflow.core.protobuf.rewriter_config_pb2 import RewriterConfig 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("force_fp16") config.graph_options.rewrite_options.remapping = RewriterConfig.OFF # 关闭remap开关 with tf.Session(config=config) as sess: print(sess.run(cost))
allow_mix_precision模式下,用户可以在内置优化策略基础上进行调整,自行指定哪些算子允许降精度,哪些算子不允许降精度。
- 切换到“OPP安装目录/opp/op_impl/built-in/ai_core/tbe/config/ascend310”目录下。
- 对aic-ascend310-ops-info.json文件增加写权限。
chmod u+w aic-ascend310-ops-info.json
- 修改或增加算子信息库aic-ascend310-ops-info.json文件中对应算子的precision_reduce字段:
"precision_reduce":{ "flag":"true" }
- true:允许将当前float32类型的算子,降低精度到float16。
- false:不允许将当前float32类型的算子,降低精度到float16。
- 不配置:当前算子的混合精度处理机制和前一个算子保持一致,即如果前一个算子支持降精度处理,当前算子也支持降精度;如果前一个算子不允许降精度,当前算子也不支持降精度。