---
title: TensorFlow模型训练常见案例-官方技术文章-昇腾社区
description: 基于TensorFlow的Python API开发的训练脚本默认运行在CPU/GPU/TPU上，为了使这些脚本能够利用昇腾AI处理器的强大算力，需要将其迁移到昇腾平台。
keywords: TensorFlow,模型训练常见,案例,官方技术文章,昇腾社区,数据预处理中,存在资源类算,导致训练异常
url: https://www.hiascend.com/developer/techArticles/20231106-1
section: (其他)
---

# TensorFlow模型训练常见案例-官方技术文章-昇腾社区

URL: https://www.hiascend.com/developer/techArticles/20231106-1
描述: 基于TensorFlow的Python API开发的训练脚本默认运行在CPU/GPU/TPU上，为了使这些脚本能够利用昇腾AI处理器的强大算力，需要将其迁移到昇腾平台。
关键词: TensorFlow,模型训练常见,案例,官方技术文章,昇腾社区,数据预处理中,存在资源类算,导致训练异常

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

TensorFlow模型训练常见案例

TensorFlow模型训练常见案例

昇腾CANNTensorFlow

发表于: 2023/11/06

938

2

本期分享几个TensorFlow网络迁移到昇腾平台后执行失败或者执行性能差的典型案例，并给出原因分析及解决方法。

# 01 数据预处理中存在资源类算子，导致训练异常

## 问题现象

TensorFlow网络执行时，报如下错误：

```
[2021-03-19 13:50:24.895266: W tensorflow/core/framework/op_kernel.cc:1651] OP_REQUIRES failed at lookup_table_op.cc:809 : Failed precondition: Table not initialized.
[2021-03-19 13:50:24.895283: W tensorflow/core/framework/op_kernel.cc:1651] OP_REQUIRES failed at lookup_table_op.cc:809 : Failed precondition: Table not initialized.

```

## 原因分析

初始化图中存在资源类算子HaskTableV2 ，数据预处理中存在资源类算子LookupTableFindV2，两个算子需要配对使用。昇腾AI处理器默认采用计算全下沉模式，即所有的计算类算子（包括初始化图中的资源类算子）全部在Device侧执行，数据预处理仍在Host执行。这样数据预处理中的LookupTableFindV2算子与初始化图中的HaskTableV2算子未在同一设备执行，导致网络运行出错。

## 解决方案

需要修改训练脚本，使能混合计算能力，将资源类算子的初始化图也留在Host侧执行，训练脚本修改方法如下：

```
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["mix_compile_mode"].b =  True
config.graph_options.rewrite_options.remapping = RewriterConfig.OFF
config.graph_options.rewrite_options.memory_optimization = RewriterConfig.OFF
with tf.Session(config=config) as sess:
    sess.run(...)

```

其中配置参数“mix_compile_mode”是混合计算开启开关，当此开关配置为“True”后，会将需要成对使用的资源类算子留在前端框架在线执行。补充说明：当用户的预处理脚本中存在需要成对使用的tf.contrib.lookup下Table类的API时，需要参考此方法使能混合计算功能，将初始化图中的对应算子留在Host侧执行。

# 02 数据预处理中存在tf.Variable，导致训练异常

## 问题现象

TensorFlow网络执行时，报如下错误：

tensorflow.python.framework.errors_impl.FailedPreconditionError:Error while
reading resource variable inference/embed_continuous from Container: localhost.This could mean that the variable was uninitialized. Not found: Resource
localhost/inference/embed_continuous/N10tensorflow3VarE does not exist.

## 原因分析

此问题是由于数据预处理脚本中存在tf.Variable变量。训练脚本在昇腾平台运行时，tf.Variable变量在Host侧执行，而tf.Variable变量的初始化在Device侧执行，变量执行和变量初始化不在同一设备执行，导致训练异常。使用了tf.Variable的训练脚本代码示例如下：

```
batch_size = tf.Variable(
tf.placeholder(tf.int64, [], 'batch_size'),
trainable= False, collections=[]
)
train_dataset = train_dataset.batch(batch_size, drop_remainder=True)

```

## 解决方案

需要修改训练脚本，将tf.Variable修改成常量，修改示例如下：

```
batch_size = 64
train_dataset = train_dataset.batch(batch_size, drop_remainder=True)

```

# 03 动态shape网络执行时报v1控制流算子不支持的错误

## 问题现象

TensorFlow 1.15版本的动态shape网络执行时，报如下错误：

node node_name(node_type) is v1 control operator, which is not
supported, please convert to v2 control operator

## 原因分析

由于当前TensorFlow网络为动态shape网络，且存在V1版本的控制流算子。在昇腾AI处理器执行TensorFlow动态shape网络当前不支持V1版本的控制流算子，所以会造成网络运行失败。

## 解决方案

将网络中的TensorFlow V1版本的控制流算子转换为V2版本，即可解决此问题。方法一：通过设置如下环境变量将TensorFlow V1版本的控制流算子转换为V2版本。

```
export ENABLE_FORCE_V2_CONTROL=1
```

方法二：修改网络脚本，在import tensorflow as tf后增加如下两条指令，将TensorFlow V1版本的控制流算子转换为V2版本。

```
tf.enable_control_flow_v2()
tf.enable_resource_variables()

```

# 04 网络调测时ReduceSum算子执行性能差

## 问题现象

网络调测时，网络整体性能较慢。通过Profiling工具获取网络的Profiling数据，并进行算子的性能数据分析，发现ReduceSum算子的性能很差。查看Profiling性能数据中ReduceSum算子的详细信息，关键字段如下表蓝色字体所示：

| op_type | block_dim | input_shape | input_data_type | input_formats |
| --- | --- | --- | --- | ---|
| ReduceSum | 1 | 1,256,256,3 | DT_FLOAT16 | NHWC |

ReduceSum算子的输入数据类型（input_data_type）为“DT_FLOAT16”，block_dim字段的值为“1”，说明该算子未开启多核并行计算。

## 原因分析

针对昇腾AI处理器的ReduceSum算子，若输入数据类型为float16，由于硬件限制，某些场景下会无法开启多核计算。

## 解决方案

ReduceSum算子输入数据是float16的情况可能有如下两种场景：场景一：网络调测时未开启混合精度，ReduceSum算子的输入数据本身就是float16类型，此种情况下，若ReduceSum算子的性能较差，可尝试在ReduceSum算子前插入一个Cast算子，将算子的输入数据类型从float16转换为float32。ReduceSum算子在输入类型为float32的场景下，会使能多核并发计算，从而达到提升该算子性能的效果。场景二：网络调测时开启了混合精度，将ReduceSum算子的输入数据类型从float32转换成了float16，此种情况下，可将ReduceSum算子加入混合精度黑名单，这样网络调测时ReduceSum算子就不会被转换成float16类型，从而避免该算子性能的劣化。将ReduceSum算子加入混合精度黑名单的方法如下：1）	修改网络脚本，通过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")

```

2）	在ops_info.json文件中进行算子黑名单的配置，配置示例如下：

```
{
"black-list": {
"to-add": ["ReduceSumD"]
}
}

```

补充说明：仅在ReduceSum算子性能较差时，且符合本案例中的问题现象时，可尝试使用此方法进行性能提升。

# 05 更多介绍

[1]昇腾文档中心：https://www.hiascend.com/zh/document [了解详情](https://www.hiascend.com/zh/document)[2]昇腾社区在线课程：https://www.hiascend.com/zh/edu/courses [了解详情](https://www.hiascend.com/zh/edu/courses)[3]昇腾论坛：https://www.hiascend.com/forum [了解详情](https://www.hiascend.com/forum)

点赞 2

本页内容

01 数据预处理中存在资源类算子，导致训练异常 [了解详情](https://www.hiascend.com/#id-1)

问题现象 [了解详情](https://www.hiascend.com/#id-2)

原因分析 [了解详情](https://www.hiascend.com/#id-3)

解决方案 [了解详情](https://www.hiascend.com/#id-4)

02 数据预处理中存在tf.Variable，导致训练异常 [了解详情](https://www.hiascend.com/#id-5)

问题现象 [了解详情](https://www.hiascend.com/#id-6)

原因分析 [了解详情](https://www.hiascend.com/#id-7)

解决方案 [了解详情](https://www.hiascend.com/#id-8)

[了解详情](https://www.hiascend.com/#id-9)

03 动态shape网络执行时报v1控制流算子不支持的错误 [了解详情](https://www.hiascend.com/#id-10)

问题现象 [了解详情](https://www.hiascend.com/#id-11)

原因分析 [了解详情](https://www.hiascend.com/#id-12)

解决方案 [了解详情](https://www.hiascend.com/#id-13)

[了解详情](https://www.hiascend.com/#id-14)

04 网络调测时ReduceSum算子执行性能差 [了解详情](https://www.hiascend.com/#id-15)

问题现象 [了解详情](https://www.hiascend.com/#id-16)

原因分析 [了解详情](https://www.hiascend.com/#id-17)

解决方案 [了解详情](https://www.hiascend.com/#id-18)

05 更多介绍 [了解详情](https://www.hiascend.com/#id-19)
