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

模型推理

一个典型的离线模型推理计算过程,包括以下几个阶段。

模型初始化

通过重载Engine初始化函数Engine::Init,调用AIModelManager::Init接口实现离线模型加载或其他初始化动作。

  • 从文件加载离线模型:
        AIModelManager model_mngr;
        AIModelDescription model_desc;
        AIConfig config;
        /* 校验输入文件路径是否合法
           路径部分:支持大小写字母、数字、下划线
           文件名部分:支持大小写字母、数字、下划线和点(.)  */
        model_desc.set_path(MODEL_PATH);
        model_desc.set_name(MODEL_NAME);
        model_desc.set_type(0);
        vector<AIModelDescription> model_descs;
        model_descs.push_back(model_desc);
        // AIModelManager Init
        AIStatus ret = model_mngr.Init(config, model_descs);
        if (SUCCESS != ret)
        {
            printf("AIModelManager Init failed. ret = %d\n", ret);
            return -1;
        }
  • 从内存加载离线模型:
        AIModelManager model_mngr;
        AIModelDescription model_desc;
        vector<AIModelDescription> model_descs;
        AIConfig config;
        model_desc.set_name(MODEL_NAME);
        model_desc.set_type(0);
        char *model_data = nullptr;
        uint32_t model_size = 0;
        ASSERT_EQ(true, Utils::ReadFile(MODEL_PATH.c_str(), model_data, model_size));
        model_desc.set_data(model_data,model_size);  //model_size必须与模型实际大小保持一致。
        model_desc.set_size(model_size);
        AIStatus ret = model_mngr.Init(config, model_descs);
        if (SUCCESS != ret)
        {
            printf("AIModelManager Init failed. ret = %d\n", ret);
            return -1;
        }
    }

模型运行内存管理

系统自动分配模型运行所需内存(包括存放输入输出等数据的工作内存和存放权值数据的权值内存)。如果用户需要指定内存(例如自行读写权值内存用于在线动态更新权值),可以在重载实现Engine::Init接口时,调用模型运行内存配置接口。

该接口调用流程和接口调用示例请参考《Ascend 310 Matrix API参考》中的“模型运行内存配置接口”模型运行内存配置接口。

模型推理对输入图片的要求

  • 一般情况下,Caffe模型对输入图片数据的要求为NCHW排布,TensorFlow对输入图片数据的要求为NHWC排布。但是使用模型转换后的离线模型进行推理时,对输入图片数据有特定的要求:模型转换没有开启AIPP功能的情况下,要求图片数据为NCHW排布,因此需要把NHWC排布的原始图片数据自行转换为NCHW排布;模型转换开启AIPP功能的情况下,如果是YUV输入,不涉及数据排布,但如果是RGB888输入,要求图片数据为NHWC排布。

    如何查看离线模型对输入图片数据排布要求,请参考“常见问题”。

  • 模型转换没有开启AIPP功能的情况下,离线模型推理对输入图片的格式要求与模型训练时使用的图片格式保持一致,例如RGB格式;模型转换开启AIPP功能的情况下,AIPP对输入图片格式要求为:YUV420SP_U8、XRGB8888_U8、RGB888_U8、YUV400_U8。
  • 对于同一个模型,若使用同一个数据集中的图片做推理,则图片尺寸应该保持一致。

创建输入输出Tensor

设置模型推理的输入输出时,有几个注意点:

  • Matrix框架定义IAITensor类,用于管理模型推理的输入与输出矩阵。为了便于使用,Matrix框架基于IAITensor,派生出了AISimpleTensor和AINeuralNetworkBuffer。
  • 模型推理的输入和输出采用HIAI_DMalloc接口申请,可减少一次内存拷贝,内存管理相关介绍请参考内存管理

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

  1. 调用AIModelManager::GetModelIOTensorDim接口获取推理模型的输入输出Tensor描述。
    std::vector<hiai::TensorDimension> inputTensorDims;
    std::vector<hiai::TensorDimension> outputTensorDims;
    ret = modelManager->GetModelIOTensorDim(modelName, inputTensorDims, outputTensorDims);
  2. 设置输入。如果有多个输入,依次创建并设置。
    std::shared_ptr<hiai::AISimpleTensor> inputTensor =
    std::shared_ptr<hiai::AISimpleTensor>(new hiai::AISimpleTensor());
    inputTensor->SetBuffer(<输入数据的内存地址>, <输入数据的长度>);
    inputTensorVec.push_back(inputTensor);

    也可以使用AITensorFactory::CreateTensor、AIModelManager::CreateInputTensor接口设置输入Tensor。

  3. 调用AITensorFactory::CreateTensor接口设置输出。

    也可以使用AIModelManager::CreateOutputTensor接口设置输出Tensor。

    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);
    }

模型推理计算

调用AIModelManager::Process接口进行模型推理。

virtual AIStatus Process(AIContext &context, const std::vector<std::shared_ptr<IAITensor>> &in_data, std::vector<std::shared_ptr<IAITensor>> &out_data, uint32_t timeout);

模型推理其他注意点:

  • Matrix框架提供了同步推理和异步推理两种方式,默认为同步推理,可通过AIModelManager::SetListener设置模型管理回调函数实现异步推理。
  • 如需实现多模型推理,在调用Process函数前,需要调用AddPara函数分别设置每个模型的名称:
    ai_context.AddPara("model_name", modelName);//多模型,一定要分别设置模型名称
    ret = ai_model_manager_->Process(ai_context,
            inDataVec, outDataVec_, 0);
分享:

    相关文档

    相关产品

关闭导读