首页 > 其他分享 >昇腾迁移丨4个TensorFlow模型训练案例解读

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

时间:2023-11-06 11:58:55浏览次数:43  
标签:网络 案例 ReduceSum 算子 tf TensorFlow 迁移 op

本文分享自华为云社区《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

 

点击关注,第一时间了解华为云新鲜技术~

标签:网络,案例,ReduceSum,算子,tf,TensorFlow,迁移,op
From: https://www.cnblogs.com/huaweiyun/p/17812330.html

相关文章

  • sql数据库文件的迁移mdf操作方法
    http://www.pcxitongcheng.com/shujuku/MsSql/2022-11-11/32457.htmlmdf文件很特殊能接触到他的小伙伴很少,但也还是有不少会遇到关于mdf的问题,今天就给你们带来了数据库mdf文件转换为sql文件的详细方法,一起看看吧。sql数据库文件的迁移mdf:1、打开sqlserver控制台。2、选中要......
  • 全志R128应用开发案例——SPI驱动ST7789V1.3寸LCD
    SPI驱动ST7789V1.3寸LCDR128平台提供了SPIDBI的SPITFT接口,具有如下特点:SupportsDBITypeC3Line/4LineInterfaceModeSupports2DataLaneInterfaceModeSupportsdatasourcefromCPUorDMASupportsRGB111/444/565/666/888videoformatMaximumresolutio......
  • face-api基于tensorflow 的人像检测npm 包
    face-api基于tensorflow的人像检测npm包,原始项目为justadudewhohacks/face-api.js但是因为缺少维护,社区有人自己fork了一个新的vladmandic/face-api,可以更好的支持tensorflow新版本,当然很不错还可以支持基于wasm的backend(@tensorflow/tfjs-backend-wasm)参考使用demo.......
  • HDFS Distcp数据迁移与优化实践
    1.背景对于HDFS集群而言,不可避免会将一个集群中的数据迁移到另外一个集群中。一般以下几种情况需要进行迁移:hadoop2集群中的项目数据迁移到hadoop3中。hadooprbf的一个子集群block数量在2亿~3亿,需要将大项目迁移到其他空闲子集群。海外项目数据由于历史原因存放到国内集群,根......
  • Vue学习笔记4: 天气案例
    4.Vue学习笔记4:天气案例<!--准备好一个容器--><divid="root"><h2>今天天气很{{info}}</h2><!--绑定事件的时候:@xxx="yyy"yyy可以写一些简单的语句--><!--<button@click="isHot=!isHot">切换天气</button>-->......
  • Vue学习笔记1:Hello World小案例
    1.HelloWorld小案例1.1采用组件化模式,提高代码复用率、且让代码更好维护。1.2声明式编码,让编码人员无需直接操作DOM,提高开发效率。1.3学习Vue之前要掌握的Javascript基础知识ES6语法规范ES6模块化包管理器原型、原型链数组常用方法axiospromiseVSCode插件:Liv......
  • C语言小案例
    1.编写一函数intcount(),使得第一次调用时返回1,第二次调用时返回2,即返回当前的调用次数。#include<stdio.h>intcount(){staticintcounter=0;counter++;returncounter;}intmain(){printf("%d\n",count());//第一次调用,返回1printf("%d\n......
  • TensorFlow 入门 ---- 手势识别
    原文:https://www.jianshu.com/p/298d8122ca62?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation学习笔记来自于何宽大佬的学习笔记本文的相关资料来自于何宽大佬的百度云1-导入TensorFlow库importnumpyasnpimporth5pyimp......
  • python面向对象-学习笔记(八、综合案例)
    计算器,实现一些基本的操作,加减乘除运算,以及打印结果操作点击查看代码importwin32com.clientclassCaculator:#装饰器私有def__check_num_zsq(func):definner(self,n):ifnotisinstance(n,int):raiseTypeError("......
  • 【UEC++游戏案例】向上的小松饼
    一.效果与资源准备1.1游戏演示效果效果:00-课程演示_哔哩哔哩_bilibili  1.2游戏资产素材与源码素材与源码:提示信息-SiKi学院|SiKi学堂-unity|u3d|虚幻|ue4/5|java|python|人工智能|视频教程|在线课程  1.3前期准备创建无初学者内容的空项目将素材文......