【2023 · CANN训练营第一季】- 昇腾AI入门课(TensorFlow) 第二章 TensorFlow模型迁移训练 学习
一、学习目标
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]
)
(2)sess.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文件夹中的train和teat文件夹,在本地上使用tensorboard查看详细训练过程。
- 点赞
- 收藏
- 关注作者
评论(0)