【CANN训练营第四期】如何在AI1S云服务上基于ACL实现单算子调用
刚刚结束的CANN训练营第四期,大毛老师第三课的大作业题目如下:
1.在昇腾算子库中选一个算子实现单算子调用(om方式),并且功能正常,结果正确;10分
加分项
1.与原始框架算子做了精度对比分析; 5分
2.与原始框架算子做了性能对比分析; 5分
3.单算子调用用aclcompileandexecute方式实现并且功能正常,结果正确 5分
4.将单算子调用应用到了实际应用场景中,形成了一个完整的应用案例; 5分
5.发现问题后提issue到samples仓并最终被确认为版本问题; 5分
•注意点:
1.不得与社区样例代码相同或与其他参与者的代码相同,一经发现,提交时间较晚的ID直接记0分
2.不可执行的代码不给分
3.作业最终得分会综合代码质量、README质量(README十分重要,如果按照README进行操作,过程不够丝滑,或者有步骤缺失,可能会扣分甚至没分的哦)
4.如果在做作业的过程中有疑问或者发现一些版本问题,鼓励大家在samples仓提issue,如果发现有版本问题阻塞你完成作业,可以提issue并换一个算子尝试,鼓励大家帮忙发现版本问题。
我们来看看怎么做这个题目。
首先,张小白在 张小白教你在AI1S云服务器上安装昇腾CANN5.0.4 https://bbs.huaweicloud.com/blogs/320903
这篇博客里面介绍了如何安装CANN 5.0.4的版本,现在我们就基于这个版本, 来看看如何在推理服务器AI1S上完成单算子的调用。
(所谓的推理服务器这里指的是基于昇腾Ascend310的云服务器)
一、跑通样例工程 om+aclopExecuteV2 (conv2d算子)
首先,使用MobaXTerm登陆 前面链接安装好CANN 5.0.4的云服务器
下载样例代码:
解压:tar -zxvf aclop_samples.tar.gz
。。。
解压后有两个目录:
conv2d_aclopExecuteV2是使用om模型+aclopExecuteV2的方式完成单算子计算;
conv2d_aclopCompileAndExecute是直接使用aclopCompileAndExecute的方式完成单算子计算。
我们先跑通第一个样例:
cd conv2d_aclopExecuteV2/out
执行单算子代码:test.sh
它会自动下载和安装tensorflow1.15.
这里首先报了个找不到libmsprof.so的错,这个应该是profiling脚本对应的路径不对,待会儿再说。
但是这个下载的速度往往会很慢,所以可以暂停掉这个脚本,手工指定pip源安装tensorflow1.15.
pip3 install tensorflow==1.15.0 --user -i https://pypi.tuna.tsinghua.edu.cn/simple
但是这个结果有很大的问题。矩阵的结果应该是全0才对。
经过咨询CANN的大毛老师和句号老师,确认在CANN 5.0.4环境装完之后,变量存在问题,需要把~/.bashrc文件中 setenv.sh后面的环境变量都注释掉方可正常运行:
另外,前面提到的msprof.py找不到的问题,我们来找一下:
所以,需要把 /home/HwHiAiUser/aclop_samples/conv2d_aclopExecuteV2/out 目录下的 parse_profiling.sh代码做对应的修改:
(当然后面会发现,这样的修改还是不够的。但是至少现在跑能把代码跑通)
张小白在这里简单的介绍一下的大致流程:
1.随机产生2个输入数据和1个输出数据(貌似输出数据没用),并将输入数据和输出数据写入文件
2.使用src/main.cpp编译好的 out/main代码完成单算子的可执行代码
3.执行Tensorflow 1.15同样的conv算子代码computebytf.py,这个代码中会比较两个结果的异同。如果结果相同,那么就会显示全0(故而前面算出一大堆非0数据就说明算子计算的结果不一致)
4.处理profiling文件供性能分析。
我们还需要修改一下src/CMakeList.txt文件:
将生成文件的目录改为 ../out
将include的路径加上 /home/HwHiAiUser/Ascend/ascend-toolkit/latest/x86_64-linux/fwkacllib/include/
将libpath的路径加上 /home/HwHiAiUser/Ascend/ascend-toolkit/latest/x86_64-linux/fwkacllib/lib64/stub/
如下所示:
先来编译
cmake .
make clean
make
我们来运行一下:
cd /home/HwHiAiUser/aclop_samples/conv2d_aclopExecuteV2/out
bash test.sh
结果是全0,表示昇腾算子跟tensorflow算子算出的是一样的。
当然,最后一句还是错误的。
经过句号老师的解释,5.0.4版本的msprof,必须写PROF开头的目录名称。而不能写 .(当前目录)作为参数名称。
根据前面生成的目录名称:
修改如下:
再单独执行一下:
但是其实这个shell是有问题的。因为每次执行bash test.sh之后,都会生成一个新的PROF开头的目录,而这个shell不能反复地去修改这个目录名称吧?所以我们只好暂时把问题放到一边。
二、跑通样例工程 aclopCompileAndExecute (conv2d算子)
再看看第二种:conv2d_aclopCompileAndExecute的用法:
cd /home/HwHiAiUser/aclop_samples/conv2d_aclopCompileAndExecute/out
先把代码清理下:
rm -rf PROF*
rm -rf *.in *.out
rm -f main main_om
cd ../src
将CMakeList.txt做同样的修改。
cmake .
make clean
make
cd /home/HwHiAiUser/aclop_samples/conv2d_aclopCompileAndExecute/out
执行单算子代码:
除了之后解析profiling的问题,前面都是OK的。
当然,也可以像上面一样修正下 parse_profiling.sh:
然后手工执行一次:
这个profiling以后再说。
从现象上看,样例代码都跑完了。
三、跑通作业 om+aclopExecuteV2 (sub算子)
那么,这个作业到底怎么做呢?我们来找一个 Ascend和TF都有的算子做作业吧.
打开
https://support.huaweicloud.com/oplist-cann504alpha3infer/atlas_11_operatorlist_0001.html
查看CANN的310算子清单:
下载后是个chm文件(HTML帮助文件).这么老的格式貌似已经不容易打开了:
打开 https://support.huaweicloud.com/oplist-cann504alpha3infer/operatorlist_0070.html
找到支持TF1.15的算子清单
挑一个样例工程中没有的.
找一个Maxinum吧.
前面那个CHM文档看不到右边具体内容,经姐夫丁大大提醒,,需要右键属性->解锁..
于是打开了相关的算子介绍页面:
当然,张小白感觉到Maxinum算子可能有点难度,就选择了比较简单的sub算子,对应TF里面是subtract算子。
怎么做呢?其实就是个依葫芦画瓢的过程:
先将conv2d_aclopExecuteV2 代码复制一份,更名为sub_aclopExecuteV2
cp -r conv2d_aclopExecuteV2 sub_aclopExecuteV2
用om转为离线模型,调用(atc-》加载aclopSetMdelDir/aclopLoad->执行aclopExecuteV2 这种方法做一下
先进入model目录,清理下:
然后将op_list.json改为以下内容:
先用小的shape试一下.
从原理上说,
Sub(x,y)=x-y
Sub的算法是支持float16, float32和int32三种数据类型.
输入时2个参数,输出1个参数
算子输入支持所有shape,输出shape与输入shape相同
算子输入支持的format为:NCHW,NC1HWC0,NHWC,ND。
我们就用float16做一个转换试试:
atc --singleop=./op_list.json --output=./ --soc_version=Ascend310
单算子om文件已经生成(文件名挺长的)
再切换到 /home/HwHiAiUser/aclop_samples/sub_aclopExecuteV2/ 目录
make clean
rm cmake_install.cmake CMakeCache.txt
rm -rf CMakeFiles
切换到 /home/HwHiAiUser/aclop_samples/sub_aclopExecuteV2/src 目录
make clean
rm cmake_install.cmake CMakeCache.txt
rm -rf CMakeFiles
这里的目的是将conv2d的代码编译的结果清理下.
我们开始修改下main.cpp代码.
主要原则是将conv2d的代码改为sub的代码.
都是2个输入,1个输出.就是shape不一样,而且没有attr,其实也比较好改:
然后我们开始编译目标代码:
cmake .
make clean
make
将out目录也清理一下:
rm -rf PROF*
rm -f *.in
将test代码加上一些计时处理,并将生成随机数的shape按照main.cpp对应的shape调整一下:
同理修改parse_profiling文件(以后不再赘述)
执行一下看看:
从前面的代码可以看出,SUB(X-Y)是tensorflow算子算出的结果,C是昇腾算子计算后保存到文件再读出来的结果,两个是一模一样的。
这就顺利跑完了 om+aclopExecuteV2的例子。
四、跑通作业 aclopCompileAndExecute (sub算子)
同样先修改主程序main.cpp
cd /home/HwHiAiUser/aclop_samples/sub_aclopCompileAndExecute/src
vi main.cpp
像上个例子一样的方式清理环境之后,开始编译:
切换到out目录:
cd /home/HwHiAiUser/aclop_samples/sub_aclopCompileAndExecute/out
同样修改test.sh
这回简单点,不加计时的语句了:
开始验证:
除了profiling处理,执行是没有问题的。
这其实就已经把作业大致完成了。
对于profiling的问题,其实可以提一个issue。以前版本可以解析当前目录下的相关记录,生成profiling分析数据,现在需要写死目录名方可。这确实是一种退步,也不知道CANN团队是怎么想的。。因为每次生成的目录名都在变,我这个shell怎么写才能捕捉每次的变化目录名?
好吧。先这样吧。张小白先大体上完成这个作业,还有其他的事情要做呢。
(全文完,谢谢阅读)
- 点赞
- 收藏
- 关注作者
评论(0)