【2023 · CANN训练营第一季】晟腾AI入门课(TensorFlow) 第二章 TensorFlow模型迁移&训练(上)

本文介绍了如何利用CANN将TensorFlow模型迁移到华为的晟腾AI处理器上进行训练,包括自动和手动迁移方法,强调了模型在GPU/CPU上跑通的必要性,以及在迁移过程中需要注意的API支持度和限制条件。同时,文章提供了迁移工具的使用步骤和报告解析,以及Estimator和SessionRun的迁移要点。
摘要由CSDN通过智能技术生成

本章学习目标

  • 了解异构计算架构CANN在神经网络训练中发挥的主要作用。
  • 掌握如何基于CANN将TensorFlow模型迁移到晟腾AI处理器上。
  • 掌握如何在晟腾AI处理器上进行模型训练,感受晟腾AI的极致性能。
  • 掌握如何查看训练日志和训练结果,具备基本的问题定界、定位能力。

AI模型开发基础知识入门

具备Python编程经验

示例代码、联系涉及Python语言的如下基础知识,建议在学习前先学习这部分的内容:

  • 使用位置和关键字参数定义和调用函数
  • 字典、列表、集合(创建、访问、和迭代)
  • for循环,for具有多个迭代器遍历的循环(例如,for a,b in [(1,2),(3,4)])
  • if/else条件块和条件表达式
  • 字符串格式(例如,‘%.2f’ % 3.14)
  • 变量、赋值、基本数据类型(int、float、bool、str等)

了解深度学习和神经网络

为了让计算机掌握人类理解的知识,需要构建一个由简单概念组成的多层链接网络来点定义复杂对象,计算机通过对这个网络的迭代计算与训练后,可以掌握这个对象的特征,一般称这种方法为深度学习(Deeplearning,DL)。
互联网的发展产生了庞大的数据量,为深度学习的发展提供了更大的机会,也让人工智能成为当今的热点,而深度神经网络成了热点中的热点。深度学习经过一系列的发展之后,展现出巨大的应用价值,不断受到工业界、学术界的密切关注。深度学习在图像、语言、自然语言处理、大数据特征提取和广告点击率预估方面取得明细进展。
关于深度学习的基本原理、基本概念等介绍,可以点击

了解TensorFlow AI框架

本课程用于将基于TensorFlow的PythonAPI开发的训练脚本,将模型迁移到晟腾AI处理器Soc上执行训练,因此需要了解TensorFlow框架。具体可以参考

了解基于CANN的模型开发流程

晟腾910 AI处理器是华为在2019年发布的人工智能(AI)专用的神经网络处理器。当前业界大多数训练脚本基于TensorFlow的Python API开发,默认运行在CPI/GPU/TPU上,为了使其能够利用晟腾910 AI 处理器的澎湃算力执行训练,提升训练性能,我们需要基于CANN对TensorFlow模型进行适配和训练,以下是就与CANN的模型开发流程:LINK
在这里插入图片描述

了解遇到问题如何求助

模型调试和调优过程中,不知道该怎么解决,或者有优化建议需要反馈,可以借助以下渠道:

  • 在华为方集中组织培训的场景下,可求助培训或对应课程的接口人。
  • 开发者自学的场景下:
    • 可在ModelZoo仓上提Issue,该仓的接口人会定期处理问题。
    • 可在晟腾社区论坛中查阅经验帖、或者发帖,论坛的接口人会定期处理问题。

TensorFlow模型迁移详解

为什么要做模型迁移

目前人工智能领域内,AI算法模型搭建方面的技艺已经是炉火纯青,市面上用于AI模型搭建的深度学习框架,处理华为开源的昇思MindSpore,还有Google的TensorFlow、Facebook的Pytorch、Caffe等。
除了昇思MindSpore外,TensorFlow等其他深度学习框架下的模型并不能直接在晟腾910 AI处理器上训练,为了使其充分利用晟腾910 AI处理器的澎湃算力来提升训练性能,我们需要借助异构计算架构CANN的Plugin适配层转换,使转换后的模型能够高效运行在晟腾 910 AI处理器上。
目前,CANN已经能够支持多种主流AI框架,包括昇思MindSpore、TensorFlow、PyTorch、飞桨、ONNX等,并且开发者只需要非常少的改动,即可快速搞定算法一直,大大减少切换平台的代价。
官网迁移文档

了解两种模型迁移方式

将TensorFlow网络模型迁移到晟腾AI处理器执行训练,主要有两种方式:

  • 自动迁移方式。通过迁移工具对原始脚本进行AST语法树扫描,可自动分析原生的TensorFlow API在晟腾AI处理器上的支持度,并将原始的TensorFlow训练脚本自动迁移成晟腾AI处理器支持的脚本,对于无法自动迁移的API,可以参考工具输出的迁移报告,对训练脚本进行相应的适配修改。
  • 手工迁移方式。算法工程师需要人工分析TensorFlow训练脚本中的API支持度情况,并且参照文档逐一手动修改不支持的API,以便在晟腾AI处理器上训练,该种方式较为复杂,建议优先使用自动迁移方式。

TensorFlow模型自动迁移详解

功能简介

Ascend平台提供了Tensorflow 1.15网络迁移工具,该工具适用于原生的Tensorflow训练脚本迁移场景,AI算法工程师通过该工具分析原生的TensorFlow Python API和Horovod Python API在昇腾AI处理器上的支持度情况,同时将原生的TensorFlow训练脚本自动迁移成昇腾AI处理器支持的脚本。对于无法自动迁移的API,您可以参考工具输出的迁移报告,对训练脚本进行相应的适配修改。

获取路径

  • CANN软件安装完成后,迁移工具在“tfplugin安装目录/tfplugin/latest/python/site-packages/npu_bridge/convert_tf2npu/”目录下。
  • 您也可以从昇腾社区获取,直接下载convert_tf2npu文件夹到Linux或Windows环境上任意目录即可。

使用限制

  • 要求原始脚本在GPU/CPU上跑通,精度收敛。
  • 要求原始脚本仅使用TensorFlow 1.15官方API和Horovod官方API,若用户脚本使用了其他第三方API,当前工具暂不支持迁移。例如:
    • 不支持原生Keras API,但由于Tensorflow官方API中包括了Tensorflow的Keras API,因此支持Tensorflow的Keras API。
    • 不支持CuPy API,即便原始脚本能在GPU上运行成功,但不能保证在昇腾AI处理器运行成功。
  • 原始脚本中的TensorFlow模块和Horovod模块最好按照如下方式引用,否则工具迁移后,无法生成准确的迁移报告(但并不影响脚本迁移)。
    import tensorflow as tf
    import tensorflow.compat.v1 as tf
    import horovod.tensorflow as hvd
    
  • 当前版本不支持float64/complex64/complex128/DT_VARIANT数据类型。
  • 当前不支持tf.keras和原生Keras的Loss Scale功能迁移。
  • 当前不支持动态shape网络迁移。

迁移操作步骤

1.安装依赖

pip3 install pandas
pip3 install xlrd==1.2.0
pip3 install openpyxl
pip3 install tkintertable
pip3 install google_pasta

2.训练脚本扫描和自动迁移。
该工具支持在Linux或Windows环境进行脚本迁移。

  • Linux环境操作步骤:
    进入迁移工具所在目录,例如“tfplugin安装目录/tfplugin/latest/python/site-packages/npu_bridge/convert_tf2npu/”,执行命令可同时完成脚本扫描和自动迁移,例如:
    python3 main.py -i /root/models/official/resnet
    
    在这里插入图片描述
  • Windows环境操作步骤:
    python3 main_win.py
    
    在这里插入图片描述
    3.迁移过程中,打印如下信息,表明正在扫描相关文件进行脚本迁移。
    在这里插入图片描述
    4.迁移结束后,生成迁移后的脚本,以及迁移报告。
    在这里插入图片描述

迁移报告说明

  • success_report.txt:记录工具对脚本的全部修改点,例如:

    # 表示resnet_run_loop.py第91行的map_and_batch()的drop_remainder参数配置为True
    /root/models/models/official/resnet/resnet_run_loop.py:91 change map_and_batch(xxx) to map_and_batch(xxx, drop_remainder=True)
    # 表示resnet_run_loop.py第4行新增“from npu_bridge.npu_init import *”头文件引用,用于导入NPU相关库
    /root/models/models/official/resnet/resnet_run_loop.py:4 from npu_bridge.npu_init import *
    Finish conver file: /root/models/models/official/resnet/resnet_run_loop.py
    
  • failed_report.txt:记录迁移过程中的报错信息以及不支持的api,例如:

    /root/ast_test/hvd/model_lib.py:704 is horovod api. The '-d' argument conflicts with the Horovod distributed strategy in your script
    Finish conver file: /root/ast_test/hvd/model_lib.py
    /root/ast_test/hvd/test.py:3, NPU Unsupport API: hvd.allreduce
    
  • api_analysis_report.xlsx:为API支持度分析报告,用户可以筛选“不支持(无迁移方案,建议不使用)”和“废弃类”API单独分析,并根据修改建议修改训练脚本。
    在这里插入图片描述

  • api_brief_report.txt:汇总脚本中API支持度统计结果,例如:

    # 未去重的统计结果,分类和API支持度表中的一致
    1.In brief: Total API: 231, in which Support: 222, API support after migration: 5, Network training support after migration: 0, Not support but no impact on migration: 0, Not support or recommended: 2, Compatible: 0, Deprecated: 2, Analysing: 0
    # 去重后的统计结果,分类和API支持度表中的一致
    2.After eliminate duplicate: Total API: 98, in which Support: 92, API support after migration: 4, Network training support after migration: 0, Not support but no impact on migration: 0, Not support or recommended: 1, Compatible: 0, Deprecated: 1, Analysing: 0
    

TensorFlow AI模型手工迁移详解

课程目标及准备工作

  • 学完本课程,应该能够:
    • 了解如何将TensorFlow训练脚本迁移至Ascend 910训练
    • CANN平台的部分特性
  • 为了达成上述目标,应该具备如下知识:
    • 熟练的Python语言编程能力
    • 熟悉TensorFlow 1.15的API
    • 深度学习基础知识,熟悉训练网络的基本知识与流程
  • 迁移开始前,需要准备如下工作:
    • 能够在GPU/CPU上跑通的TensorFLow1.15训练脚本
    • 与脚本配套的数据集

迁移流程

Estimator迁移要点

Estimator API属于TensorFlow的高阶API,在2018年发布的TensorFlow 1.10版本中引入,它可以极大简化机器学习的编程过程。

使用Estimator进行训练脚本开发的一般步骤为:
1.数据预处理,创建输入函数input_fn;
2.模型构建,构建模型函数model_fn;
3.运行配置,实例化Estimator,传入Runconfig类对象作为运行参数;
4.执行训练,在Estimator上调用训练方法Estimator.train(),利用指定输入对模型进行固定步数的训练。

针对Estimator的训练脚本迁移,我们也按照以上步骤进行,以便在晟腾910处理器上训练。
官方文档

from npu_bridge.npu_init import *

1.数据预处理。直接迁移,无需修改
但如果在创建dataset时,使用dataset.batch返回动态shape,需要设置drop_remainder为True,使其固定shape。

dataset = daateset.batch(batch_size, drop_remainder=True)

2.模型构建。一般直接迁移,无需修改。
如果原始网络中使用到了tf.device,需要删除相关代码;
如果在model中使用了gelu和dropout接口,推荐修改为NPU提供的高性能接口(不改也行)

TensorFlow原始代码
layers = tf.nn.dropout()
修改为
from npu_bridge.estimator import npu_ops
layers = npu_ops.dropout()
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)

3.运行配置
TensorFlow通过Runconfig配置运行参数,用户需要将Runconfig迁移为NPURunconfig。NPURunConfig类是继承RunConfig类,因此我们在迁移按照如下示例直接修改接口即可,大多数参数可不变。

TensorFlow原始代码:
config=tf.estimator.RunConfig(
  model_dir=FLAGS.model_dir, 
  save_checkpoints_steps=FLAGS.save_checkpoints_steps,
  session_config=tf.ConfigProto(allow_soft_placement=True,log_device_placement=False))
迁移后的代码:
from npu_bridge.estimator.npu.npi_config import NPURunConfig
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) 
  )

4.创建Estimator
将TensorFlow的Estimator迁移为NPUEstimator。
NPUEstimator类继承了Estimator类,因此我们在迁移时按照如下示例直接更改接口即可,参数可保持不变。

TensorFlow原始代码:
mnist_classifier=tf.estimator.Estimator(
  model_fn=cnn_model_fn,
  config=config,
  model_dir="/tmp/mnist_convnet_model")
迁移后的代码:
from npu_bridge.estimator.npu.npu_estimator import NPUEstimator
mnist_classifier=NPUEstimator(
  model_fn=cnn_model_fn,
  config=npu_config,
  model_dir="/tmp/mnist_convnet_model"
  )

5.执行训练
利用指定输入对模型进行固定步数训练。无需修改。

mnist_classifier.train(
  input_fn=train_input_fn,
  steps=20000,
  hooks=[logging_hook])
Session Run迁移要点

Sess.run迁移
Sess.run API属于TensorFlow的低阶API,相对于Estimator来讲,灵活性较高,但模型的实现较为复杂。

使用Sess.run API进行训练脚本开发的一般步骤为:
1.数据预处理;
2.模型搭建/计算Loss/梯度更新;
3.创建session并初始化资源;
4.执行训练。

与Estimator迁移相同,同样按照上述步骤进行迁移,以便在晟腾AI处理器上训练。
官方文档

from npu_bridge.npu_init import *

1.数据预处理
2.模型搭建/计算Loss/梯度更新

这两步与Estimator迁移相同:直接迁移无需修改

3.创建session并初始化资源
这一步需要在创建session前添加如下配置,使得训练能够在NPU上执行:

from tensorflow.core.protobuf.rewriter_config_pb2 import RewriterConfig
config = tf.ConfigProto()
custom_op = config.graph_options.rewrite_options.custom_optimizers.add()
custom_op.name = "NpuOptimizer"
config.graph_options.rewrite_options.remapping = RewriterConfig.OFF  # 必须显式关闭
sess = tf.Session(config=config)  #创建session

tf.Session原生功能在CANN平台上全部支持

在添加配置时需要注意这些配置保持默认配置即可,如果原脚本中有变动需要恢复默认配置:

  • 以下配置默认关闭,请勿开启:
    • rewrite_options.disable_model_pruning
  • 以下配置默认开启,请勿关闭:
    • rewrite_options.function_optimization
    • rewrite_options.constant_folding
    • rewrite_options.shape_optimization
    • rewrite_options.arithmetic_optimization
    • rewrite_options.loop_optimization
    • rewrite_options.dependency_optimization
    • rewrite_options.layout_optimizer
  • 以下配置默认开启,必须显式关闭:
    • rewrite_options.remapping
    • rewrite_options.memory_optimization

4.执行训练
Sess.run部分直接迁移,无需改造。
但是,如果用户训练脚本中没有使用with创建session,比如将session对象作为自己定义的一个类成员,那么需要在迁移后的脚本中显示调用sess.close()。

sess = tf.Session(config=config)
sess.run(...)
sess.close()

如果是with创建的session,with会调用session的__exit__方法,里面会自动调用close:

with tf.Session(config=config) as sess:
    sess.run(...)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星火飞花

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值