混合精度
概述
混合精度为业内通用的性能提升方式,通过降低部分计算精度提升数据计算的并行度。混合精度推理方法是通过混合使用float16和float32数据类型来加速深度神经网络推理的过程,并减少内存使用和存取,从而可以推理更大的神经网络,同时又能基本保持使用float32推理所能达到的网络精度。
用户可以在脚本中通过配置“precision_mode”参数或者“precision_mode_v2”参数开启混合精度。
“precision_mode”与“precision_mode_v2”参数的详细说明可参见精度调优。
设置精度模式
下面以sess.run模式下,将“precision_mode_v2”参数配置为“mixed_float16”为例,说明如何设置混合精度模式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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_v2"].s = tf.compat.as_bytes("mixed_float16") config.graph_options.rewrite_options.remapping = RewriterConfig.OFF #关闭remap开关 with tf.Session(config=config) as sess: print(sess.run(cost)) |
修改混合精度黑白灰名单
开启自动混合精度的场景下,系统会自动根据内置的优化策略,对网络中的某些数据类型进行降精度处理,从而在精度损失很小的情况下提升系统性能并减少内存使用。
内置优化策略在“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精度。
- 若网络模型中算子没有配置该参数(灰名单),当前算子的混合精度处理机制和前一个算子保持一致,即如果前一个算子支持降精度处理,当前算子也支持降精度;如果前一个算子不允许降精度,当前算子也不支持降精度。
用户可以在内置优化策略基础上进行调整,自行指定哪些算子允许降精度,哪些算子不允许降精度。下面介绍两种方法:
- (推荐)通过modify_mixlist指定需要修改的混合精度黑白灰算子名单。
1 2 3 4 5 6 7 8 9 10 11
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_v2"].s = tf.compat.as_bytes("mixed_float16") custom_op.parameter_map["modify_mixlist"].s = tf.compat.as_bytes("/home/test/ops_info.json") 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))
ops_info.json中可以指定算子类型,多个算子使用英文逗号分隔,样例如下:
{ "black-list": { // 黑名单 "to-remove": [ // 黑名单算子转换为灰名单算子 "Xlog1py" ], "to-add": [ // 白名单或灰名单算子转换为黑名单算子 "Matmul", "Cast" ] }, "white-list": { // 白名单 "to-remove": [ // 白名单算子转换为灰名单算子 "Conv2D" ], "to-add": [ // 黑名单或灰名单算子转换为白名单算子 "Bias" ] } }
假设算子A默认在白名单中,如果您希望将该算子配置为黑名单算子,可以参考如下方法:
- (正确示例)用户将该算子添加到黑名单中:
1 2 3 4 5
{ "black-list": { "to-add": ["A"] } }
则系统会将该算子从白名单中删除,并添加到黑名单中,最终该算子在黑名单中。
- (正确示例)用户将该算子从白名单中删除,同时添加到黑名单中:
1 2 3 4 5 6 7 8
{ "black-list": { "to-add": ["A"] }, "white-list": { "to-remove": ["A"] } }
则系统会将该该算子从白名单中删除,并添加到黑名单中,最终该算子在黑名单中。
- (错误示例)用户将该算子从白名单中删除,此时算子最终是在灰名单中,而不是黑名单。
1 2 3 4 5
{ "white-list": { "to-remove": ["A"] } }
此时,系统会将该算子从白名单中删除,然后添加到灰名单中,最终该算子在灰名单中。
对于只从黑/白名单中删除,而不添加到白/黑名单的情况,系统会将该算子添加到灰名单中。
- (正确示例)用户将该算子添加到黑名单中:
- 修改算子信息库。
对内置算子信息库进行修改,可能会对其他网络造成影响,请谨慎修改。
- 切换到“/opp/built-in/op_impl/ai_core/tbe/config/<soc_version>”目录下。
- 对aic-<soc_version>-ops-info.json文件增加写权限。
chmod u+w aic-<soc_version>0-ops-info.json
当前目录下的所有json文件都会被加载到算子信息库中,如果您需要备份原来的json文件,建议备份到其他目录下。
- 修改或增加算子信息库aic-<soc_version>-ops-info.json文件中对应算子的precision_reduce字段。
父主题: 更多特性