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


    摘要:本文就带大家了解在昇腾平台上对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]昇腾论坛

     

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

  • 相关阅读:
    应广单片机跑马灯实现--阻塞式编程模式
    uniapp开发h5项目引入weixin-sdk报错wx.miniprogram undefined
    kubelet如何避免节点频繁切换“资源不足”和“资源充足”状态?
    leetcode 01.08零矩阵
    FIR 高级应用 - 多通道实验 (四个通道用一个 FIR IP,每通道用不同的系数)
    [附源码]java毕业设计高校贫困生认定系统
    基于象鼻虫损害优化算法求解装箱问题附Matlab代码
    爬虫入门基础-Selenium反爬
    【c++】简单了解运算符重载
    1、Html编程基础
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/17217726.html