模型的输入和输出数据结构准备
关于准备模型输入、输出数据结构的接口调用流程,请依次参见主要接口调用流程、基本的模型执行流程、准备模型执行的输入/输出数据结构。
基本原理
AscendCL提供了以下数据类型来描述模型、模型输入、模型输出以及存放数据的内存,在模型执行前,需要构造好这些数据类型,作为模型执行的输入:
- 使用aclmdlDesc类型的数据描述模型基本信息(例如输入/输出的个数、名称、数据类型、Format、维度信息等)。
模型加载成功后,用户可根据模型的ID,调用aclmdlGetDesc接口获取该模型的描述信息,进而从模型的描述信息中获取模型输入/输出的个数、内存大小、维度信息、Format、数据类型等信息,可参见aclmdlDesc类型下的操作接口。
- 使用aclmdlDataset类型的数据描述模型的输入/输出数据,模型可能存在多个输入、多个输出。
调用aclmdlDataset类型下的操作接口添加aclDataBuffer类型的数据、获取aclDataBuffer的个数等。
- 每个输入/输出的内存地址、内存大小用aclDataBuffer类型的数据来描述。
调用aclDataBuffer类型下的操作接口获取内存地址、内存大小等。
示例代码
您可以从样例介绍中获取完整样例代码。
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。
//1 根据模型的ID,获取该模型的描述信息。 //modelDesc_为aclmdlDesc类型。 modelDesc_ = aclmdlCreateDesc(); ret = aclmdlGetDesc(modelDesc_, modelId_); //2 准备模型推理的输入数据结构 //(1)申请输入内存 size_t modelInputSize; void *modelInputBuffer = nullptr; //当前示例代码中的模型只有一个输入,所以index为0,如果模型有多个输入,则需要先调用aclmdlGetNumInputs接口获取模型输入的数量 modelInputSize = aclmdlGetInputSizeByIndex(modelDesc_, 0); aclRet = aclrtMalloc(&modelInputBuffer, modelInputSize, ACL_MEM_MALLOC_NORMAL_ONLY); //(2)准备模型的输入数据结构 //创建aclmdlDataset类型的数据,描述模型推理的输入,input_为aclmdlDataset类型 input_ = aclmdlCreateDataset(); aclDataBuffer *inputData = aclCreateDataBuffer(modelInputBuffer, modelInputSize); ret = aclmdlAddDatasetBuffer(input_, inputData); //3 准备模型推理的输出数据结构 //(1)创建aclmdlDataset类型的数据,描述模型推理的输出,output_为aclmdlDataset类型 output_ = aclmdlCreateDataset(); //(2)获取模型的输出个数. size_t outputSize = aclmdlGetNumOutputs(modelDesc_); //(3)循环为每个输出申请内存,并将每个输出添加到aclmdlDataset类型的数据中. for (size_t i = 0; i < outputSize; ++i) { size_t buffer_size = aclmdlGetOutputSizeByIndex(modelDesc_, i); void *outputBuffer = nullptr; aclError ret = aclrtMalloc(&outputBuffer, buffer_size, ACL_MEM_MALLOC_NORMAL_ONLY); aclDataBuffer* outputData = aclCreateDataBuffer(outputBuffer, buffer_size); ret = aclmdlAddDatasetBuffer(output_, outputData); } //......
父主题: 模型推理基本场景