张小白手把手教你如何将Tensorflow框架的LeNet模型迁移到昇腾环境
华为昇腾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)
张小白先说一下解题思路:
- 首先,要跑通基于GPU版本的基于Tensorflow 1.15的LeNet网络 的模型训练代码。
- 然后,根据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
CUDA 10.0是满足了,cuDNN官方要求是7.4,现在本机是7.5。应该是满足的。
查看本机的python版本:3.7.6
先用conda做一个Python 3.7.5的tensorflow GPU环境
conda create --name tensorflow_gpu python=3.7.5
...
激活conda环境
conda activate tensorflow_gpu
按照tensorflow 1.15版本
清华的pip源最近有点不稳定,可以换成豆瓣源试试:
pip install tensorflow-gpu==1.15 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
。。。
在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__)
看来没啥问题。
2.下载和运行LeNet GPU代码:
下载项目代码仓:https://gitee.com/lai-pengfei/LeNet
git clone https://gitee.com/lai-pengfei/LeNet.git
使用PyCharm打开刚才下载的LENET工程目录:
将PyCharm的环境指向 tensorflow-gpu的conda环境
点击OK:可以看到tensorflow 1.15的环境。
在PyCharm右下角 有这个环境的标识:
打开终端一个一个来执行脚本:
编辑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
...
系统报cuDNN版本必须是7.6。。。
那就更新cuDNN吧:
按照 https://bbs.huaweicloud.com/blogs/212446 的步骤去下载 cuDNN 7.6 for CUDA 10.0:
下载后的zip文件为:cudnn-10.0-windows10-x64-v7.6.5.32.zip
将其解压后,覆盖 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0 下的同名目录。
再用 tensorflow_gpu环境跑一次。
修改config.py,将MAX_ITER从50000改为20000。这样精度高一点,而且时间也没那么长。。
可见,训练代码可以在本地顺利跑完,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:
此时可以按照 MindSpore21天实战营(5)使用PyCharm Kit进行基于Wide&Deep实现CTR预估实战 https://bbs.huaweicloud.com/blogs/207322 三、PyCharm Kit的登场 章节的内容安装插件。此处不再赘述,仅以截图展示:
3、使用OBS Browser+将数据集传输到OBS
使用obs_browser_plus
输入账号名,AK,SK,点击登录:
进入之后,点击创建桶
这里可以看自己以前购买的OBS套餐的类型,可以用多AZ,也可以用单AZ。然后输入桶的名称:lenet,点击确定:
可以看到该桶已创建完毕。
然后将本地下载好的E:\CANN\lenet目录下的MNIST目录传到cann-lenet桶中。
点击桶名称:
点击上传:
选择添加含有MINST数据集的文件夹:
系统会提示:
点击是,确认。
可以点击 任务管理,查看文件传输的状态。
传输完毕后,可进入下一步。
4、使用PyCharm创建ModelArts训练作业,跑通LeNet训练
我们先创建个训练作业:
(从上图可以看出,目前的环境还是GPU环境)
回头看看训练脚本Train.py,代码是在直接读本地的数据集文件。
现在数据集在OBS里面,所以使用moxing,将数据集从OBS拷贝到ModelArts环境里面:
还需要把训练的结果拷贝回 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")
执行ModelArts-》Run Training Job,耐心等待运行结束。
可以看到,在ModelArts里面的Train.py可以正常跑完。
创建训练作业的时候再修改如下参数,使其在NPU环境下(Tensorflow 1.15+Python3.7的Ascend集群环境)运行:
重新执行ModelArts-》Run Training Job,耐心等待运行结束。
这里跑了5000次迭代,精度在0.76左右。
将epoch改为50000再做一次。
我们可以到ModelArts的控制台查看资源占用情况:
注意:查看训练脚本有没有在NPU上运行,需要看第三个绿色的标识为NPU的线的趋势是否不为0.
训练的结果截图如下:
精度也达到了0.96.
回到OBS可以看到ckpt目录下已经有拷贝回来的模型文件:
而job运行的日志自动传到了 "训练作业名"/log目录下,这里是:
obs://cann-lenet/MA-LeNet-04-08-13-28/log/
注:先在本地测通过之后,再去ModelArts测,因为训练作业很花钱的。。
(全文完,谢谢阅读)
- 点赞
- 收藏
- 关注作者
评论(0)