昇腾AscendCL推理应用开发入门教程(基于Python语言)
pyACL(Python Ascend Computing Language)是一套在AscendCL的基础上使用CPython封装得到的Python API库,使用户可以通过Python进行昇腾AI处理器的运行管理、资源管理等,实现在昇腾CANN平台上进行深度学习推理计算、图形图像预处理、单算子加速计算等能力。
了解了这些大步骤后,下面我们再展开来说明开发应用具体涉及哪些关键功能?各功能又使用哪些pyACL接口,这些pyACL接口怎么串联?
虽然此时您可能不理解所有细节,但这也不影响,通过快速入门旨在先了解整体的代码逻辑,后续再深入学习,了解其它细节。
工程创建
首先,在开发环境中下创建“first_app”代码目录。
准备测试数据,本次样例需要使用两张动物图片,请从以下链接获取,将下载好的图片上传至“first_app/data”目录。
准备模型数据,将ONNX模型下载至“model”目录。
模型转换,对于开源框架的模型,不能直接在昇腾AI处理器上进行推理,需要使用ATC(Ascend Tensor Compiler)工具将开源框架的网络模型转换为适配昇腾AI处理器的离线模型(*.om文件)。
执行以下命令(以昇腾AI处理器为例),将原始模型转换为昇腾AI处理器能识别的*.om模型文件。请注意,执行命令的用户需具有命令中相关路径的可读、可写权限。
− --model:ResNet-50网络的模型文件的路径。
− --framework:原始框架类型。5表示ONNX。
− --output:resnet50.om模型文件的路径。请注意,记录保存该om模型文件的路径,后续开发应用时需要使用。
− --input_shape:模型输入数据的shape。
− --soc_version:昇腾AI处理器的版本。
应用开发
在“first_app”目录下创建“first_app.py”文件并依次写入以下内容。
步骤 1 引入pyACL必要的模块,定义pyACL常量。
步骤 2 定义模型对象。
网络模型对象中应当包含以下函数。
初始化函数。
执行推理任务函数。
析构函数。
对于后续的使用,用户只需要调用网络模型中的forward函数,传入对应的输入数据即可获得相应的输出。
步骤 3 实现初始化方法,具体涉及以下步骤(请在net类中实现)。
1. 调用acl.init接口进行初始化,在使用pyACL开发应用时,需要先初始化pyACL(在完成所有pyACL接口调用后,还需进行去初始化)。初始化时,也可通过JSON配置文件,向初始化接口传入配置参数(例如,传入性能相关的采集信息配置)。
2. 通过ID,调用acl.rt.set_device接口指定具体的计算设备(Device)。
3. 加载模型。
a. 在此处样例选择调用acl.mdl.load_from_file接口加载om模型文件。
b. 调用acl.mdl.create_desc接口创建模型描述信息。
c. 根据加载成功的模型ID,调用acl.mdl.get_desc接口获取该模型的描述信息。
4. 创建输入数据集与输出数据集,对应方法在步骤4中实现。
步骤 4 实现数据集创建方法(请在net类中实现)。
在调用pyACL接口进行模型推理时,模型推理有输入、输出数据,输入、输出数据需要按照pyACL规定的数据类型存放。相关数据类型如下:
使用aclmdlDesc类型的数据描述模型基本信息(例如输入/输出的个数、名称、数据类型、Format、维度信息等)。
模型加载成功后,用户可根据模型的ID,调用该数据类型下的操作接口获取该模型的描述信息,进而从模型的描述信息中获取模型输入/输出的个数、内存大小、维度信息、Format、数据类型等信息。
使用aclDataBuffer类型的数据来描述每个输入/输出的内存地址、内存大小。
调用aclDataBuffer类型下的操作接口获取内存地址、内存大小等,便于向内存中存放输入数据、获取输出数据。
使用aclmdlDataset类型的数据描述模型的输入/输出数据。
模型可能存在多个输入、多个输出,调用aclmdlDataset类型的操作接口添加多个aclDataBuffer类型的数据。
步骤 5 实现同步推理方法(请在net类中实现)。
步骤 6 实现析构方法(请在net类中实现)。
1. 销毁数据集资源(buffer数据、buffer内存、输入数据集、输出数据集)。
2. 销毁模型描述、卸载模型。
3. 释放计算资源。
4. 所有pyACL接口调用结束后(或在进程退出前),调用acl.finalize接口进行pyACL进行去初始化。
在推理过程中可能会抛出异常,请将资源释放步骤实现在析构方法中确保资源能够得到正确释放。以下内容仅供参考,实际情况下需要考虑更多情况下的资源释放问题。
步骤 7 实现图像预处理函数。
步骤 8 调用forward函数(具体实现请参见步骤5),执行同步推理并在屏幕中打印top5类别编号及置信度。
----结束
运行应用
将编写好的“first_app”文件夹及内容上传到运行环境,进入到代码目录下,检查环境变量配置是否正确,然后执行以下命令。
可以得到如下输出,分别为两张测试图片的top5分类信息。
其中[161]: 0.809159表示的是类别标识索引“161”的置信度为“0.809159”。
说明:类别标签和类别的对应关系与训练模型时使用的数据集有关,本样例使用的模型是基于imagenet数据集进行训练的,您可以在互联网上查阅对应数据集的标签及类别的对应关系。 当前屏显信息中的类别标识与类别的对应关系如下: "161": ["basset", "basset hound"] "162": ["beagle"] "163": ["bloodhound", "sleuthhound"] "166": ["Walker hound", "Walker foxhound"] "167": ["English foxhound"]
这样,我们就完成了一个简单的推理应用程序的开发和运行,感兴趣的小伙伴可以参考以下资料完成更系统的学习:
− 获取学习文档:请单击
− 获取更多样例,请单击
− 获取在线视频课程,请单击
- 点赞
- 收藏
- 关注作者
评论(0)