CANN训练营第四期】如何在AI1S云服务上基于ACL实现单算子调用

网友投稿 818 2022-05-30

刚刚结束的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的云服务器

下载样例代码:

wget https://obs-book.obs.cn-east-2.myhuaweicloud.com/aclopsamples/aclop_samples.tar.gz

解压: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算子算出的是一样的。

【CANN训练营第四期】如何在AI1S云服务上基于ACL实现单算子调用

当然,最后一句还是错误的。

经过句号老师的解释,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怎么写才能捕捉每次的变化目录名?

好吧。先这样吧。张小白先大体上完成这个作业,还有其他的事情要做呢。

(全文完,谢谢阅读)

Ubuntu 昇腾

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【ESWIN实习】第一次培训笔记(宁宇leader主讲)
下一篇:程序员在工作中如何让自己的技能得到快速提高
相关文章