昇腾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样例代码的结构如下:
script/transferPic.py 这里是图像的预处理,将jpg图片转成bin
om模型在推理时,需要输入的是二进制的bin文件,所以这里要提前进行转换,查看这个python的源码:
这里使用了Pillow库将图片resize之后,图像排列由rgb转为bgr,然后减均值,最后保存成bin文件。
主函数,程序入口:
实例化类SampleProcess,这个类里面实现了acl的初始化和模型的推理,还有后处理即罗列top1~top5类别的置信度。
Result SampleProcess::InitResource()
此处代码实现acl的初始化、setDevice、创建Context和stream、设置runMode。
关于runMode,可以理解为我们最终的二进制文件需要在运行环境上执行时,是直接在Device侧运行,还是在Host侧运行,相应的一些acl接口应该存在差异,所以这里要区分一下。
Result SampleProcess::Process()
这里就是加载om模型和传入输入图片bin文件,然后进行推理,后处理得到top1~top5分类置信度。
processModel.Execute(),这里就是模型执行推理的地方,如果想知道单纯的芯片推理性能,可以在这个语句前后打点,然后计算耗时是多少ms得到。
这个cpp里面包含的都是模型的加载、卸载、输入和输出的初始化操作,包括内存分配与释放。
这里通过aclrtMalloc接口申请内存的时候,注意红框的地方,都是大页内存优先,应该是性能更优。
这个cpp里面放的是读取bin文件的函数和获取device侧buffer,感觉好像没用到,不太清楚干啥用的。
acl接口的文档可以参考下面这个链接:
个人感觉ACL这一套接口很强大,可以很方便的调用硬件底层能力,这个文档里面还有很多应用开发样例可以参考,非常nice。
Ascend官方Modelzoo:
https://gitee.com/ascend/modelzoo
- 点赞
- 收藏
- 关注作者
评论(0)