昇腾迁移丨4个TensorFlow模型训练案例解读

本文分享自华为云社区《TensorFlow模型训练常见案例》,作者: 昇腾CANN。

基于TensorFlow的Python API开发的训练脚本默认运行在CPU/GPU/TPU上,为了使这些脚本能够利用昇腾AI处理器的强大算力,需要将其迁移到昇腾平台。

本期分享几个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)

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\]昇腾文档中心: \[2\]昇腾社区在线课程: \[3\]昇腾论坛: [点击关注,第一时间了解华为云新鲜技术\~](https://bbs.huaweicloud.com/blogs?utm_source=cnblog&utm_medium=bbs-ex&utm_campaign=other&utm_content=content)

相关推荐
小鸡吃米…5 天前
基于 TensorFlow 的图像识别
人工智能·python·tensorflow
小鸡吃米…5 天前
TensorFlow - 构建计算图
人工智能·python·tensorflow
A懿轩A6 天前
【2026 最新】TensorFlow 安装配置详细指南 同时讲解安装CPU和GPU版本 小白也能轻松上手!逐步带图超详细展示(Windows 版)
人工智能·windows·python·深度学习·tensorflow
小鸡吃米…6 天前
TensorFlow 实现异或(XOR)运算
人工智能·python·tensorflow·neo4j
小鸡吃米…7 天前
TensorFlow 实现梯度下降优化
人工智能·python·tensorflow·neo4j
甄心爱学习7 天前
【LR逻辑回归】原理以及tensorflow实现
算法·tensorflow·逻辑回归
小鸡吃米…7 天前
TensorFlow 实现多层感知机学习
人工智能·python·tensorflow
小鸡吃米…8 天前
TensorFlow 优化器
人工智能·python·tensorflow
小鸡吃米…8 天前
TensorFlow 模型导出
python·tensorflow·neo4j
Jonathan Star10 天前
Ant Design (antd) Form 组件中必填项的星号(*)从标签左侧移到右侧
人工智能·python·tensorflow