gpt4 book ai didi

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

转载 作者:我是一只小鸟 更新时间:2023-03-15 14:31:53 26 4
gpt4 key购买 nike

摘要: 本文就带大家了解在昇腾平台上对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网络进行性能调优的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com