【MindStudio训练营第一季】MindStudio AscendCL开发
AscendCL简介
AscendCL 主要接口调用流程
使用MindStudio实现基于ResNet-50的分类应用
从gitee中下载工程文件,该样例基于Caffe ResNet-50网络(单输入、单Batch)实现图片分类的功能。
在该样例中:
- 先使用样例提供的脚本transferPic.py,将2张*.jpg图片都转换为*.bin格式,同时将图片从1024*683的分辨率缩放为224*224。
- 加载离线模型om文件,对2张图片进行同步推理,分别得到推理结果,再对推理结果进行处理,输出top5置信度的类别标识。
目录结构
1 | ├── data |
获取模型文件和权重文件
首先需要根据README中的下载链接获得ResNet-50的模型文件和权重文件,由于是基于Caffe训练得到的,所以文件分别为resnet50.prototxt
和resnet50.caffemodel
模型转换
MindStudio提供可视化模型转换窗口Ascend -> Model Converter
,并选择模型文件,如下图,将生成模型保存至工程根目录下的model文件夹中。
自动生成ATC命令
转换输出
配置构建
构建 -> Edit Configurations
,Toolchain选择远程ECS。构建注意 工程目录 不能存在中文字符
编译结束
配置运行
运行 -> 编辑配置
,配置目录。
图片转换
模型读取的是BIN格式图片,因此需要将JPEG图片转为图片。
将script
下的transferPic.py
移动到data
下,运行转换,将生成的BIN文件同步到远程服务器。
运行
代码分析
transferPic.py
该脚本主要是读取.jpg
格式图片,缩放到256*256
大小再转为numpy格式后中心裁剪到224*224
,色域由RGB转为BGR,数值中心化
1 | input_image = Image.open(input_path) |
main.cpp
主函数入口很简单,主要创建sampleProcess
对象,完成初始化并调用。
1 | SampleProcess sampleProcess; |
sampleProcess
-
InitResource
实现ACL初始化,设置device,创建context、stream,设置rum mode1
2
3
4
5
6
7
8
9
10const char *aclConfigPath = "../src/acl.json";
aclError ret = aclInit(aclConfigPath);
ret = aclrtSetDevice(deviceId_);
ret = aclrtCreateContext(&context_, deviceId_);
ret = aclrtCreateStream(&stream_);
aclrtRunMode runMode;
ret = aclrtGetRunMode(&runMode);
g_isDevice = (runMode == ACL_DEVICE); -
Process
该方法主要是创建ModelProcess
对象,加载模型、创建模型描述信息、创建模型输入和输出、运行模型。1
2
3
4
5
6
7
8
9
10
11
12
13
14ModelProcess modelProcess;
const char* omModelPath = "../model/resnet50.om";
Result ret = modelProcess.LoadModel(omModelPath);
ret = modelProcess.CreateModelDesc();
ret = modelProcess.GetInputSizeByIndex(0, devBufferSize); // 获取输入尺寸
aclError aclRet = aclrtMalloc(&picDevBuffer, devBufferSize, ACL_MEM_MALLOC_NORMAL_ONLY); // 分配内存
ret = modelProcess.CreateInput(picDevBuffer, devBufferSize);
ret = modelProcess.CreateOutput();
ret = modelProcess.Execute();
<!-- 销毁对象和内存 -->
model_process
-
LoadModel
查询模型大小 -> 申请内存(模型和权重) -> 内存加载模型 -
CreateModelDesc
创建Desc -> 获取Desc -
GetInputSizeByIndex
获取模型输入大小, -
CreateInput
获取输入大小 -> 创建Dataset -> 创建Databuffer -> 添加Databuffer到Dataset -
CreateOutput
创建Dataset -> 获取输出大小 -> 创建Databuffer -> 添加Databuffer到Dataset -
Execute
执行aclmdlExecute
-
OutputModelResult
后处理(输出置信度)
获取输出 -> 从DEVICE拷贝到HOST -> 输出置信度与索引