【CANN训练营第四期】如何在ModelArts上将自定义算子集成到深度神经网络
首先声明,本文不是题解,只是根据大作业的材料,复现下样例代码,以便了解一下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文件下载备用:
打开这个
二、创建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
六、配置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到这个目录
十、使用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模型放入推理代码中,进行推理.
(然而以上都是理论!!! 张小白作为嘴强王者,已经把做题目的思路讲完了 .剩下就看学员们的了!)
- 点赞
- 收藏
- 关注作者
评论(0)