仔细想想,我使用过的昇腾AI处理器包括Ascend 310、Ascend 310P、Ascend 910,涵盖了训练和推理,也算是比较全面了。就我个人来说,希望更接近于实际应用场景,靠近用户,因而倾向于做应用开发,即将AI算法做成产品化应用。
产品化应用涉及所用硬件性能、模型在实际业务中的准确度以及适配平台或服务开发等等,我个人认为是要根据实际情况不断做调整的,比较依赖于对硬件特性的理解和经验。这里,我站在个人开发者或者说学生开发者的角度,分享下我的感受。
首先,要对待部署的模型有一定了解,知道输入节点、输入数据和排布方式,输出节点、输出数据和排布方式,在此基础上确定输入和输出的数据格式,进而明确预处理和后处理。简单来说,围绕模型,向前要知道输入和预处理,向后要知道后处理和输出。这个是核心,而至于具体操作以及所用硬件则是尽可能压榨硬件性能完成模型部署推理。
其次,了解硬件架构和特性。从经济性的角度来说,一般选择低成本而可行的硬件,而最大可能逼近硬件极限,即尽可能用更加亲和所用硬件的操作。以Ascend 310为例,考虑到具体操作计算量和无法直接调度AI Core,可以调整AI CPU和Ctrl CPU的配比来实现资源的分配,再者使用DVPP和AIPP来完成输入视频或图像的解码操作,专用硬件电路效率会更高。而这些都是要根据所用硬件来调整。
最后,从借鉴开始。初次接触,缺乏经验,这时候要多看官方仓库提供的样例代码,先按照README跑通,之后学习代码,有不懂的部分,可以自行打印出来查看,或者到昇腾论坛和仓库提问,也可以按照自己的需求,试着做些修改,并进行验证,这样一点一点尝试,慢慢搞懂,吃透代码,之后就可以基于此,进行自己想要的开发了。
下面就简单介绍下如何跑通一个简单的图片分类的官方样例。图片分类从名称上,我们能直观地看出它的作用:按图片所属的类别来区分图片。
那么图片分类是怎么做到这一点的呢?首先要有一个能做到图片分类的模型,我们可以直接使用一些训练好的开源模型,也可以基于开源模型的源码根据我们的需求进行修改,并重新训练,甚至可以去构建适合自己的模型。鉴于我们是跑通就行,此处我们直接使用官方已训练好的开源模型,毕竟这样最简单,也最快。我们以基于Caffe框架的开源模型ResNet-50模型为例说明其输入、输出,以便理解后续的开发场景,先来介绍下输入和输入:
模型对输入要求:输入图片的编码格式为RGB、分辨率为224*224。
模型的输出:Top5置信度的类别标签及其对应置信度。
这个样例是基于Caffe ResNet-50网络(单输入、单Batch)实现图片分类的功能。在该样例中:
先使用样例提供的脚本transferPic.py,将2张*.jpg图片都转换为*.bin格式,同时将图片从1024683的分辨率缩放为224224。
加载离线模型om文件,对2张图片进行同步推理,分别得到推理结果,再对推理结果进行处理,输出top5置信度的类别标识。在加载离线模型前,提前将Caffe ResNet-50网络的模型文件转换为适配昇腾AI处理器的离线模型。
好了,我们来运行看看,先来准备下环境,这里我使用的是华为云提供的ECS,规格为AI加速型 | ai1s.large.4 | 2vCPUs | 8GiB | 1 * HUAWEI Ascend 310/1 * 8G,需要特别注意的是,我们使用的是【 CANN 训练营 • 22 年度第三季】 提供的镜像6.0.RC1.alpha001_new(40GB),而关于ECS的购买和连接,大家可以到新手班学习哈,有很详细的视频介绍。
接下来,我们登录购买的ECS,这里我在本地Windows下使用MobaXterm连接,因为默认是root用户登录,而CANN运行用户是HwHiAiUser,这里我们先设置下密码,之后用HwHiAiUser登录。
先来设置密码:
passwd HwHiAiUser
在切换用户之前,我们先改下bash,执行如下命令,并在弹出的界面中选择 :
sudo dpkg-reconfigure dash
再执行如下命令:
ls -l `which sh`
若提示/bin/sh -> bash,表示修改成功。下面切换到HwHiAiUser用户:
su - HwHiAiUser
此时我们在终端看到的应该是“HwHiAiUser”开头了:
接下来下载sample 仓 代码并上传至环境。之后请先进入本次样例所在目录:
cd samples/cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification
请注意,下文中的样例目录均指以上目录。
之后获取模型,可以从以下链接中获取ResNet-50网络的模型文件(.prototxt)、权重文件(.caffemodel),并以运行用户将获取的文件上传至开发环境的“样例目录/caffe_model“目录下。如果目录不存在,需要自行创建。
ResNet-50网络的模型文件(*.prototxt):单击Link 下载该文件。
ResNet-50网络的权重文件(*.caffemodel):单击Link 下载该文件。
下面将ResNet-50原始模型转换为适配昇腾AI处理器的离线模型(*.om文件)。切换到样例目录,执行如下命令(以昇腾310 AI处理器为例):
atc --model=caffe_model/resnet50.prototxt --weight=caffe_model/resnet50.caffemodel --framework=0 --output=model/resnet50 --soc_version=Ascend310 --input_format=NCHW --input_fp16_nodes=data --output_type=FP32 --out_nodes=prob:0
如下图所示,则表示转换模型成功。
接着准备数据,请从以下链接获取该样例的输入图片,并以运行用户将获取的文件上传至开发环境的“样例目录/data“目录下。如果目录不存在,需自行创建。
https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/models/aclsample/dog1_1024_683.jpg
https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/models/aclsample/dog2_1024_683.jpg
下面切换到“样例目录/data“目录下,执行transferPic.py脚本,将*.jpg转换为*.bin,同时将图片从1024683的分辨率缩放为224224。在“样例目录/data“目录下生成2个*.bin文件。
python3.6 ../script/transferPic.py # 不是python3,以免报错
如果执行脚本报错“ModuleNotFoundError: No module named ‘PIL’”,则表示缺少Pillow库,请使用pip3 install Pillow --user命令安装Pillow库。
好了,下面只需要按照该样例的 README 继续操作就行了,最终可以得到推理结果如下图所示:
执行成功后,在屏幕上的关键提示信息示例如上图所示,提示信息中的index表示类别标识、value表示该分类的最大置信度,这些值可能会根据版本、环境有所不同,请以实际情况为准。
说明:类别标签和类别的对应关系与训练模型时使用的数据集有关,本样例使用的模型是基于imagenet数据集进行训练的,您可以在互联网上查阅imagenet数据集的标签及类别的对应关系,例如,可单击Link查看。 当前屏显信息中的类别标识与类别的对应关系如下: “161”: [“basset”, “basset hound”]、 “267”: [“standard poodle”]。
好了,至此我们就跑通了这个图片分类样例,大家感兴趣可以深入了解具体代码,还可以自己改改代码,有机会的话,我也会在讲讲后续。