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

执行模型推理

Matrix框架提供AIModelManager类,实现模型加载和推理功能,详情请参考《Matrix API参考》。

模型推理初始化

  1. 在自定义推理模型Engine的Graph配置文件内设置模型路径(在ai_config内,添加items,设置模型在host路径)。
  2. 使用Matrix框架将模型文件传输到Device侧。
  3. 用户在自定义Engine内解析自定义items,获得模型在Device侧的路径。
  4. 调用AIModelManager::Init()完成初始化,具体实现如下:

    /* 用户自定义Engine的成员变量 */
    std::shared_ptr<hiai::AIModelManager> modelManager;
    /* 自定义Engine Init函数内实现AIModelManager初始化 */
    std::vector<hiai::AIModelDescription> model_desc_vec;
    hiai::AIModelDescription model_desc_;
    ......
    /* 从Graph配置文件的ai_config结构内,解析出模型路径 */
    model_desc_.set_path(model_path);// 设置模型路径
    model_desc_vec.push_back(model_desc_);
    ret = modelManager->Init(config, model_desc_vec);// config无意义,将Engine::Init的入参传入即可

设置模型推理输入与输出

  • Matrix框架定义IAITensor类,用于管理模型推理的输入与输出矩阵。为了便于使用,Matrix框架基于IAITensor,派生出了AISimpleTensor和AINeuralNetworkBuffer。
  • 模型推理的输入和输出采用HIAI_DMalloc接口申请,可减少一次内存拷贝。
  • Matrix框架可自动释放AISimpleTensor管理的内存,建议由用户申请和释放,防止出现内存泄露或重复释放。
  • 模型转换过程中,如启用了AIPP的抠图、格式转换、图片归一化等功能,则输入数据需经AIPP模块处理,再将处理后的数据进行真正的模型推理。

输入与输出的具体实现

输入输出的具体实现代码如下:

/* 获取推理模型的输入输出Tensor描述 */
std::vector<hiai::TensorDimension> inputTensorDims;
std::vector<hiai::TensorDimension> outputTensorDims;
ret = modelManager->GetModelIOTensorDim(modelName, inputTensorDims, outputTensorDims);

/* 设置输入, 如果设置多个输入,需要依次创建并设置 */
std::shared_ptr<hiai::AISimpleTensor> inputTensor =
std::shared_ptr<hiai::AISimpleTensor>(new hiai::AISimpleTensor());
inputTensor->SetBuffer(<输入数据的内存地址>, <输入数据的长度>);
inputTensorVec.push_back(inputTensor);

/* 设置输出 */
for (uint32_t index = 0; index < outputTensorDims.size(); index++) {
hiai::AITensorDescription outputTensorDesc = hiai::AINeuralNetworkBuffer::GetDescription();
uint8_t* buf = (uint8_t*)HIAI_DMalloc(outputTensorDims[index].size);
......
std::shared_ptr<hiai::IAITensor> outputTensor = hiai::AITensorFactory::GetInstance()->CreateTensor(
outputTensorDesc, buf, outputTensorDims[index].size);
outputTensorVec.push_back(outputTensor);
}

模型推理

  • Matrix框架提供了同步推理和异步推理两种方式,默认为同步推理,可通过设置AIContext配置项,使用回调函数实现异步推理。
    /* 模型推理 */
    hiai::AIContext aiContext;
    HIAI_StatusT ret = modelManager->Process(aiContext, inputTensorVec, outputTensorVec, 0);
  • AIModelManager对象加载多个模型,可通过设置AIContext配置项,指定模型(初始化阶段,指定的模型名),详情请参考《Matrix API参考》中的“离线模型管家”章节。

模型推理后处理

模型推理的结果矩阵,以内存+描述信息的方式保存在IAITensor对象内,用户需要根据模型的实际输出格式(数据类型和数据顺序),将内存解析成有效的输出。

/* 推理结果解析 */
for (uint32_t index = 0; index < outputTensorVec.size(); index++) {
shared_ptr<hiai::AINeuralNetworkBuffer> resultTensor = std::static_pointer_cast<hiai::AINeuralNetworkBuffer>(outputTensorVec[i]);
// resultTensor->GetNumber()  -- N
// resultTensor->GetChannel() -- C
// resultTensor->GetHeight()  -- H
// resultTensor->GetWidth()   -- W
// resultTensor->GetSize()    -- 内存大小
// resultTensor->GetBuffer()  -- 内存地址
}

常见的分类模型后处理可参考示例代码“InferClassification”,SSD目标检测模型的后处理可参考示例代码“InferObjectDetection”。

分享:

    相关文档

    相关产品