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

平台,tensorflow,网络,进行,性能 · 浏览次数 : 153

小编点评

**在昇腾平台上对TensorFlow训练网络进行性能调优的常用手段** **1. 基本提升手段** * **使能自动混合精度:**降低部分计算精度以提升数据计算的并行度。 * **亲和接口替换:**替换dropout、gelu等接口以获得更高性能。 * **训练迭代循环下沉:**在Host调用一次,在Device执行多次迭代,从而减少Host与Device间的交互次数。 **2. 进阶调优** * **Profling工具采集性能数据:**分析性能瓶颈点并进行针对性的解决。 **3. AOE自动调优** * **子图调优:**在训练过程中,对子图进行优化。 * **算子调优:**在训练过程中,对算子进行优化。 * **梯度调优:**在训练过程中,对梯度进行优化。 **使用AOE工具进行调优步骤** 1. 设置环境变量`AOE_MODE`至`2`。 2. 修改训练脚本,设置`aoe_mode`参数。 3. 重新训练模型。 **其他使用约束** * **enable_data_pre_proc:**开启数据预处理下沉。 * **enable_soft_placement:**启用Soft Placeholders。 **其他参考** * 昇腾文档中心 * 昇腾社区在线课程 * 昇腾论坛

正文

摘要:本文就带大家了解在昇腾平台上对TensorFlow训练网络进行性能调优的常用手段。

本文分享自华为云社区《在昇腾平台上对TensorFlow网络进行性能调优》,作者:昇腾CANN 。

用户将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原始代码:

迁移后的代码:

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

其他使用约束,用户可参见昇腾文档中心的《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网络在昇腾平台上进行性能调优的常见手段。关于更多文档介绍,可以在昇腾文档中心查看,您也可在昇腾社区在线课程板块学习视频课程,学习过程中的任何疑问,都可以在昇腾论坛互动交流!

相关参考:

[1]昇腾文档中心

[2]昇腾社区在线课程

[3]昇腾论坛

 

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

与在昇腾平台上对TensorFlow网络进行性能调优相似的内容:

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

摘要:本文就带大家了解在昇腾平台上对TensorFlow训练网络进行性能调优的常用手段。 本文分享自华为云社区《在昇腾平台上对TensorFlow网络进行性能调优》,作者:昇腾CANN 。 用户将TensorFlow训练网络迁移到昇腾平台后,如果存在性能不达标的问题,就需要进行调优。本文就带大家了解

手把手教你在昇腾平台上搭建PyTorch训练环境

摘要:在昇腾平台上运行PyTorch业务时,需要搭建异构计算架构CANN软件开发环境,并安装PyTorch 框架,从而实现训练脚本的迁移、开发和调试。 本文分享自华为云社区《手把手教你在昇腾平台上搭建PyTorch训练环境》,作者:昇腾CANN。 PyTorch是业界流行的深度学习框架,用于开发深度

自动调优工具AOE,让你的模型在昇腾平台上高效运行

摘要:当算子性能或者网络性能不佳时,可以使用AOE进行调优。本文就带大家了解自动调优工具AOE,让你的模型在昇腾平台上高效运行。 本文分享自华为云社区《自动调优工具AOE,让你的模型在昇腾平台上高效运行》,作者:昇腾CANN 。 什么是AOE? AOE(Ascend Optimization Eng

昇腾CANN:为你开启机器人开发的Buff 加成

摘要:昇腾AI提供了全栈技术和产品,构筑人工智能的算力基座,赋能上层应用 本文分享自华为云社区《昇腾CANN:为你开启机器人开发的Buff 加成》,作者:华为云社区精选 。 昇腾AI基础软硬件平台 人类在最近1万多年的发展中,经历了农耕时代、蒸汽机时代、电力时代、互联网时代,21世纪,进入了人工智能

AI重塑千行百业,华为云发布盘古大模型3.0和昇腾AI云服务

【中国,东莞,2023年7月7日】华为开发者大会2023(Cloud)7月7日在中国东莞正式揭开帷幕,并同时在全球10余个国家、中国30多个城市设有分会场,邀请全球开发者共聚一堂,就AI浪潮之下的产业新机会和技术新实践开展交流分享。 在7日下午举行的大会主题演讲中,华为常务董事、华为云CEO张平安重

昇腾携手OpenMMLab,支持海量算法仓库的昇腾AI推理部署

摘要:近日,昇腾AI联合上海人工智能实验室,正式实现OpenMMLab算法仓库在昇腾的异构计算架构CANN上的推理部署,目前相关代码已推入MMDeploy 0.10.0版本,并在GitHub正式发布。 本文分享自华为云社区《昇腾携手OpenMMLab,支持海量算法仓库的昇腾AI推理部署》,作者:昇腾

体验昇腾Ascend C 编程语言极简易用的算子开发

摘要:昇腾Ascend C编程语言,让基于昇腾AI的算法创新更加简单。 本文分享自华为云社区《CANN黑科技解密|昇腾Ascend C编程语言 — 极简易用的算子开发体验》,作者:昇腾CANN 。 AI应用的大脑是神经网络,而构成神经网络的基石是一个个算子。为了让开发者的网络在昇腾硬件上高效运行,昇

纯干货!一文get昇腾Ascend C编程入门全部知识点

一文get昇腾Ascend C编程入门全部知识点,只需要了解C++编程、理解对列通信与内存申请释放机制、通过调用相应的计算接口与搬运接口,就可以高效写出运行在昇腾AI处理器上的高性能算子。

又一重要进展发布!OpenMMLab算法仓支持昇腾AI训练加速

摘要:上海人工智能实验室的浦视开源算法体系(OpenMMLab)团队基于昇腾AI发布了MMDeploy 0.10.0版本,该版本已支持OpenMMLab算法仓库在昇腾异构计算架构CANN上的推理部署。 本文分享自华为云社区《又一重要进展发布!OpenMMLab算法仓支持昇腾AI训练加速》,作者:昇腾

一文教你如何调用Ascend C算子

本文分享自华为云社区《一文教你如何调用Ascend C算子》,作者: 昇腾CANN。 Ascend C是CANN针对算子开发场景推出的编程语言,原生支持C和C++标准规范,兼具开发效率和运行性能。基于Ascend C编写的算子程序,通过编译器编译和运行时调度,运行在昇腾AI处理器上。使用Ascend