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

举报
昇腾CANN 发表于 2023/03/14 17:21:58 2023/03/14
【摘要】 用户将TensorFlow训练网络迁移到昇腾平台后,如果存在性能不达标的问题,就需要进行调优。本文就带大家了解在昇腾平台上对TensorFlow训练网络进行性能调优的常用手段。

用户将TensorFlow训练网络迁移到昇腾平台后,如果存在性能不达标的问题,就需要进行调优。本文就带大家了解在昇腾平台上对TensorFlow训练网络进行性能调优的常用手段。

首先了解下性能调优的全流程:


01.PNG


TensorFlow训练网络性能不达标时,首先可尝试昇腾平台提供的三板斧操作,即上图中的基本提升手段:使能自动混合精度 > 进行亲和接口的替换 > 使能训练迭代循环下沉 > 使用AOE工具进行调优。

基本调优操作完成后,需要再次执行模型训练并评估性能,如果性能达标了,调优即可结束如果未达标,需要使用Profling工具采集详细的性能数据进一步分析,从而找到性能瓶颈点,并进一步针对性的解决,这部分调优操作需要用户有一定的经验,难度相对较大,我们将这部分调优操作称为进阶调优。

本文主要带大家详细了解基本调优操作,即上图中的灰色底纹部分。

使能自动混合精度

混合精度是业内通用的性能提升方式,通过降低部分计算精度提升数据计算的并行度。混合计算训练方法通过混合使用float16float32数据类型来加速深度神经网络的训练过程,并减少内存使用和存取,从而可以提升训练网络性能,同时又能基本保证使用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训练网络中的dropoutgelu接口,Ascend平台提供了硬件亲和的替换接口,从而使网络获得更优性能。

  • 对于训练脚本中的nn.dropout,建议替换为Ascend对应的API实现,以获得更优性能:
    layers = npu_ops.dropout()


  • 若训练脚本中存在layers.dropouttf.layers.Dropouttf.keras.layers.Dropouttf.keras.layers.SpatialDropout1Dtf.keras.layers.SpatialDropout2Dtf.keras.layers.SpatialDropout3D接口,建议增加头文件引用:
    from npu_bridge.estimator.npu import npu_convert_dropout
  • 对于训练脚本中的gelu接口,建议替换为Ascend提供的gelu接口,以获得更优性能。

   例如,TensorFlow原始代码: 

def gelu(x): 
  cdf = 0.5 * (1.0 + tf.tanh(
     (np.sqrt(2 / np.pi) * (x + 0.044715 * tf.pow(x, 3))))) 
  return x*cdf
layers = gelu()

   迁移后的代码:

from npu_bridge.estimator.npu_unary_ops import npu_unary_ops
layers = npu_unary_ops.gelu(x)

训练迭代循环下沉

训练迭代循环下沉是指在Host调用一次,在Device执行多次迭代,从而减少HostDevice间的交互次数,缩短训练时长。用户可通过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工具进行调优:

 

02.PNG

训练场景下使能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]昇腾论坛

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。