【2023 · CANN训练营第一季】- 昇腾AI入门课(TensorFlow) 第二章 TensorFlow模型迁移训练 学习

举报
Heartt 发表于 2023/05/16 07:49:36 2023/05/16
【摘要】 一、学习目标1.了解异构计算架构CANN在神经网络训练中发挥的主要作用。2.掌握如何基于CANN将TensorFlow模型迁移到昇腾Al处理器上。3.掌握如何在昇腾Al处理器上进行模型训练,感受昇腾Al的极致性能。4.掌握如何查看训练日志和训练结果,具备基本的问题定界、定位能力。二、AI模型开发基础知识入门1.1.基于CANN的模型开发流程2.问题求助和意见反馈渠道(1)在华为方集中组织培训...

一、学习目标

1.了解异构计算架构CANN在神经网络训练中发挥的主要作用。

2.掌握如何基于CANN将TensorFlow模型迁移到昇腾Al处理器上。

3.掌握如何在昇腾Al处理器上进行模型训练,感受昇腾Al的极致性能。

4.掌握如何查看训练日志和训练结果,具备基本的问题定界、定位能力。


二、AI模型开发基础知识入门1.

1.基于CANN的模型开发流程

2.问题求助和意见反馈渠道

(1)在华为方集中组织培训的场景下,可求助培训或对应课程的接口人。

(2)开发者自学的场景下:

a.可在ModelZoo仓上提lssue,该仓的接口人会定期处理问题。

b.可在昇腾社区论坛中查阅经验贴、或者发帖,论坛的接口人会定期处理问题。


TensorFlow模型迁移详解

1.为什么要进行模型迁移

市面上有很多用于搭建AI模型的深度学习框架,如华为的昇思MindSpore,Google的TensorFlow、Facebook的PyTorch、Caffe等。

除了昇思MindSpore外,TensorFlow等其他深度学习框架下的模型并不能直接在昇腾910 Al处理器上训练,为了使其充分利用昇腾910Al处理器的算力来提升训练性能,我们需要借助异构计算架构CANN的Plugin适配层转换,使转换后的模型能够高效运行在昇腾910Al处理器上。

目前,CANN已经能够支持多种主流AI框架,包括昇思MindSpore、TensorFlow、PyTorch、飞浆、ONNX等,并且开发者只需要非常少的改动,即可快速搞定算法移植,大大减少切换平台的代价。


2.两种模型迁移方式

(1)自动迁移

通过迁移工具对原始脚本进行AST语法树扫描,可自动分析原生的TensorFlow APl在昇腾Al处理器上的支持度,并将原始的TensorFlow训练脚本自动迁移成昇腾Al处理器支持的脚本,对于无法自动迁移的APl,可以参考工具输出的迁移报告,对训练脚本进行相应的适配修改。

(2)手工迁移

算法工程师需要人工分析TensorFlow训练脚本中的APl支持度情

况,并且参照文档逐一手工修改不支持的APl,以便在昇腾Al处理器上训练,该种方式较为复杂。


3. TensorFlow模型自动迁移详解

该特性适用于原生的Tensorflow 1.15训练脚本自动迁移场景。


4. TensorFlow模型手工迁移详解

(1)Estimator迁移

Estimator API属于TensorFlow的高阶API,在2018年发布的TensorFlow 1.10版本中引入,它可极大简化机器学习的编程过程。Estimator有很多优势,例如:对分布式的良好支持、简化了模型的创建工作、有利于模型开发者之间的代码分享等。

a.头文件增加

对于需要修改的python文件,新增以下头文件引用,用于导入NPU相关库。

from npu_bridge.npu_init import *


b. 数据预处理

一般情况下,此部分代码无需改造。如果在创建dataset时,使用dataset.batch返回动态shape,需要设置drop_remainder为True,使其固定shape。

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


c. 模型构建

一般情况下,此部分代码无需改造。

如果原始网络中使用到了tf.device,需要删除相关代码。

如果在model中使用了dropout接口,推荐使用CANN对应的API实现,以获得更优性能。

原始代码:

layers = tf.nn.dropout()

迁移后代码:

layers = npu_ops.dropout()

• 如果存在
tf.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

如果在model中使用了gelu接口,推荐使用CANN对应的API实现,以获得更优性能。

layers = npu_unary_ops.gelu(x)


d. 运行配置

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

原始代码:

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)
)

迁移后的代码:

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)
)


e.创建Estimator

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

原始代码:

mnist_classifier=tf.estimator.Estimator(
    model_fn=cnn_model_fn,
    config=config,
    model_dir="/tmp/mnist_convnet_model"
)

迁移后的代码:;

mnist_classifier=NPUEstimator(
    model_fn=cnn_model_fn,
    config=npu_config,
    model_dir="/tmp/mnist_convnet_model"
)


f.执行训练

利用指定输入对模型进行固定步数的训练,此部分代码无需改造。

mnist_classifier.train(
    input_fn=train_input_fn,
    steps=20000,
    hooks=[logging_hook]
)


2sess.run迁移

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

其中头文件增加,数据预处理,模型搭建与Estimator迁移相同

a.创建session并初始化资源

在创建session前添加如下配置:

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 # 必须显式关闭
config.graph_options.rewrite_options.memory_optimization = RewriterConfig.OFF # 必须显式关闭


b.执行训练

此部分代码无需改造。

如果用户训练脚本中没有使用with创建session,比如将session对象作为自己定义的一个类成员,那么需要在迁移后的脚本中显示调用sess.close()

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


TensorFlow模型训练详解

1.训练流程

2.准备工作

(1)获取AK/SK,授权ModelArts

2下载数据集,并进行数据预处理(如离线制作成tfrecords;根据指导登陆OBS-browser+将处理好的数据集上传到OBS

3安装Pycharm IDE和下载Pycharm toolkit插件

4对训练代码进行NPU的迁移&适配

3.创建并提交训练任务

(1)Pycharm打开训练工程代码,配置训练参数,下发训练任务

在PyCharm工具栏中,选择“ModelArts > Training Job > New”。

在弹出的对话框中,按照如下示例配置训练参数。

填写完成后,单击“Apply and Run”,自动上传本地代码至云上ModelArts并启动训练训练过程中,可以在下方控制台查看训练作业日志训练结束后,会显示训练结果和日志信息保存路径。


2查看结果

提交训练作业时,系统将自动在您配置的Training Obs Path中,使用作业名称创建一个新的文件夹,用于存储训练输出的模型、日志和代码

可以下载result文件夹中的trainteat文件夹,在本地上使用tensorboard查看详细训练过程。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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