【CANN训练营第四期】如何在ModelArts上将自定义算子集成到深度神经网络

举报
张辉 发表于 2021/12/29 01:24:46 2021/12/29
【摘要】 CANN第四期训练营大作业例题复现

首先声明,本文不是题解,只是根据大作业的材料,复现下样例代码,以便了解一下CANN训练营这一年都学了啥。

刚刚结束的CANN训练营第四期,起飞的老谭第四课的大作业题目如下:

本次课程作业总体要求:

编写一个自定义算子,并集成部署到开发环境中;编写一段简单TF代码调用一下这个自定义算子;编写一段TF深度神经网络训练代码,集成这个自定义算子,并训出pb模型;将上一步的pb模型转换为om模型;编写AscendCL推理代码调用上一步的om模型并推出结果。

 

本次作业分四个步骤给分,请从前往后依次完成,完成几步给几步的分,不得跳过任一步骤向后执行。

第一步,编写一个TBE-DSL自定义算子,并集成部署到开发环境中,编写一段简单的TF代码调用一下这个自定义算子。自定义算子中可加入一点特殊print代码,以便TF调用到此自定义算子时可自证算子已被调用。

第二步,编写一段TF深度神经网络训练代码,集成上一步的自定义算子,并生成.pb格式的模型。

第三步,将上一步的pb模型通过ATC模型转换工具转换成om模型。

第四步,编写一段AscendCL推理代码,调用上一步生成的om模型进行推理并得出结果。

 

交付件格式参照本帖附件CANN训练营第四期第四课.zip里的AscendProject目录格式即可,目录内需要有三个工程,MyOperator、MyTraining、MyApp分别代表算子、训练、推理代码工程。交付件工程内需要有完善的README文档供阅卷复现,README文档中记得写明自己的华为云账号。

 

提示:根据README无法复现的作业,或涉嫌抄袭的作业将直接零分。

一、准备相关的软件包:

打开 https://www.hiascend.com/software/ai-frameworks/community

点击历史版本:

选择5.0.2.alpha003


点击aarch64的那个软件包下载, 复选已阅读

点击立即下载:


将作业贴中这个zip文件下载备用:

打开这个


这回真的需要下载tensorflow aarch64版本的包了


地址为:

大概92M左右.
下载MNIST数据集(为啥要我们下载MNIST? 因为后面使用自定义relu算子放进LeNet网络的时候,需要用MNIST数据集进行训练)

二、创建ModelArts训练作业:

登陆ModelArts:

https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=175115

点击开发环境->NoteBook

点击创建:

选择公共镜像中第二页的最后一个: mindstudio3.0.2-ascend910-cann5.0.2.1-ubuntu18.04-aarch64

乖乖,这个训练是39元一小时(后来发现内存选得太大了,192G的内存需要每小时39元,96G的内存需要每小时19.5元——反正也不便宜)

点击上面的立即创建密钥对

点击创建密钥对

按上图选择,点击确定:

回到浏览器的创建NodeBook页面,点击 密钥对右边的刷新按钮, 密钥对就可以选择了:

百度查到自己的IP

张小白是在南京市.

在远程访问白名单填入IP

将规格改为 24核96G

点击立即创建.(然后随时准备配完后立即停止 )

点击提交,提交成功,张小白还剩 12.6元

点击立即返回:


三、完成MobaXTerm与ModelArts服务器的连接:

点击Notebook查看地址:

打开MobaXTerm,增加新的session,

按要求分段填入以下内容:

点击Advanced

按以上内容选择刚才的key填入,点击OK

进入系统:


四、上传相关软件:

可以使用MobaXTerm,把前面下载的所有包上传到 /ma/user/work 目录:


五、安装相关软件:

执行以下命令:

cd ~/work

pip3.7.5 install tensorflow-1.15.0-cp37-cp37m-linux_aarch64.whl --user

到这里貌似有点慢...要有点耐心.
继续有耐心... 


chmod +x *.run
./Ascend-cann-tfplugin_5.0.2.alpha003_linux-aarch64.run --install


tar zxvf AscendProjects.tar.gz


cp -r AscendProjects/ ../

cp upload.bashrc ../.bashrc

cd ..

source .bashrc
至此,环境搭建完毕.

以后每次用完Notebook后,都需要重新执行 从安装tf1.15到最后的步骤.



六、配置MindStudio

ModelArts环境已经内置了MindStudio,下面开始配置:

启动MindStudio

cd ~/MindStudio/bin

./MindStudio.sh

弹出import setting页面:

点击OK

点击文件夹按钮

选择 /home/HwHiAiUser/Ascend/ascend-toolkit/5.0.2.1目录,点击OK

点击Finish,进入MindStudio界面:


七、使用MindStudio完成自定义算子开发与部署(MyOperator项目)

在MindStudio主菜单选择Open or import

选择 /home/ma-user/AscendProjects/MyOperator 目录

点击OK

关闭tips

点击左边的Project,打开 tbe/impl/relu.py

点击右上角的configure python interpreter链接(不是右上角的那个齿轮)

选择Deleted SDKs的 Python 3.7.5(好奇怪的选择),点击OK

点击菜单Build->Edit Build Configuration

好像不用改啥,点击build

在菜单栏选择Ascend->Deploy,选择Deploy locally

点击Deploy

这就部署完毕了.



八、使用MindStudio完成自定义算子的神经网络集成与训练(MyTraining项目)

File-Open->打开MyTraing工程:

点击OK

选择New Window(这样就有了2个MindStudio窗口了)

选择自定义算子的代码 tran_relu.py,右键

额,我这里run是灰的,到菜单上找run吧.

这里可以执行:

可见,自定义算子打印的话都有了.

然后开始网络训练lenet_train.py

开始训练:

(咦,前面问我下载的数据集还没放好呢...它能训练吗?)

好像确实不行.

将work目录下的数据集搬到 MINST_data目录下试试

cd /home/ma-user/AscendProjects/MyTraining/

cd MNIST_data

cp ~/work/t10* .

cp ~/work/train* .

再重新执行训练:

好像训练成功了.

打开models目录

tf的pb模型文件也生成了.

九、使用MindStudio将训练好的pb模型转换为离线模型(MyTraining项目)

打开菜单:Ascend-ModelConverter

点击ModelFile的文件夹图标:

弹出的文件夹选择 /home/ma-user/AscendProjects/MyTraing/models/lenet.pb文件,点击OK:

按上图填写后,点击Next

Next

命令可以记一下,以后命令行可能用得着:

/home/ma-user/Ascend/ascend-toolkit/5.0.2.1/atc/bin/atc  --input_shape="Placeholder:1,28,28,1" --check_report=/home/ma-user/modelzoo/lenet/Ascend910A/network_analysis.report --input_format=NHWC --output="/home/ma-user/modelzoo/lenet/Ascend910A/lenet" --soc_version=Ascend910A --framework=3 --model="/home/ma-user/AscendProjects/MyTraining/models/lenet.pb" 

耐心等待转换成功:

转换好的om放在了  /home/ma-user/modelzoo/lenet/Ascend910A/

也可以将其备份出来

cp * ~/work/

但是这次运行需要cp到这个目录

cd /home/ma-user/AscendProjects/MyApp/samples-master/python/level2_simple_inference/1_classification/lenet_mindspore_picture/model
cp /home/ma-user/modelzoo/lenet/Ascend910A/lenet.om .


十、使用MindStudio进行离线模型推理(MyApp项目)

使用MindStudio打开MyApp工程

打开model目录:

打开src/classify.py

run一下看看:

运行后截图如下:

结果复制如下:

/usr/bin/python3.7 /home/ma-user/AscendProjects/MyApp/samples-master/python/level2_simple_inference/1_classification/lenet_mindspore_picture/src/classify.py
init resource stage:
Init resource success
Init model resource start...
[Model] create model output dataset:
malloc output 0, size 40
Create model output dataset success
Init model resource success
it is not a picture, .keep, ignore this file and continue,
original img shape: (220, 219, 3)
original shape: (220, 219)
gray_img: [[255 255 255 ... 255 255 255]
 [  2   6   6 ...   6   2 255]
 [  6  30  30 ...  30   6 255]
 ...
 [  6  30  30 ...  30   6 255]
 [  6  30  30 ...  30   6 255]
 [ 20  51  51 ...  51  20 255]]
(28, 28)
orig_shape: (220, 219)
(28, 28)
result_list_0: [[1.5318394e-05 1.5318394e-05 1.5318394e-05 1.5318394e-05 1.5318394e-05
  1.5318394e-05 1.5318394e-05 1.0000000e+00 1.5318394e-05 9.9804688e-01]]
post process
data.shape: (1, 10)
data: [[1.5318394e-05 1.5318394e-05 1.5318394e-05 1.5318394e-05 1.5318394e-05
  1.5318394e-05 1.5318394e-05 1.0000000e+00 1.5318394e-05 9.9804688e-01]]
vals: [1.5318394e-05 1.5318394e-05 1.5318394e-05 1.5318394e-05 1.5318394e-05
 1.5318394e-05 1.5318394e-05 1.0000000e+00 1.5318394e-05 9.9804688e-01]
images:test3.png
======== top5 inference results: =============
label:7  confidence: 1.000000, class: 7
label:9  confidence: 0.998047, class: 9
label:8  confidence: 0.000015, class: 8
label:6  confidence: 0.000015, class: 6
label:5  confidence: 0.000015, class: 5
original img shape: (221, 220, 3)
original shape: (221, 220)
gray_img: [[255 255 255 ... 255 255 255]
 [255 255 255 ... 255 255 255]
 [255   2   6 ...   6   2 255]
 ...
 [255   6  30 ...  30   6 255]
 [255   6  30 ...  30   6 255]
 [255  20  51 ...  51  20 255]]
(28, 28)
orig_shape: (221, 220)
(28, 28)
result_list_0: [[1.5318394e-05 1.5318394e-05 1.5318394e-05 1.5318394e-05 3.4294128e-03
  1.5318394e-05 1.5318394e-05 1.5318394e-05 1.5318394e-05 1.0000000e+00]]
post process
data.shape: (1, 10)
data: [[1.5318394e-05 1.5318394e-05 1.5318394e-05 1.5318394e-05 3.4294128e-03
  1.5318394e-05 1.5318394e-05 1.5318394e-05 1.5318394e-05 1.0000000e+00]]
vals: [1.5318394e-05 1.5318394e-05 1.5318394e-05 1.5318394e-05 3.4294128e-03
 1.5318394e-05 1.5318394e-05 1.5318394e-05 1.5318394e-05 1.0000000e+00]
images:test2.png
======== top5 inference results: =============
label:9  confidence: 1.000000, class: 9
label:4  confidence: 0.003429, class: 4
label:8  confidence: 0.000015, class: 8
label:7  confidence: 0.000015, class: 7
label:6  confidence: 0.000015, class: 6
original img shape: (219, 219, 3)
original shape: (219, 219)
gray_img: [[255   2   6 ...   6   6   2]
 [255   6  30 ...  30  30   6]
 [255   6  30 ...  30  30   6]
 ...
 [255   6  30 ...  30  30   6]
 [255   6  30 ...  30  30   6]
 [255  20  51 ...  51  51  20]]
(28, 28)
orig_shape: (219, 219)
(28, 28)
result_list_0: [[1.5318394e-05 1.0000000e+00 1.5318394e-05 1.5318394e-05 9.1075897e-04
  1.5318394e-05 1.5318394e-05 1.5318394e-05 1.5318394e-05 1.5318394e-05]]
post process
data.shape: (1, 10)
data: [[1.5318394e-05 1.0000000e+00 1.5318394e-05 1.5318394e-05 9.1075897e-04
  1.5318394e-05 1.5318394e-05 1.5318394e-05 1.5318394e-05 1.5318394e-05]]
vals: [1.5318394e-05 1.0000000e+00 1.5318394e-05 1.5318394e-05 9.1075897e-04
 1.5318394e-05 1.5318394e-05 1.5318394e-05 1.5318394e-05 1.5318394e-05]
images:test1.png
======== top5 inference results: =============
label:1  confidence: 1.000000, class: 1
label:4  confidence: 0.000911, class: 4
label:9  confidence: 0.000015, class: 9
label:8  confidence: 0.000015, class: 8
label:7  confidence: 0.000015, class: 7
acl resource release all resource
Model release source success
acl resource release stream
acl resource release context
Reset acl device  0
Release acl resource success

Process finished with exit code 0


十一、总结

以上过程,完成了自定义算子relu.py的开发,编译,部署,单算子运行.(MyOperator)

然后又完成了融入该算子的LeNet网络的训练(变为pb模型) MyTraining

然后将pb模型转换为om离线模型.

最后将其放到推理工程MyApp中执行,得到推理结果.

所以,这次CANN训练营的终极作业的解题过程应该是:

自己找一个算子,放在MyOperator里面进行上述开发,编译,部署,单算子运行.

然后放入网络训练.生成pb模型后,atc转换为离线模型om

最后将om模型放入推理代码中,进行推理.

(然而以上都是理论!!!  张小白作为嘴强王者,已经把做题目的思路讲完了 .剩下就看学员们的了!)

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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