---
title: 在昇腾平台上对TensorFlow网络进行性能调优-官方技术文章-昇腾社区
description: 用户将TensorFlow训练网络迁移到昇腾平台后，如果存在性能不达标的问题，就需要进行调优。本文就带大家了解在昇腾平台上对TensorFlow训练网络进行性能调优的常用手段。
keywords: TensorFlow,在昇腾平台上,网络进行性能,调优,官方技术文章,昇腾社区,使能自动混合精度,亲和接口替换
url: https://www.hiascend.com/developer/techArticles/20230321-4
section: (其他)
---

# 在昇腾平台上对TensorFlow网络进行性能调优-官方技术文章-昇腾社区

URL: https://www.hiascend.com/developer/techArticles/20230321-4
描述: 用户将TensorFlow训练网络迁移到昇腾平台后，如果存在性能不达标的问题，就需要进行调优。本文就带大家了解在昇腾平台上对TensorFlow训练网络进行性能调优的常用手段。
关键词: TensorFlow,在昇腾平台上,网络进行性能,调优,官方技术文章,昇腾社区,使能自动混合精度,亲和接口替换

官方技术文章 [了解详情](https://www.hiascend.com/zh/developer/techArticles)

在昇腾平台上对TensorFlow网络进行性能调优

在昇腾平台上对TensorFlow网络进行性能调优

昇腾CANNTensorFlow

发表于: 2023/03/21

515

3

用户将TensorFlow训练网络迁移到昇腾平台后，如果存在性能不达标的问题，就需要进行调优。本文就带大家了解在昇腾平台上对TensorFlow训练网络进行性能调优的常用手段。

首先了解下性能调优的全流程：

当TensorFlow训练网络性能不达标时，首先可尝试昇腾平台提供的“三板斧”操作，即上图中的“基本提升手段”：使能自动混合精度 > 进行亲和接口的替换 > 使能训练迭代循环下沉 > 使用AOE工具进行调优。

基本调优操作完成后，需要再次执行模型训练并评估性能，如果性能达标了，调优即可结束；如果未达标，需要使用Profling工具采集详细的性能数据进一步分析，从而找到性能瓶颈点，并进一步针对性的解决，这部分调优操作需要用户有一定的经验，难度相对较大，我们将这部分调优操作称为进阶调优。

本文主要带大家详细了解基本调优操作，即上图中的灰色底纹部分。

# 使能自动混合精度

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

Ascend平台提供了“precision_mode”参数用于配置网络的精度模式，用户可以在训练脚本的运行配置中添加此参数，并将取值配置为“allow_mix_precision”，从而使能自动混合精度，下面以手工迁移的训练脚本为例，介绍配置方法。

- Estimator模式下，在NPURunConfig中添加precision_mode参数设置精度模式：

```
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模式下，通过session配置项precision_mode设置精度模式：

```
config = tf.ConfigProto(allow_soft_placement=True)
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")
…
with tf.Session(config=config) as sess:
  print(sess.run(cost))
```

# 亲和接口替换

针对TensorFlow训练网络中的dropout、gelu接口，Ascend平台提供了硬件亲和的替换接口，从而使网络获得更优性能。

- 对于训练脚本中的nn.dropout，建议替换为Ascend对应的API实现，以获得更优性能：

```
layers = npu_ops.dropout()
```

- 若训练脚本中存在layers.dropout、tf.layers.Dropout、tf.keras.layers.Dropout、tf.keras.layers.SpatialDropout1D、tf.keras.layers.SpatialDropout2D、tf.keras.layers.SpatialDropout3D接口，建议增加头文件引用：

```
from npu_bridge.estimator.npu import npu_convert_dropout
```

- 对于训练脚本中的gelu接口，建议替换为Ascend提供的gelu接口，以获得更优性能。

例如，TensorFlow原始代码：

```
def gelu(x): 
  cdf = 0.5 * (1.0 + tf.tanh(
     (np.sqrt(2 / np.pi) * (x + 0.044715 * tf.pow(x, 3))))) 
  return x*cdf
layers = gelu()
```

迁移后的代码：

```
from npu_bridge.estimator.npu_unary_ops import npu_unary_ops
layers = npu_unary_ops.gelu(x)
```

# 训练迭代循环下沉

训练迭代循环下沉是指在Host调用一次，在Device执行多次迭代，从而减少Host与Device间的交互次数，缩短训练时长。用户可通过iterations_per_loop参数指定训练迭代的次数，该参数取值大于1即可使能训练迭代循环下沉的特性。

使用该特性时，要求训练脚本使用TF Dataset方式读数据，并开启数据预处理下沉，即enable_data_pre_proc开关配置为True，例如sess.run配置示例如下：

```
custom_op.parameter_map["enable_data_pre_proc"].b = True
```

其他使用约束，用户可参见昇腾文档中心 [了解详情](https://www.hiascend.com/zh/document)的《TensorFlow模型迁移和训练指南》。

Estimator模式下，通过NPURunConfig中的iterations_per_loop参数配置训练迭代循环下沉的示例如下：

```
session_config=tf.ConfigProto(allow_soft_placement=True)
config = NPURunConfig(session_config=session_config, iterations_per_loop=10)
```

# AOE自动调优

昇腾平台提供了AOE自动调优工具，可对网络进行子图调优、算子调优与梯度调优，生成最优调度策略，并将最优调度策略固化到知识库。模型再次训练时，无需开启调优，即可享受知识库带来的收益。

建议按照如下顺序使用AOE工具进行调优：

训练场景下使能AOE调优有两种方式：

- 通过设置环境变量启动AOE调优。

```
# 1：子图调优  
# 2：算子调优   
# 4：梯度调优
export AOE_MODE=2
```

- 修改训练脚本，通过“aoe_mode”参数指定调优模式，例如：

sess.run模式，训练脚本修改方法如下：

```
custom_op.parameter_map["aoe_mode"].s = tf.compat.as_bytes("2")
```

estimator模式下，训练脚本修改方法如下：

```
config = NPURunConfig(
    session_config=session_config, 
    aoe_mode=2)
```

以上就是TensorFlow网络在昇腾平台上进行性能调优的常见手段。关于更多文档介绍，可以在昇腾文档中心 [了解详情](https://www.hiascend.com/zh/document)查看，您也可在昇腾社区在线课程 [了解详情](https://www.hiascend.com/zh/edu/courses)板块学习视频课程，学习过程中的任何疑问，都可以在昇腾论坛 [了解详情](https://www.hiascend.com/forum)互动交流！

# 相关参考：

[1]昇腾文档中心 [了解详情](https://www.hiascend.com/zh/document)

[2]昇腾社区在线课程 [了解详情](https://www.hiascend.com/zh/edu/courses)

[3]昇腾论坛 [了解详情](https://www.hiascend.com/forum)

点赞 3

本页内容

使能自动混合精度 [了解详情](https://www.hiascend.com/#id-1)

亲和接口替换 [了解详情](https://www.hiascend.com/#id-2)

训练迭代循环下沉 [了解详情](https://www.hiascend.com/#id-3)

AOE自动调优 [了解详情](https://www.hiascend.com/#id-4)

相关参考： [了解详情](https://www.hiascend.com/#id-5)
