基本模型推理流程
1. 调用 aclmdlCreateDesc 接口时,模型ID通过对模型文件的加载获得
2. 调用 aclmdlGetDesc 接口根据模型加载中返回的模型ID获取模型基本信息。
3. 对模型推理输入/输出数据的准备
- 如模型存在多个输入、输出时,可调用 aclmdlGetNumInputs、aclmdlGetNuOutputs 接口获取输入、输出个数
- 模型每个输入、输出所需的内存大小,用户可调用 aclmdlGetInputSizeByIndex、aclmdlGetOutputSizeByIndex 接口获取。如果模型的输入涉及动态Batch、动态分辨率、动态维度(ND格式)等特性,输入tensor数据的Shape支持多种档位,在模型执行前才能确定,因此该输入所需的内存大小建议用户调用 aclmdlGetInputSizeByIndex 接口获取,该接口获取的是最大档位的内存,确保内存够用。
- 模型存在多个输入、输出时,用户在向 aclmdlDataset 中添加 aclDataBuffer 时,为避免顺序出错,可以先调用 aclmdlGetInputNameByIndex、aclmdlGetOutputNameByIndex 接口获取输入、输出的名称,根据输入、输出名称所对应的index的顺序添加。
- 使用 aclmdlDesc 类型的数据描述模型基本信息(例如输入/输出的个数、名称、数据类型、Format、维度信息等),使用 aclmdlDataset 类型的数据描述模型的输入/输出数据,模型可能存在多个输入、多个输出,每个输入/输出的内存地址、内存大小用 aclDataBuffer 类型的数据来描述。
4. 参数设置:动态batch、动态分辨率、动态维度(ND格式)
在对同一模型进行参数设置时,不能同时调用aclmdlSetDynamicBatchSize接口设置动态Batch、调用aclmdlSetDynamicHWSize接口设置动态分辨率、调用aclmdlSetInputDynamicDims接口设置动态维度的维度值。
5. 模型推理执行
对于固定的多Batch场景,需要满足Batch数后,才能将输入数据发送给模型进行推理。不满足Batch数时,用户需根据自己的实际场景处理。
- 同步推理:调用 aclmdlExecute 接口
- 异步推理:调用 aclmdlExecuteAsync 接口,并调用 acltrSynchronizeStream 接口阻塞Host运行,直到指定Stream中的所有任务全部完成
6. 获取模型推理结果
- 同步推理,直接获取模型推理的输出数据;
- 异步推理,需在实现Callback功能时,在回调函数中获取模型推理结果
./msame --model "$HOME/msame/resnet_50.om" --input "$HOME/msame/data" --output "$HOME/msame/out/" --outfmt TXT
[INFO] acl init success
[INFO] open device 0 success
[INFO] create context success
[INFO] create stream success
[INFO] get run mode success
[INFO] load model "$HOME/msame/resnet_50.om" success
[INFO] create model description success
[INFO] get input dynamic gear count success
[INFO] create model output success
./output/202234_12_58_29_218043
[INFO] model execute success
Inference time: 1.963ms
[INFO] get max dynamic batch size success
[INFO] output data success
Inference average time: 1.963000 ms
[INFO] destroy model input success
[INFO] unload model success, model Id is 1
[INFO] Execute sample success
[INFO] end to destroy stream
[INFO] end to destroy context
[INFO] end to reset device is 0
[INFO] end to finalize acl
7. 释放内存
调用 aclrtFree 接口来释放设备上的内存
8. 释放相关数据类型的数据
在模型推理结束后,需尽快调用 aclDestroyDataBuffer 接口和 aclmdlDestroyDataset 接口释放描述模型输入的数据,且必须按如下顺序:先调用 aclDestroyDataBuffer 接口,再调用 aclmdlDestroyDataset 接口。如果存在多个输入、输出,则调用多次 aclDestroyDataBuffer 接口。