【CANN训练营】【2022第二季】【新手班】迁移TensorFlow模型到昇腾设备实验复现

举报
StarTrek 发表于 2022/07/22 21:15:02 2022/07/22
【摘要】 本文是在CANN训练营学习过程中的一篇学习笔记,实现TensorFlow模型迁移到昇腾AI处理器,以Tensorflow1.15实现LeNet网络的minist手写数字识别为例,将代码迁移到昇腾设备上并跑通训练过程。

本实验主要是实现TensorFlow模型迁移到昇腾AI处理器,以Tensorflow1.15实现LeNet网络的minist手写数字识别为例,将代码迁移到昇腾设备上并跑通训练过程。该实验的主要任务有:
1、在本地跑通“基于Tensorflow1.15编写的LeNet网络的minist手写数字识别”的程序;
2、模型迁移,将原代码迁移成能在昇腾AI处理器上进行训练的代码;
3、将迁移后的代码跑在ModelArts平台上。

一、本地跑通基于LeNet网络的minist手写数字识别代码

目前昇腾支持的迁移模型是Tensorflow1.15,所以本地需要在Tensorflow1.15的环境下跑通代码,便于之后的迁移转换。

1、环境问题

这里首先要提及的就是环境问题,此处测试的环境是Python = 3.7.13,tensorflow = 1.15,tensorflow-estimator = 1.15.1。本地测试为了安装便利,这里用的是CPU版本的tensorflow。
(直接conda install安装可能会出现tensorflow-estimator和tensorflow版本不匹配的问题,可以采用pip install tensorflow=1.15的方法,具体安装环境和pycharm操作流程可以参考博客:https://bbs.huaweicloud.com/blogs/detail/264500
【ERROR】下面展示一下之前所遇到的tensorflow-estimator和tensorflow版本不匹配的问题,报错情况如下
图片.png
如果出现该情况可以尝试通过重新安装指定版本的tensorflow-estimator来解决
图片.png

2、下载LenNet源码并训练

LenNet源码下载地址:https://gitee.com/lai-pengfei/LeNet
需要注意的是该源码并没有给出具体的操作步骤,也没有交代具体的运行环境,直接运行会存在一定的问题,可以先尝试运行一下。我首先遇到的第一个问题就是源码直接运行会出现无法识别到模块的问题,猜测可能也是tensorflow版本原因导致的。
图片.png

需要将Train.py文件中的第一行代码:

import tensorflow.examples.tutorials.mnist.input_data as input_data

修改为:

from tensorflow.examples.tutorials.mnist import input_data

修改之后就可以正常训练了
图片.png
如果希望在训练过程中打印loss,可以在Train.py中加入打印loss的语句:

train_loss = sess.run(lenet.loss, feed_dict={
                lenet.raw_input_image: batch[0], lenet.raw_input_label: batch[1]
            })

图片.png
运行之后就可以看见loss的输出
图片.png
如果想要降低训练的时长和次数,可以修改config.py中的MAX_ITER值

图片.png

二、迁移到昇腾AI处理器上

对于tensorflow模型迁移的方法主要有两种:手动迁移和自动迁移。本文将介绍这两种方法,实践中两者任选其一即可。
1、手动迁移
官方文档学习链接:https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/60RC1alpha001/moddevg/tfmigr/atlasmprtg_13_9014.html
手动迁移根据tensorflow使用的API不同分为Estimator、sess.run和Keras三类,本次实验主要的代码都是采用的sess.run的API,sess.run API属于TensorFlow的低阶API,相对于Estimator来讲,灵活性较高,但模型的实现较为复杂。
①增加头文件

from npu_bridge.npu_init import *

②训练过程修改
原有代码出现sess=tf.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  # 必须显式关闭
sess = tf.Session(config=config)

图片.png
2、自动迁移
使用官方给的迁移工具进行自动迁移。Ascend平台提供了Tensorflow 1.15网络迁移工具,该工具适用于原生的Tensorflow训练脚本迁移场景,AI算法工程师通过该工具分析原生的TensorFlow Python API和Horovod Python API在昇腾AI处理器上的支持度情况,同时将原生的TensorFlow训练脚本自动迁移成昇腾AI处理器支持的脚本。对于无法自动迁移的API,可以参考工具输出的迁移报告,对训练脚本进行相应的适配修改。
①下载迁移工具
下载convert_tf2npu文件夹到Linux或Windows环境上任意目录即可,运行时只要在该目录下运行main.py文件。
下载地址:https://gitee.com/ascend/tensorflow/tree/master/convert_tf2npu
②安装依赖

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

图片.png
③进入迁移工具所在目录,并运行main.py进行自动转换

python main.py -i ..\LeNetMNIST\LeNet-master -o ..\LeNetMNIST\Automated_Porting -r ..\LeNetMNIST\Automated_Porting

-i 后面跟着的是需要迁移的py文件的所在文件夹,工具会自动扫描文件夹中的py文件,并自动迁移(必选);-o 后面跟着的是迁移后的文件所在文件夹(可选);-r 后面跟着的是迁移后的日志所在文件夹(可选)。其中-o和-r可以不给定,当不给定时,迁移后的代码文件和日志文件将生成在迁移工具所在目录(也即convert_tf2npu文件夹中)
图片.png
图片.png
迁移后的Train.py文件
图片.png
迁移后的Inference.py文件
图片.png
自动迁移日志
图片.png
可以看到被迁移的是Inference.py和Train.py文件中的sess=tf.Session()API (其中testprogram.py可以忽略,是自己写的一点用来测试 tf.Session API的,不在源码中)

三、将迁移后的代码跑在ModelArts平台

ModelArts有两种方式可以去用,一种是在华为云中搜索ModelArts在其上用网页版的CodeLab操作(也就是用Jupyter Notebook来运行),还有一种是在本地通过下载PyCharm ToolKit工具在Pycham上去操作。本文主要用的是第二种方法。

1、下载PyCharm ToolKit工具

在华为云控制台中搜索ModelArts进入其控制台,可以在其首页界面中的最下方找到上述的网页版CodeLab以及PyCharm ToolKit工具。直接下载即可,然后在PyCharm中导入安装插件。
图片.png
图片.png
选择刚下载好的安装包,然后重启pycharm即可,在最上面一行的菜单栏可以发现已经出现了ModelArts的选项
图片.png

2、准备工作

①在华为云申请设置访问权限的AK和SAK
参考流程:
https://support.huaweicloud.com/modelarts_faq/modelarts_05_0004.html
②授权ModelArts
参考流程:
https://support.huaweicloud.com/prepare-modelarts/modelarts_08_0007.html
③OBS的使用
可以直接在华为云搜索栏搜索OBS,然后直接在网页上操作,但是无法移动上传的文件位置:
https://support.huaweicloud.com/prepare-modelarts/modelarts_08_0003.html
或者下载OBS Browser+到本地,在软件中操作,可以移动文件,登陆需要用到前面申请的AK和SAK
下载地址:
https://support.huaweicloud.com/browsertg-obs/obs_03_1003.html
④在OBS中上传MNIST数据集
图片.png

3、在ModelArts上训练

官方文档参考资料:
https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/60RC1alpha001/moddevg/tfmigr/atlasmprtg_13_9018.html

(1) 修改Train.py文件以适应modelarts训练

当前我们已经将数据集上传至OBS中,我们需要让代码可以找到数据集的位置,所以此处可以使用moxing,在代码中明确将数据集从OBS拷贝到ModelArts环境里面,此操作需要在源码中添加:

import moxing as mox
mox.file.copy_parallel(src_url="obs://cann-lenet-learning/MNIST_data/", dst_url="MNIST_data")

图片.png
【ERROR】此处介绍一个我遇到的情况,如果不添加上述代码,可能无法正常训练,训练时将一直卡在下图界面,原本我并没有用moxing接口,因为官网上说是新版本无需通过moxing接口书写下载数据、回传数据的代码,但是不做任何修改直接运行将会卡在这里,原因可能是没读取对数据集所在的位置,添加了上述代码就可以正常训练,当然官方文档中还介绍了ModelArts的参数解析方式,可能也是自己还没理解代码,所以具体的本质原因仍需要学习,如果有大佬能指点一二,我在此不胜感激。
图片.png

(2) 创建训练项目

图片.png

(3) 训练结果

图片.png

(4) 权重文件和运行日志文件

权重文件已经自动被保存到OBS中
图片.png
log运行日志也已经自动被保存到OBS中
图片.png
图片.png

(5) 运行时的资源占用情况

图片.png

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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