更新时间:2021-03-18 GMT+08:00
分享

数据后处理(调用单算子),回传结果到Host

数据后处理(图片分类)

模型推理结束后,在数据后处理阶段,处理模型推理的结果。数据后处理结束后,需及时释放相关资源。

当前示例中,使用Cast算子(将推理结果的数据类型从float32转成float16)和ArgMaxD算子(从推理结果中查找最大置信度的类别标识)实现数据后处理。

  • Cast算子被封装成ACL接口,因此在使用时,将算子的输入输出Tensor描述、算子输入输出数据的内存等信息作为aclopCast的入参,直接调用aclopCast接口加载并执行算子。
  • ArgMaxD算子没有被封装成ACL接口,因此在使用时,必须自行构造算子描述信息(输入输出Tensor描述、算子属性等)、申请存放算子输入输出数据的内存、明确算子类型名称、调用aclopExecute接口加载并执行算子。

关于其它单算子调用的方式,请参见单算子调用

示例代码

调用接口后,需增加异常处理的分支,同时通过ERROR_LOG记录报错日志、通过INFO_LOG记录各动作的提示日志,示例代码中不一一列举。

示例代码如下,您可以从acl_dvpp_resnet50样例的“src/sample_process.cpp”“src/singleOp_process.cpp”文件中查看完整样例代码。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "acl/acl.h"
//......
//循环处理每张图片,testPic是自定义的一个结构体,用于描述图片的名称picName、图片宽width、图片高height。
for (size_t index = 0; index < sizeof(testPic) / sizeof(testPic[0]); ++index) {
    //1. 在数据后处理前,先获取模型推理的输出,modelOutput表示模型推理的输出
    aclDataBuffer inputBuffer_[0] = aclmdlGetDatasetBuffer(modelOutput, 0);

    //2. 自定义函数RunSigleOpCast,构造Cast算子的输入输出Tensor描述、申请存放算子输出数据的内存devBufferCast_、调用aclopCast接口加载并执行算子
    Result ret = RunSigleOpCast();

    //3. 自定义函数RunSigleOpArgMaxD,构造ArgMaxD算子的输入输出Tensor、输入输出Tensor描述、算子属性、申请存放算子输出数据的内存devBufferArgMaxD_、调用aclopExecute接口加载并执行算子
    ret = RunSigleOpArgMaxD();

    //4.将ArgMaxD算子的输出数据回传到Host
    //4.1 根据ArgMaxD算子输出数据的大小,申请Host上的内存    
    void* hostBuffer = nullptr;
    aclError ret = aclrtMallocHost(&hostBuffer, tensorSizeArgMaxD_);

    //4.2 将ArgMaxD算子的输出数据从Device复制到Host
    ret = aclrtMemcpy(hostBuffer, tensorSizeArgMaxD_, devBufferArgMaxD_,
        tensorSizeArgMaxD_, ACL_MEMCPY_DEVICE_TO_HOST);

    //4.3 在终端窗口显示最大置信度的类别标识
    int32_t* index = static_cast<int32_t*>(hostBuffer);
    INFO_LOG("---> index of classification result is %d", *index);
    
    //5 释放资源
    //5.1 释放Host的内存
    aclrtFreeHost(hostBuffer);

    //5.2 释放Device上存放算子输出数据的内存
    (void)aclrtFree(devBufferCast_);
    (void)aclrtFree(devBufferArgMaxD_);

    //5.3 释放aclDataBuffer类型数据(用于描述算子输出数据)
    (void)aclDestroyDataBuffer(outputBufferCast_[0]);
    (void)aclDestroyDataBuffer(outputBufferArgMaxD_[0]);
//......
}
//TODO:释放运行管理资源
分享:

    相关文档

    相关产品

close