网络调测时ReduceSum算子性能差如何处理
2023/05/06
123
问题信息
问题来源 | 产品大类 | 关键字 |
---|---|---|
官方 | 算子开发 | (必填项)(关键字之间请用英文分号隔开) |
问题现象描述
网络调测时,网络整体性能较慢。通过性能分析工具获取网络的Profiling数据(工具的使用方法可参见对应版本的《性能分析工具使用指南》,并进行算子的性能数据分析,发现ReduceSum算子的性能很差。
查看Profiling性能数据中ReduceSum算子的详细信息,如下图所示:
其中,ReduceSum算子的输入数据类型(input_data_type)为“DT_FLOAT16”,block_dim字段的值为“1”,说明该算子未开启多核并行计算。
原因分析
对于昇腾AI处理器的ReduceSum算子或者是用户自定义实现的调用了TBE DSL的”reduce_sum”接口的算子,若输入的数据类型为float16,由于硬件限制,某些场景下会无法开启多核计算。
解决措施
仅在ReduceSum算子性能较差时,且符合现象描述时,可尝试使用以下解决方案进行性能提升。
以ReduceSum算子为例,输入数据是float16的情况可能有如下两种场景:
- 场景一:网络调测时未开启混合精度,ReduceSum算子的输入数据本身就是float16类型,此种情况下,若ReduceSum算子的性能较差,可尝试在ReduceSum算子前插入一个Cast算子,将算子的输入数据类型从float16转换为float32。
- 场景二:网络调测时开启了混合精度,将ReduceSum算子的输入数据类型从float32转换成了float16,此种情况下,可将ReduceSum算子加入混合精度黑名单,这样网络调测时ReduceSum算子就不会被转换成float16类型,从而避免该算子性能的劣化。
- 通过modify_mixlist指定需要修改的混合精度算子黑名单。
# Estimator模式修改方法 npu_config=NPURunConfig( ... precision_mode="allow_mix_precision", modify_mixlist="/home/test/ops_info.json" ) # sess.run模式修改方法 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") custom_op.parameter_map["modify_mixlist"].s = tf.compat.as_bytes("/home/test/ops_info.json") ...
- 在ops_info.json文件中进行算子黑名单的配置,配置示例如下:
{ "black-list": { "to-add": ["ReduceSumD"] } }
详细配置方法可参见对应版本《TensorFlow 1.15网络模型迁移和训练指南》的“性能调优 > 基本调优 > 混合精度训练”章节。
- 通过modify_mixlist指定需要修改的混合精度算子黑名单。
本页内容