[干货分享] Mindstudio官方样例源码解读之---Resnet50

   作为初学者,最近刚接触Ascend200DK,按照官方的指导一步步搭建起了开发+运行环境,指导可以参考下面这个链接:

https://gitee.com/lovingascend/quick_start/blob/master/Atlas200DK_separate_MD/environment.md

运行的第一个样例就是Mindstudio自带的Resnet50网络,对晟腾AI处理器的强大性能尤为印象深刻。个人习惯会去研究一下

源码,这里分享下心得体会,能力有限,水平一般,如果哪里写的不对的,还请各位专家和大牛指正。

   对于Mindstudio开发套件,个人理解作用是提供一个简单方便的界面,让代码开发和调试更加顺畅,

Mindstudio安装在开发环境Ubuntu18.04系统,而我们最终编译出来的二进制文件要跑在运行环境的CentOS上面,如果没有Mindstudio的话,

我们要不就是直接在运行环境上编译,要不就得在开发环境上搭建交叉编译环境,而使用Mindstudio在编译的时候,

直接就可以选定目标版本和ARM or X86架构,节省了不少时间。然后推理的依赖文件、输出结果,Mindstudio工具可以进行方便的内部传输,

不用手工再用scp或者sftp之类的操作互传。另外还有profiling工具进行性能调优等功能强大的组件,暂时没用到,后面再深入体会。

  Resnet50样例代码的结构如下:

image.png

1、script/transferPic.py  这里是图像的预处理,将jpg图片转成bin

om模型在推理时,需要输入的是二进制的bin文件,所以这里要提前进行转换,查看这个python的源码:

image.png

这里使用了Pillow库将图片resize之后,图像排列由rgb转为bgr,然后减均值,最后保存成bin文件。

2、src/main.cpp

主函数,程序入口

image.png

实例化类SampleProcess,这个类里面实现了acl的初始化和模型的推理,还有后处理即罗列top1~top5类别的置信度。

3、src/sampleprocess.cpp

Result SampleProcess::InitResource()

image.png

此处代码实现acl的初始化、setDevice、创建Context和stream、设置runMode。

关于runMode,可以理解为我们最终的二进制文件需要在运行环境上执行时,是直接在Device侧运行,还是在Host侧运行,

相应的一些acl接口应该存在差异,所以这里要区分一下。

Result SampleProcess::Process()

image.png

这里就是加载om模型和传入输入图片bin文件,然后进行推理,后处理得到top1~top5分类置信度。

image.png

121行 processModel.Execute(),这里就是模型执行推理的地方,如果想知道单纯的芯片推理性能,可以在这个语句前后打点,然后计算耗时是多少ms得到。

4、src/model_process.cpp

image.png

这个cpp里面包含的都是模型的加载、卸载、输入和输出的初始化操作,包括内存分配与释放

image.png

这里通过aclrtMalloc接口申请内存的时候,注意红框的地方,都是大页内存优先,猜想应该是性能更优。

5、src/utils.cpp

这个cpp里面放的是读取bin文件的函数和获取device侧buffer,感觉好像没用到,不太清楚干啥用的。


acl接口的文档可以参考下面这个链接:

https://support.huaweicloud.com/adevg-A200dk_3000/atlasdevelpment_01_0014.html

个人感觉ACL这一套接口很强大,可以很方便的调用硬件底层能力,比matrix更方便有木有,这个文档里面还有很多应用开发样例可以参考,非常nice