前言¶
本文档提供HiSpark.AI API的模型推理相关接口说明,该模块下的接口是非线程安全的。
不支持创建多线程多进程。
对于创建类接口(例如OH_AI_ContextCreate、OH_AI_ModelCreate等),用户在调用该类接口创建对应的资源后,建议在资源使用完成后及时调用对应的销毁类接口(例如:OH_AI_ContextDestroy、OH_AI_ModelDestroy等),以避免程序内存泄漏。
对于销毁类接口(例如OH_AI_ContextDestroy、OH_AI_ModelDestroy等),用户在调用该类接口后,不能继续使用已释放或销毁的资源,建议用户在调用销毁类接口后,将相关资源设置为无效值(例如,置为NULL)。
HiSpark.AI WS63 MCU平台默认最多支持单线程单核CPU后端推理,仅支持x86_64(用于精度调试标杆)与RISCV平台部署调用。
本文档适用于使用基于MindSpore Lite轻量化API接口进行应用开发的人员,通过本文档您可以达成:
了解HiSpark.AI轻量化API接口的功能架构、基本概念以及接口的典型调用流程。
使用HiSpark.AI轻量化API进行应用开发的基本流程和实现方法。
能够基于文档中的样例,扩展进行其他应用的开发。
掌握以下经验和技能可以更好理解本文档:
熟悉Linux基本命令;
对机器学习、人工智能有一定的了解。
具备C++/C语言程序开发能力。
在本文中可能出现下列标志,它们所代表的含义如下。
|
||
|
||
增加OH_AI_ModelGetInputByTensorName、OH_AI_ModelGetOutputByTensorName两个API接口:
|
||
|
||
简介¶
本文用于指导开发人员基于MNIST模型、利用HiSpark.AI提供的C语言API库,实现第三方开源框架(如TFLite、ONNX等)网络模型轻量化部署与推理任务。
HiSpark.AI接口定义¶
HiSpark.AI API提供了用于环境初始化、上下文配置、模型创建、推理以及Tensor创建与修改的C语言API库,供用户开发模型轻量化部署与推理应用。
基本概念¶
表 1 概念介绍
Tensor定义了MindSpore中的张量。通过MindSpore OH_AI_Tensor的接口,用户可以创建、销毁张量,也可以获取或者修改张量的属性。 |
|
获取Sample方法¶
当前MindSpore Lite提供的样例如表1所示,从mnist网络模型链接中获取mnist网络的模型文件,下载后解压得到mnist.tflite、mnist.tflite.ms.bin(mnist输入数据)、mnist.tflite.ms.out(标杆输出数据,可用于精度对比),该模型为已经训练完成的mnist分类模型。
表 1 MNIST样例列表
基于现有的HiSpark.AI轻量化API接口,实现第三方开源框架(如TFLite、ONNX等)网络模型轻量化部署与推理任务。 |
用户可下载mnist网络模型,切换到sample目录并解压。
#切换至sample目录
cd "sample安装目录"
#解压sample压缩包
tar -xvf mnist.tar.gz
接口调用流程介绍¶
本章主要介绍HiSpark.AI API接口调用流程。
接口调用流程图¶
HiSpark.AI API接口调用流程如接口调用流程图所示。

说明:
在应用开发过程中,各环节都涉及内存的申请与释放、数据传输(通过内存复制实现)、数据类型的创建与销毁,因此未在图中一一标识。
系统初始化在3322、1156E为必选步骤,在WS63为可选步骤。
在接口调用流程图中展示了应用开发中的典型功能抽象出主要接口的调用流程。当前接口调用流程覆盖模型推理、模型评估和模型训练三类典型通路。
系统初始化:通过调用OH_AI_Init/OH_AI_InitFromFile接口完成环境初始化,具体流程参见“3.2-系统配置”。
运行管理资源申请:通过调用OH_AI_ContextCreate接口申请运行管理资源,具体流程请参见“Context管理”。
模型加载:在执行模型推理、评估或训练前,需要先调用OH_AI_ModelBuild/OH_AI_ModelBuildFromFile/OH_AI_ModelBuildFromName接口将对应模型加载到系统中。具体流程参见“3.5 模型加载与执行”。
模型输入输出获取:模型加载完成后,可通过OH_AI_ModelGetInputs获取模型输入,通过OH_AI_ModelGetOutputs获取模型输出。对于评估和训练场景,还需要通过OH_AI_ModelGetLabels获取标签输入,用于计算loss或评估指标。
模型推理:在模型推理之前,需要读取bin格式数据文件并转换为模型输入。随后调用 OH_AI_ModelPredict 接口执行推理。当前仅支持 CPU 后端单核单线程推理预测。模型推理完成后,用户可根据实际需求进行数据后处理,例如将推理结果写入文件、打印预测概率,或从推理结果中找到最大置信度的类别标识。
模型评估:若需要实现模型评估功能,则需要在模型执行前准备输入数据和标签数据,调用OH_AI_ModelSetTrainMode将训练模式设置为false并调用OH_AI_ModelRunStep执行评估。评估流程通常执行前向计算和 loss / metric 计算,但不执行反向传播和权重更新。
模型训练:若需要实现模型训练功能,则需要在模型执行前准备输入数据和标签数据,调用OH_AI_ModelSetTrainMode将训练模式设置为true并调用OH_AI_ModelRunStep执行训练。训练流程通常包括前向计算、loss 计算、反向传播和权重更新。每轮或每步训练完成后,用户可读取 loss 等训练输出,用于观察训练收敛情况。训练结束后可根据实际情况选择是否保存更新后的权重数据,用于后续推理、评估或继续训练。
模型卸载:调用OH_AI_ModelDestroy接口卸载模型。
运行管理资源释放:所有数据处理完成后,需要释放运行管理资源(OH_AI_Context、OH_AI_Tensor)。具体流程请参见“3.2-系统配置3.2-系统配置、Context管理、Tensor管理”以销毁资源。
系统初始化¶
通过调用OH_AI_InitFromFile/OH_AI_Init接口,实现系统初始化。
运行管理资源申请¶
运行管理资源包含OH_AI_Context、OH_AI_Tensor,其创建的流程如图1所示。
根据上述流程,创建OH_AI_Context、OH_AI_Tensor等运行管理资源需按照如下原则来进行:
在创建OH_AI_Tensor资源时,需要调用OH_AI_GetInputs/OH_AI_GetOutputs接口,接着从返回的OH_AI_TensorHandleArray结构体中获取对应OH_AI_Tensor的句柄。
在创建OH_AI_Context资源时,需要调用OH_AI_ContextCreate接口,并获取句柄。
模型加载¶
通过调用OH_AI_ModelBuild接口,实现模型权重的自动加载。
模型执行¶
调用OH_AI_ModelGetInputs接口与OH_AI_ModelGetOutputs接口创建模型输入输出,准备模型执行的输入数据与输出数据。
调用OH_AI_ModelPredict接口做模型推理,调用OH_AI_ModelRunstep接口做模型评估或训练,详情请参见“模型加载与执行”。
获取模型推理的结果,用于后续处理。
运行管理资源释放¶
运行管理资源包含OH_AI_Context、OH_AI_Tensor,其释放的流程如图1所示。
根据上述流程,释放OH_AI_Context、OH_AI_Tensor等运行管理资源需按照如下原则来进行:
在销毁OH_AI_Tensor资源时,需要调用OH_AI_ModelDestroy接口,来销毁modelHandle所关联的OH_AI_TensorHandleArray结构体中的OH_AI_Tensor资源。
在销毁OH_AI_Context资源时,需要调用OH_AI_ContextDestroy接口。
HiSpark.AI API参考¶
接口列表¶
表 1 接口列表
系统配置¶
OH_AI_InitFromFile¶
【描述】
加载配置文件,并进行环境初始化。
【语法】
OH_AI_Status OH_AI_InitFromFile(char* config_file_path)
【参数说明】
【返回值】
枚举类型的状态码OH_AI_Status,若返回“OH_AI_Status::OH_AI_STATUS_SUCCESS”则证明成功
OH_AI_Init¶
【描述】
从内存缓冲区加载配置,并进行环境初始化。
【语法】
OH_AI_Status OH_AI_Init(void* config_data, size_t data_size)
【参数说明】
【返回值】
枚举类型的状态码OH_AI_Status,若返回“OH_AI_Status::OH_AI_STATUS_SUCCESS”则证明成功
OH_AI_Deinit¶
【描述】
去初始化。
【语法】
OH_AI_Status OH_AI_Deinit()
【返回值】
枚举类型的状态码OH_AI_Status,若返回“OH_AI_Status::OH_AI_STATUS_SUCCESS”则证明成功。
Context管理¶
OH_AI_ContextCreate¶
【描述】
创建一个OH_AI_Context。
【语法】
OH_AI_ContextHandle OH_AI_ContextCreate()
【返回值】
指向创建的OH_AI_Context的指针。
OH_AI_ContextDestroy¶
【描述】
销毁一个OH_AI_Context。
【语法】
void OH_AI_ContextDestroy(OH_AI_ContextHandle* context)
【参数说明】
Tensor管理¶
OH_AI_TensorGetDataSize¶
【描述】
获取OH_AI_Tensor的数据字节数大小。
【语法】
size_t OH_AI_TensorGetDataSize (const OH_AI_TensorHandle tensor)
【参数说明】
【返回值】OH_AI_Tensor的数据字节数大小。返回值为0说明入参为空指针。
OH_AI_TensorGetShape¶
【描述】
获取OH_AI_Tensor的张量形状。
【语法】
const int64_t *OH_AI_TensorGetShape(const OH_AI_TensorHandle tensor, size_t *shape_num);
【参数说明】
【返回值】OH_AI_Tensor的张量形状信息的内存地址。
OH_AI_TensorGetDataType¶
【描述】
获取OH_AI_Tensor的数据类型。
【语法】
OH_AI_DataType OH_AI_TensorGetDataType(const OH_AI_TensorHandle tensor)
【参数说明】
【返回值】OH_AI_Tensor的张量数据类型。
OH_AI_TensorGetElementNum¶
【描述】
获取OH_AI_Tensor的元素个数。
【语法】
int64_t OH_AI_TensorGetElementNum(const OH_AI_TensorHandle tensor)
【参数说明】
【返回值】OH_AI_Tensor的元素个数。返回值为-1说明入参为空指针。
OH_AI_TensorGetMutableData¶
【描述】
获取可变的OH_AI_Tensor的数据。
【语法】
void* OH_AI_TensorGetMutableData(const OH_AI_TensorHandle tensor)
【参数说明】
【返回值】
指向OH_AI_Tensor的可变数据的指针。
模型加载与执行¶
OH_AI_ModelCreate¶
【描述】
创建一个模型对象。
【语法】
OH_AI_ModelHandle OH_AI_ModelCreate()
【返回值】
模型对象指针。
OH_AI_ModelDestroy¶
【描述】
销毁一个模型对象。
【语法】
void OH_AI_ModelDestroy(OH_AI_ModelHandle* model)
【参数说明】
OH_AI_ModelGetInputs¶
【描述】
获取模型的输入张量数组结构体。
【语法】
OH_AI_TensorHandleArray OH_AI_ModelGetInputs(const OH_AI_ModelHandle model)
【参数说明】
【返回值】模型输入对应的张量数组结构体。
OH_AI_ModelGetOutputs¶
【描述】
获取模型的输出张量数组结构体。
【语法】
OH_AI_TensorHandleArray OH_AI_ModelGetOutputs(const OH_AI_ModelHandle model)
【参数说明】
【返回值】
模型输出对应的张量数组结构体。
OH_AI_ModelBuild¶
【描述】
从内存缓冲区加载并编译神经网络模型。
【语法】
OH_AI_Status OH_AI_ModelBuild(OH_AI_ModelHandle model, const void* model_data, size_t data_size, const OH_AI_ContextHandle model_context)
【参数说明】
说明: 当前Micro框架仅支持model_data为NULL、data_size为0。因此参数model_data必须传入NULL、参数data_size必须传入0。
【返回值】
枚举类型的状态码OH_AI_Status,若返回“OH_AI_Status::OH_AI_STATUS_SUCCESS”则证明成功。
OH_AI_ModelBuildFromFile¶
【描述】
从模型文件加载并编译神经网络模型。
【语法】
OH_AI_Status OH_AI_ModelBuildFromFile(OH_AI_ModelHandle model, const char * model_path, const OH_AI_ContextHandle model_context )
【参数说明】
【返回值】
枚举类型的状态码OH_AI_Status,若返回“OH_AI_Status::OH_AI_STATUS_SUCCESS”则证明成功。
OH_AI_ModelBuildFromName¶
【描述】
从模型名称加载并编译神经网络模型。
【语法】
OH_AI_Status OH_AI_ModelBuildFromName(OH_AI_ModelHandle model, const char * model_name, const OH_AI_ContextHandle model_context )
【参数说明】
【返回值】
枚举类型的状态码OH_AI_Status,若返回“OH_AI_Status::OH_AI_STATUS_SUCCESS”则证明成功。
OH_AI_ModelPredict¶
【描述】
执行模型推理。
【语法】
OH_AI_Status OH_AI_ModelPredict(OH_AI_ModelHandle model, const OH_AI_TensorHandleArray inputs, OH_AI_TensorHandleArray* outputs)
【参数说明】
【返回值】
枚举类型的状态码OH_AI_Status,若返回“OH_AI_Status::OH_AI_STATUS_SUCCESS”则证明成功。
OH_AI_ModelGetInputByTensorName¶
【描述】
根据指定的张量名称获取模型对应的输入张量。
【语法】
OH_AI_TensorHandle OH_AI_ModelGetInputByTensorName(const OH_AI_ModelHandle model, const char *tensor_name)
【参数说明】
【返回值】
与张量名称匹配的目标输入张量。
OH_AI_ModelGetOutputByTensorName¶
【描述】
根据指定的张量名称获取模型对应的输出张量。
【语法】
OH_AI_TensorHandle OH_AI_ModelGetOutputByTensorName(const OH_AI_ModelHandle model, const char *tensor_name)
【参数说明】
【返回值】
与张量名称匹配的目标输出张量。
OH_AI_ModelGetLabels¶
【描述】
获取模型的标签数组结构体。
【语法】
OH_AI_TensorHandleArray OH_AI_ModelGetLabels(const OH_AI_ModelHandle model)
【参数说明】
【返回值】模型标签对应的张量数组结构体。
OH_AI_ModelRunStep¶
【描述】
根据当前的训练模式,执行一次模型训练或评估步骤。
【语法】
OH_AI_Status OH_AI_ModelRunStep(OH_AI_ModelHandle model)
【参数说明】
【返回值】
枚举类型的状态码OH_AI_Status,若返回“OH_AI_Status::OH_AI_STATUS_SUCCESS”则证明成功。
OH_AI_ModelSetTrainMode¶
【描述】
设置模型训练模式。
【语法】
OH_AI_Status OH_AI_ModelSetTrainMode(OH_AI_ModelHandle model, bool mode)
【参数说明】
【返回值】
枚举类型的状态码OH_AI_Status,若返回“OH_AI_Status::OH_AI_STATUS_SUCCESS”则证明状态设置成功。
OH_AI_ModelGetTrainMode¶
【描述】
获取模型训练模式。
【语法】
OH_AI_Status OH_AI_ModelGetTrainMode(OH_AI_ModelHandle model, bool *mode)
【参数说明】
【返回值】
枚举类型的状态码OH_AI_Status,若返回“OH_AI_Status::OH_AI_STATUS_SUCCESS”则证明状态获取成功。
OH_AI_ModelSaveWeight¶
【描述】
保存模型可训练权重到指定Flash地址。
【语法】
OH_AI_Status OH_AI_ModelSaveWeight(OH_AI_ModelHandle model, uintptr_t flash_addr)
【参数说明】
【返回值】
枚举类型的状态码OH_AI_Status,若返回“OH_AI_Status::OH_AI_STATUS_SUCCESS”则证明成功。
OH_AI_ModelLoadWeight¶
【描述】
从指定Flash地址加载模型可训练权重。
【语法】
OH_AI_Status OH_AI_ModelLoadWeight(OH_AI_ModelHandle model, uintptr_t flash_addr)
【参数说明】
【返回值】
枚举类型的状态码OH_AI_Status,若返回“OH_AI_Status::OH_AI_STATUS_SUCCESS”则证明成功。
错误码¶
OH_AI_GetErrorCode¶
【描述】
获取错误码。在需要查看错误码时,调用该接口返回AI推理框架内部错误码,如:
OH_AI_ModelHandle model = OH_AI_ModelCreate();
if (model == NULL) {
int32_t ret = OH_AI_GetErrorCode();
return ret;
}
【语法】
int32_t OH_AI_GetErrorCode()
【返回值】
错误码。
Hi3322、Hi1156E错误码定义参考文档《AscendCL应用开发指南(C&C++)》
WS63错误码定义参考文档《MindSpore Lite API文档》
样例使用指导¶
WS63 CPU平台样例使用指导¶
本章节介绍如何调用HiSpark.AI API,并在x86_64平台实现mnist.tflite的部署推理。板端Sample请参考交付包中的AI Sample部署。
样例模型获取¶
请参考“获取Sample方法”章节。
编译及运行应用¶
样例代码,可参考《HiSpark.AI 转换工具使用指南》的“基础知识”和“参数说明”章节的内容,然后通过converter_lite转换工具获取Micro工程中benchmark样例。使用MindSpore Lite框架执行推理,主要包括以下步骤,更详细的步骤请参考板端sample。
说明: 状态码说明:OH_AI_STATUS_FAILED表示相关API调用失败;OH_AI_STATUS_SUCCESS表示相关API调用成功。
环境初始化。
OH_AI_Status ret = OH_AI_Init(NULL, 0); if (ret != OH_AI_STATUS_SUCCESS) { common_printf("[AI_NPU] OH_AI_Init failed (%d)\n", ret); return ret; }
创建配置上下文。
OH_AI_ContextHandle context_handle = OH_AI_ContextCreate(); if (context_handle == NULL) { printf("OH_AI_ContextCreate failed.\n"); return OH_AI_STATUS_FAILED; }
模型创建加载。
OH_AI_ModelHandle model_handle = OH_AI_ModelCreate(); if (model_handle == NULL) { printf("OH_AI_ModelCreate failed.\n"); OH_AI_ContextDestroy(&context_handle); return OH_AI_STATUS_FAILED; } int ret = OH_AI_ModelBuild(model_handle, NULL, 0, context_handle); if (ret != OH_AI_STATUS_SUCCESS) { printf("OH_AI_ModelBuild failed, ret: %d.\n", ret); OH_AI_ModelDestroy(&model_handle); OH_AI_ContextDestroy(&context_handle); return ret; }
设置输入与输出数据。
OH_AI_TensorHandleArray inputs_handle = OH_AI_ModelGetInputs(model_handle); if (inputs_handle.handle_list == NULL) { printf("OH_AI_ModelGetInputs failed"); OH_AI_ModelDestroy(&model_handle); OH_AI_ContextDestroy(&context_handle); return OH_AI_STATUS_FAILED; } OH_AI_TensorHandleArray outputs_handle = OH_AI_ModelGetOutputs(model_handle); if (!outputs_handle.handle_list) { printf("OH_AI_ModelGetOutputs failed"); OH_AI_ModelDestroy(&model_handle); OH_AI_ContextDestroy(&context_handle); return OH_AI_STATUS_FAILED; }
模型推理。
ret = OH_AI_ModelPredict(model_handle, inputs_handle, &outputs_handle); if (ret != OH_AI_STATUS_SUCCESS) { OH_AI_ModelDestroy(&model_handle); OH_AI_ContextDestroy(&context_handle); return ret; }
资源释放。
OH_AI_ModelDestroy(&model_handle); OH_AI_ContextDestroy(&context_handle);
环境去初始化。
OH_AI_Deinit();
NPU平台样例使用指导¶
本章节介绍如何调用HiSpark.AI API在NPU平台实现的部署推理;本部署推理指导当前支持Hi3322、Hi1156E两款芯片。
样例模型获取¶
使用HiSpark Studio.AI或者amct、atc工具链将原始模型转化为exeom或者om模型。模型和数据获取的具体步骤请参考交付包中的AI Sample部署。
编译及运行应用¶
使用HiSpark.AI API执行推理,主要包括以下步骤,更详细的步骤请参考板端sample。
说明: 状态码说明:OH_AI_STATUS_FAILED表示相关API调用失败;OH_AI_STATUS_SUCCESS表示相关API调用成功。
环境初始化。
OH_AI_Status ret = OH_AI_InitFromFile(NULL); if (ret != OH_AI_STATUS_SUCCESS) { common_printf("[AI_NPU] OH_AI_InitFromFile failed (%d)\n", ret); return ret; }
创建配置上下文。
OH_AI_ContextHandle context_handle = OH_AI_ContextCreate(); if (context_handle == NULL) { printf("OH_AI_ContextCreate failed.\n"); return OH_AI_STATUS_FAILED; }
模型创建加载。
OH_AI_ModelHandle model_handle = OH_AI_ModelCreate(); if (model_handle == NULL) { printf("OH_AI_ModelCreate failed.\n"); OH_AI_ContextDestroy(&context_handle); return OH_AI_STATUS_FAILED; } int ret = OH_AI_ModelBuildFromFile(model_handle, "./path_to_model/model.exeom", context_handle); if (ret != OH_AI_STATUS_SUCCESS) { printf("OH_AI_ModelBuild failed, ret: %d.\n", ret); OH_AI_ModelDestroy(&model_handle); OH_AI_ContextDestroy(&context_handle); return ret; }
设置输入与输出数据。
OH_AI_TensorHandleArray inputs_handle = OH_AI_ModelGetInputs(model_handle); if (inputs_handle.handle_list == NULL) { printf("OH_AI_ModelGetInputs failed"); OH_AI_ModelDestroy(&model_handle); OH_AI_ContextDestroy(&context_handle); return OH_AI_STATUS_FAILED; } OH_AI_TensorHandleArray outputs_handle = OH_AI_ModelGetOutputs(model_handle); if (!outputs_handle.handle_list) { printf("OH_AI_ModelGetOutputs failed"); OH_AI_ModelDestroy(&model_handle); OH_AI_ContextDestroy(&context_handle); return OH_AI_STATUS_FAILED; }
模型推理。
ret = OH_AI_ModelPredict(model_handle, inputs_handle, &outputs_handle); if (ret != OH_AI_STATUS_SUCCESS) { OH_AI_ModelDestroy(&model_handle); OH_AI_ContextDestroy(&context_handle); return ret; }
资源释放。
OH_AI_ModelDestroy(&model_handle); OH_AI_ContextDestroy(&context_handle);
环境去初始化。
OH_AI_Deinit();
FAQ¶
APP Sample持续在单Task环境下运行内存崩溃¶
**问题描述:**APP Sample循环调用OH_AI_ModelPredict推理接口,会导致运行内存崩溃。
**解决方法:**基于WS63-liteos-app或3322-wstp-app进行开发时,若整个系统仅有AI Task,Task持续循环运行不进行切换导致系统内存崩溃(原因:WatchDog被饿死)。当前解决方案:在系统若干次推理以后,增加、osDelay(1),手动引入AI Task与内置Idle Task进程切换,即可避免此原因导致的内存崩溃。









