昇腾迁移丨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]昇腾文档中心:https://www.hiascend.com/zh/document
[2]昇腾社区在线课程:https://www.hiascend.com/zh/edu/courses
[3]昇腾论坛:https://www.hiascend.com/forum
昇腾迁移丨4个TensorFlow模型训练案例解读的更多相关文章
- TensorFlow模型部署到服务器---TensorFlow2.0
前言 当一个TensorFlow模型训练出来的时候,为了投入到实际应用,所以就需要部署到服务器上.由于我本次所做的项目是一个javaweb的图像识别项目.所有我就想去寻找一下java调用Tenso ...
- ML.NET 示例:图像分类模型训练-首选API(基于原生TensorFlow迁移学习)
ML.NET 版本 API 类型 状态 应用程序类型 数据类型 场景 机器学习任务 算法 Microsoft.ML 1.5.0 动态API 最新 控制台应用程序和Web应用程序 图片文件 图像分类 基 ...
- [翻译] Tensorflow模型的保存与恢复
翻译自:http://cv-tricks.com/tensorflow-tutorial/save-restore-tensorflow-models-quick-complete-tutorial/ ...
- Tensorflow模型的格式
转载:https://cloud.tencent.com/developer/article/1009979 tensorflow模型的格式通常支持多种,主要有CheckPoint(*.ckpt).G ...
- 移动端目标识别(2)——使用TENSORFLOW LITE将TENSORFLOW模型部署到移动端(SSD)之TF Lite Developer Guide
TF Lite开发人员指南 目录: 1 选择一个模型 使用一个预训练模型 使用自己的数据集重新训练inception-V3,MovileNet 训练自己的模型 2 转换模型格式 转换tf.GraphD ...
- 一份快速完整的Tensorflow模型保存和恢复教程(译)(转载)
该文章转自https://blog.csdn.net/sinat_34474705/article/details/78995196 我在进行图像识别使用ckpt文件预测的时候,这个文章给我提供了极大 ...
- [Tensorflow]模型持久化的原理,将CKPT转为pb文件,使用pb模型预测
文章目录 [Tensorflow]模型持久化的原理,将CKPT转为pb文件,使用pb模型预测 一.模型持久化 1.持久化代码实现 convert_variables_to_constants固化模型结 ...
- 学习笔记TF049:TensorFlow 模型存储加载、队列线程、加载数据、自定义操作
生成检查点文件(chekpoint file),扩展名.ckpt,tf.train.Saver对象调用Saver.save()生成.包含权重和其他程序定义变量,不包含图结构.另一程序使用,需要重新创建 ...
- 移动端目标识别(1)——使用TensorFlow Lite将tensorflow模型部署到移动端(ssd)之TensorFlow Lite简介
平时工作就是做深度学习,但是深度学习没有落地就是比较虚,目前在移动端或嵌入式端应用的比较实际,也了解到目前主要有 caffe2,腾讯ncnn,tensorflow,因为工作用tensorflow比较多 ...
- 搭建 MobileNet-SSD 开发环境并使用 VOC 数据集训练 TensorFlow 模型
原文地址:搭建 MobileNet-SSD 开发环境并使用 VOC 数据集训练 TensorFlow 模型 0x00 环境 OS: Ubuntu 1810 x64 Anaconda: 4.6.12 P ...
随机推荐
- iptables简要介绍及使用iptables实践NAT技术
简介 iptables的文章多如牛毛,但是,我读了一些,发现虽然成体系,但是不便理解,今天就结合自己的理解,好好讲解下,另外,我们也会使用iptables来实验一个nat地址转换的demo,nat转换 ...
- DDD项目落地之充血模型实践
背景: 充血模型是DDD分层架构中实体设计的一种方案,可以使关注点聚焦于业务实现,可有效提升开发效率.提升可维护性: 1.DDD项目落地整体调用关系 调用关系图中的Entity为实体,从进入领域服务( ...
- 【go笔记】从安装到helloworld
前言 Go语言也称Golang,google出品,特点在于编程简便的同时并发性能不俗. 环境准备: Go语言版本:1.17.2.安装包下载链接:https://studygolang.com/dl l ...
- 【Azure K8S | AKS】在不丢失文件/不影响POD运行的情况下增加PVC的大小
问题描述 在前两篇文章中,创建了Disk + PV + PVC + POD 方案后,并且进入POD中增加文件. [Azure K8S | AKS]在AKS集群中创建 PVC(PersistentVol ...
- Cilium系列-16-CiliumNetworkPolicy 实战演练
系列文章 Cilium 系列文章 前言 今天我们进入 Cilium 安全相关主题, 基于 Cilium 官方的<星球大战> Demo 做详细的 CiliumNetworkPolicy 实战 ...
- Prompt Playground 7月开发记录(2): Avalonia 应用开发
Prompt Playground 7月开发记录(2): Avalonia 应用开发 仅以此文记录开发过程中遇到的问题和个人的解决方案,如若有理解偏差或者更好的解决方案,欢迎指正. 客户端的开发的确不 ...
- nlp入门(五)隐马尔科夫模型
源码请到:自然语言处理练习: 学习自然语言处理时候写的一些代码 (gitee.com) 一.马尔科夫模型概念 1.1 马尔科夫模型:具有马尔可夫性质并以随机过程为基础的模型 1.2 马尔科夫性质:过去 ...
- 分享1-3年经验的Java面试
最近的温度真是一路的飙升啊,出个门实属不易,但是还是有所收获滴,趁着今天不忙,赶紧给大家分享一波Java面经,对于想去BAT大公司的面试者来说,我这里可能不太合适,深度或许不够,但是对于刚毕业或者有1 ...
- PHP写一个 Api接口需要注意哪些?考虑哪些?
随着互联网的飞速发展,前后端分离的开发模式越来越流行.编写一个稳定.可靠和易于使用的 API 接口是现代互联网应用程序的关键.本文将介绍在使用 thinkphp6 框架开发 API 接口时需要注意的要 ...
- 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(2)
在前面随笔<循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(1)>中介绍了Mvvm 的开发,以及一些界面效果,本篇随笔继续深入探讨 ...