张小白手把手教你如何将Tensorflow框架的LeNet模型迁移到昇腾环境

举报
张辉 发表于 2021/05/02 07:01:07 2021/05/02
【摘要】 本文介绍了将LeNet的TensorFlow例程迁移到Ascend环境的方法

华为昇腾Ascend可以说是国货之光,从昇腾处理器到AI基础设施、AI应用,形成了一系列的产业链。

昇腾社区 http://www.hiascend.com 中有这么一张图:( https://www.hiascend.com/zh/ecosystem/industry

在这张昇腾计算产业结构图上,异步计算架构(CANN)起到了一个承上启下的作用,它屏蔽了底层的硬件和NPU驱动,给上层传统的AI框架(如Tensorflow,PyTorch等等)和华为自研的MindSpore框架提供了统一的适配,可以充分释放昇腾系统多样化的算力。

近期,昇腾团队举办了“第一期的CANN训练营”。张小白有幸参加其中,并交了一些作业。本文就是对模型营作业的整理(https://bbs.huaweicloud.com/forum/thread-117665-1-1.html  https://bbs.huaweicloud.com/forum/thread-119491-1-1.html)。

作业内容如下:

在昇腾服务器上跑通基于Tensorflow 1.15的LeNet网络(数据集为MNIST)

张小白先说一下解题思路:

  1. 首先,要跑通基于GPU版本的基于Tensorflow 1.15的LeNet网络 的模型训练代码。
  2. 然后,根据Tensorflow框架模型移植适配的方法( https://support.huaweicloud.com/tensorflowdevg-cann330alphaXtraining/atlasmprtg_13_0008.html ),将上述代码迁移到昇腾设备上来。

一、本地跑通GPU环境的模型训练代码

1.搭建本地GPU运行环境

根据  https://bbs.huaweicloud.com/blogs/212446 ,张小白已经在带Nvidia GPU的笔记本电脑上安装好了CUDA 10.0和cuDNN 7.5。

根据 https://blog.csdn.net/weixin_50888378/article/details/109022585 ,张小白也已安装好了Windows下的Anaconda环境。

参考tensoflow官网 https://tensorflow.google.cn/install/pip?hl=zh_cn  ,检查tensorflow_gpu-1.15.0版本的配置要求:https://tensorflow.google.cn/install/source_windows?hl=zh_cn 

image.png

CUDA 10.0是满足了,cuDNN官方要求是7.4,现在本机是7.5。应该是满足的。

image.png

查看本机的python版本:3.7.6

先用conda做一个Python 3.7.5的tensorflow GPU环境

conda create --name tensorflow_gpu python=3.7.5

image.png

...

image.png

激活conda环境

conda activate tensorflow_gpu

image.png

按照tensorflow 1.15版本

image.png

清华的pip源最近有点不稳定,可以换成豆瓣源试试:

pip install tensorflow-gpu==1.15 -i http://pypi.douban.com/simple/  --trusted-host pypi.douban.com

image.png

。。。

image.png

在conda环境中做几个tensorflow入门的小测试吧:

import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
print(tf.test.is_gpu_available())

print(tf.__version__)

image.png

image.png

看来没啥问题。

2.下载和运行LeNet GPU代码:

下载项目代码仓:https://gitee.com/lai-pengfei/LeNet 

git clone https://gitee.com/lai-pengfei/LeNet.git

image.png

使用PyCharm打开刚才下载的LENET工程目录:

image.png


将PyCharm的环境指向 tensorflow-gpu的conda环境

image.png

点击OK:可以看到tensorflow 1.15的环境。

image.png

在PyCharm右下角 有这个环境的标识:

image.png

打开终端一个一个来执行脚本:

编辑Train.py,将

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

改为

from tensorflow.examples.tutorials.mnist import input_data

(这一步骤是为了让该例程在目前的tensorflow 1.15的环境中可以正常跑通)

执行python Train.py

image.png

...

image.png

系统报cuDNN版本必须是7.6。。。

那就更新cuDNN吧:

按照 https://bbs.huaweicloud.com/blogs/212446 的步骤去下载 cuDNN 7.6 for CUDA 10.0:

image.png

下载后的zip文件为:cudnn-10.0-windows10-x64-v7.6.5.32.zip

image.png

将其解压后,覆盖 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0 下的同名目录。

再用 tensorflow_gpu环境跑一次。

image.png

修改config.py,将MAX_ITER从50000改为20000。这样精度高一点,而且时间也没那么长。。

image.png

可见,训练代码可以在本地顺利跑完,20000次迭代之后,精度为0.94左右。

二、在ModelArts的昇腾集群跑通Ascend环境的模型训练代码

我们有了在GPU上跑成功的代码,就可以走下一步:代码移植了。

1.代码移植

昇腾团队针对Tensorflow向Ascend做代码移植,已经封装得非常好了。我们首先需要判断该代码属于那种方式的API。一般有Estimator方式和sess.run方式。这次LeNet的训练代码,我们在代码中多次看到 tf.session(),sess.run字样,说明它采用了sess.run方式,那么就可以按照 https://support.huaweicloud.com/tensorflowdevg-cann330alphaXtraining/atlasmprtg_13_0009.html 文中的提示,逐个进行代码的迁移了。

上面链接里面对于如何移植其实也说得非常清晰了。

在头文件加上:

from npu_bridge.npu_init import *

sess = tf.Session()

改为这段代码即可:

# sess = tf.Session()
# 修改为CANN sess.run迁移 参考https://support.huaweicloud.com/tensorflowdevg-cann330alphaXtraining/atlasmprtg_13_0009.html
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  # 必须显式关闭remap
sess = tf.Session(config=config)

2、安装PyCharm的ModelArts插件

https://console.huaweicloud.com/modelarts/?region=cn-north-4#/dashboard 下载PyCharm Toolkit:

image.png

此时可以按照 MindSpore21天实战营(5)使用PyCharm Kit进行基于Wide&Deep实现CTR预估实战 https://bbs.huaweicloud.com/blogs/207322 三、PyCharm Kit的登场 章节的内容安装插件。此处不再赘述,仅以截图展示:

 image.png

image.png

image.png

image.png

3、使用OBS Browser+将数据集传输到OBS

使用obs_browser_plus

image.png

输入账号名,AK,SK,点击登录:

image.png

进入之后,点击创建桶

image.png

这里可以看自己以前购买的OBS套餐的类型,可以用多AZ,也可以用单AZ。然后输入桶的名称:lenet,点击确定:

image.png

可以看到该桶已创建完毕。

然后将本地下载好的E:\CANN\lenet目录下的MNIST目录传到cann-lenet桶中。

点击桶名称:

image.png

点击上传:

image.png

选择添加含有MINST数据集的文件夹:

image.png

系统会提示:

image.png

点击是,确认。

可以点击 任务管理,查看文件传输的状态。

image.png

传输完毕后,可进入下一步。

4、使用PyCharm创建ModelArts训练作业,跑通LeNet训练

我们先创建个训练作业:

image.png

(从上图可以看出,目前的环境还是GPU环境)

回头看看训练脚本Train.py,代码是在直接读本地的数据集文件。

现在数据集在OBS里面,所以使用moxing,将数据集从OBS拷贝到ModelArts环境里面:

image.png

还需要把训练的结果拷贝回 OBS:训练的结果放在了 ModelArts环境的 checkpoint目录下(config.py)

PARAMETER_FILE = "checkpoint/variable.ckpt"

在OBS上新建一个ckpt的文件夹(特意用不同的目录名以示区分)

然后增加一行拷贝语句将checkpoint目录全部拷贝过来即可

mox.file.copy_parallel(src_url="checkpoint/", dst_url="obs://cann-lenet/ckpt")

image.png

执行ModelArts-》Run Training Job,耐心等待运行结束。

image.png

可以看到,在ModelArts里面的Train.py可以正常跑完。

创建训练作业的时候再修改如下参数,使其在NPU环境下(Tensorflow 1.15+Python3.7的Ascend集群环境)运行:

image.png

重新执行ModelArts-》Run Training Job,耐心等待运行结束。

这里跑了5000次迭代,精度在0.76左右。

将epoch改为50000再做一次。

我们可以到ModelArts的控制台查看资源占用情况:

image.png

注意:查看训练脚本有没有在NPU上运行,需要看第三个绿色的标识为NPU的线的趋势是否不为0.

训练的结果截图如下:

image.png

image.png

精度也达到了0.96.

回到OBS可以看到ckpt目录下已经有拷贝回来的模型文件:

image.png

而job运行的日志自动传到了 "训练作业名"/log目录下,这里是:

obs://cann-lenet/MA-LeNet-04-08-13-28/log/

image.png

注:先在本地测通过之后,再去ModelArts测,因为训练作业很花钱的。。

(全文完,谢谢阅读)

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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