HiSpark AI

- 软件资料
  - AMCT模型压缩工具用户指南
    - 学习向导
    - 概述
    - 准备环境
    - 快速入门
    - AMCT（PyTorch）
    - AMCT（ONNX）
    - AMCT（TensorFlow）(不支持)
    - AMCT（Caffe）(不支持)
    - 命令行参数说明
    - 样例列表
    - FAQ
    - 附录
  - ATC离线模型编译工具用户指南
    - 学习向导
    - ATC简介
    - 准备环境
    - 快速入门
    - 初级功能
    - 高级功能
    - 参数说明
    - 专题
    - 参考
    - FAQ
  - HiSpark Studio AI for VS Code使用指南
    - 前言
    - HiSpark Studio AI简介
    - 数据准备与环境搭建
    - Hi3863操作指南
    - Hi3322操作指南
  - HiSpark.AI API开发指南
    - 前言
    - 简介
    - 接口调用流程介绍
    - HiSpark.AI API参考
    - 样例使用指导
    - FAQ
  - HiSpark.AI 快速入门指南
    - 前言
    - 简介
    - 开发板准备
    - 开发环境准备
    - 样例运行
    - 常见错误
  - HiSpark.AI 转换工具使用指南
    - 前言
    - Converter_lite工具使用环境搭建
    - 快速入门
    - 基础知识
    - 初级功能
    - 参数说明
    - 算子规格参考
    - 专题
  - Nano AI应用开发指导书
    - Nano AI应用界面
    - Nano 芯片支持数据类型和典型模型性能
    - Nano AI资料清单
    - Nano AI应用开发流程
    - FAQ
  - 应用开发指南
    - 简介
    - 准备环境
    - 编程接口与调用流程
    - 初始化与去初始化
    - 运行时资源管理
    - 模型管理
    - 更多特性
    - 应用编译&运行
    - 精度/性能优化
    - acl API参考
    - FAQ案例集
    - 附录
  - 开发环境安装指南
    - 简介
    - 获取软件包
    - 安装前准备
    - 安装
    - 常用操作
    - FAQ
    - 附录
    - Compiler的库文件存在路径
  - 术语和缩略语
    - 术语和缩略语
  - 模型评估脚本使用指南
    - 简介
    - 使用前准备
    - 使用步骤
  - 精度调试工具用户指南
    - 简介
    - 使用前准备
    - GPU vs NPU（TensorFlow离线推理）-IPV350不支持
    - GPU vs NPU（ONNX离线推理）-IPV350不支持
    - NPU vs NPU（离线推理）
    - 比对结果说明
    - 比对结果分析
    - 扩展功能
    - 附录
  - 驱动日志说明文档
    - 简介
    - 日志分类
    - 异常场景
    - 典型案例

### 该页内容

- 前言
- 简介
  - HiSpark.AI接口定义
  - 基本概念
  - 获取Sample方法
- 接口调用流程介绍
  - 接口调用流程图
  - 系统初始化
  - 运行管理资源申请
  - 模型加载
  - 模型执行
  - 运行管理资源释放
- HiSpark.AI API参考
  - 接口列表
  - 系统配置
    - OH_AI_InitFromFile
    - OH_AI_Init
    - OH_AI_Deinit
  - Context管理
    - OH_AI_ContextCreate
    - OH_AI_ContextDestroy
  - Tensor管理
    - OH_AI_TensorGetDataSize
    - OH_AI_TensorGetShape
    - OH_AI_TensorGetDataType
    - OH_AI_TensorGetElementNum
    - OH_AI_TensorGetMutableData
  - 模型加载与执行
    - OH_AI_ModelCreate
    - OH_AI_ModelDestroy
    - OH_AI_ModelGetInputs
    - OH_AI_ModelGetOutputs
    - OH_AI_ModelBuild
    - OH_AI_ModelBuildFromFile
    - OH_AI_ModelBuildFromName
    - OH_AI_ModelPredict
    - OH_AI_ModelGetInputByTensorName
    - OH_AI_ModelGetOutputByTensorName
  - 错误码
    - OH_AI_GetErrorCode
- 样例使用指导
  - 3863CPU平台样例使用指导
    - 样例模型获取
    - 编译及运行应用
  - NPU平台样例使用指导
    - 样例模型获取
    - 编译及运行应用
- FAQ
  - APP Sample持续在单Task环境下运行内存崩溃

# 前言

概述

本文档提供HiSpark.AI API的模型推理相关接口说明，该模块下的接口是非线程安全的。

使用约束

- 不支持创建多线程多进程。

- 对于创建类接口（例如OH_AI_ContextCreate、OH_AI_ModelCreate等），用户在调用该类接口创建对应的资源后，建议在资源使用完成后及时调用对应的销毁类接口（例如：OH_AI_ContextDestroy、OH_AI_ModelDestroy等），以避免程序内存泄漏。

- 对于销毁类接口（例如OH_AI_ContextDestroy、OH_AI_ModelDestroy等），用户在调用该类接口后，不能继续使用已释放或销毁的资源，建议用户在调用销毁类接口后，将相关资源设置为无效值（例如，置为NULL）。

- HiSpark.AI Hi3863 MCU平台默认最多支持单线程单核CPU后端推理，仅支持x86_64（用于精度调试标杆）与RISCV平台部署调用。

读者对象

本文档适用于使用基于MindSpore Lite轻量化API接口进行应用开发的人员，通过本文档您可以达成：

- 了解HiSpark.AI轻量化API接口的功能架构、基本概念以及接口的典型调用流程。

- 使用HiSpark.AI轻量化API进行应用开发的基本流程和实现方法。

- 能够基于文档中的样例，扩展进行其他应用的开发。

掌握以下经验和技能可以更好理解本文档：

- 熟悉Linux基本命令；

- 对机器学习、人工智能有一定的了解；

- 具备C++/C语言程序开发能力。

符号约定

在本文中可能出现下列标志，它们所代表的含义如下。

符号 | 说明
--- | ---
| 表示如不避免则将会导致死亡或严重伤害的具有高等级风险的危害。
| 表示如不避免则可能导致死亡或严重伤害的具有中等级风险的危害。
| 表示如不避免则可能导致轻微或中度伤害的具有低等级风险的危害。
| 用于传递设备或环境安全警示信息。如不避免则可能会导致设备损坏、数据丢失、设备性能降低或其它不可预知的结果。 “须知”不涉及人身伤害。
| 对正文中重点信息的补充说明。 “说明”不是安全警示信息，不涉及人身、设备及环境伤害信息。

修改记录

文档版本 | 发布日期 | 修改说明
--- | --- | ---
03 | 2026-02-10 | 增加OH_AI_ModelGetInputByTensorName、OH_AI_ModelGetOutputByTensorName两个API接口： 更新接口列表
02 | 2025-12-18 | 增加Nano、Tiny NPU相关API接口： 更新接口列表
01 | 2025-09-23 | 第一次正式版本发布。

# 简介

本文用于指导开发人员基于MNIST模型、利用HiSpark.AI提供的C语言API库，实现第三方开源框架（如TFLite、ONNX等）网络模型轻量化部署与推理任务。

## HiSpark.AI接口定义

HiSpark.AI API提供了用于环境初始化、上下文配置、模型创建、推理以及Tensor创建与修改的C语言API库，供用户开发模型轻量化部署与推理应用。

## 基本概念

表 1 概念介绍

概念 | 描述
--- | ---
Context | Context即上下文配置，保存了需要的一些基本配置参数，用于控制模型编译和模型执行。
Model | Model定义了MindSpore中编译和运行的模型，便于计算图管理。
Tensor | Tensor 定义了MindSpore中的张量。通过MindSpore OH_AI_Tensor的接口，用户可以创建、销毁张量，也可以获取或者修改张量的属性。
MSLite API | MindSpore Lite轻量化API。

## 获取Sample方法

当前MindSpore Lite提供的样例如表1所示，从mnist网络模型链接中获取mnist网络的模型文件，下载后解压得到mnist.tflite、mnist.tflite.ms.bin（mnist输入数据）、mnist.tflite.ms.out（标杆输出数据，可用于精度对比），该模型为已经训练完成的mnist分类模型。

表 1 MNIST样例列表

sample | sample样例功能 | 样例介绍、编译及运行
--- | --- | ---
mnist | 识别手写数字0～9，通过多层卷积和池化等方法提取图像特征，预测10个类别的概率分布。 | 基于现有的HiSpark.AI轻量化API接口，实现第三方开源框架（如TFLite、ONNX等）网络模型轻量化部署与推理任务。

用户可下载mnist网络模型，切换到sample目录并解压。

    #切换至sample目录
    cd "sample安装目录"
    #解压sample压缩包
    tar -xvf mnist.tar.gz

# 接口调用流程介绍

本章主要介绍HiSpark.AI API接口调用流程。

## 接口调用流程图

HiSpark.AI API接口调用流程如接口调用流程图所示。

图 1 接口调用流程图

> 说明：

> 1. 在应用开发过程中，各环节都涉及内存的申请与释放、数据传输（通过内存复制实现）、数据类型的创建与销毁，因此未在图中一一标识。

> 2. 系统初始化在3322、1156为必选步骤，在3863为可选步骤。

在接口调用流程图中展示了应用开发中的典型功能抽象出主要接口的调用流程。例如，若需要实现模型推理功能，则需先加载模型，模型推理结束后，则需卸载模型；若模型推理后需打印sample推理的结果概率，则需进行数据后处理。

1. 系统初始化：通过调用OH_AI_Init/OH_AI_InitFromeFile接口完成环境初始化，具体流程参见“3.2-系统配置”。

2. 运行管理资源申请：通过调用OH_AI_ContextCreate接口申请运行管理资源，具体流程请参见“Context管理”。

3. 模型推理。

   1. 模型加载：模型推理前，需要先调用OH_AI_ModelBuild/OH_AI_ModelBuildFromFile/OH_AI_ModelBuildFromName接口将对应的模型加载到系统中。具体流程请参见“模型加载与执行”。

   2. 设置模型输入：在模型推理之前，需要读取bin格式数据文件并转换为模型输入。

   3. 模型执行：调用OH_AI_ModelPredict接口，当前仅支持CPU后端单核单线程推理预测。

   4. 数据后处理（可选）：根据用户的实际需求来处理模型推理结果。例如用户可以将获取的推理结果写入文件、打印所有的预测概率或是从推理结果中找到最大置信度的类别标识。

   5. 模型卸载：调用OH_AI_ModelDestroy接口卸载模型。

4. 运行管理资源释放：所有数据处理完成后，需要释放运行管理资源（OH_AI_Context、OH_AI_Tensor）。具体流程请参见“3.2-系统配置3.2-系统配置、Context管理、Tensor管理”以销毁资源。

## 系统初始化

图 1 系统初始化流程

通过调用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接口，并获取句柄。

## 模型加载

图 1 模型加载流程

通过调用OH_AI_ModelBuild接口，实现模型权重的自动加载。

## 模型执行

图 1 模型执行流程图

- 调用OH_AI_ModelGetInputs接口与OH_AI_ModelGetOutputs接口创建模型输入输出，准备模型执行的输入数据与输出数据。

- 调用OH_AI_ModelPredict接口做模型推理，详情请参见“模型加载与执行”。

- 获取模型推理的结果，用于后续处理。

## 运行管理资源释放

运行管理资源包含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 接口列表

类型 | 结构体/API接口 | 接口描述 | 支持芯片平台
--- | --- | --- | ---
结构体 | OH_AI_TensorHandleArray | 张量数组结构体，用于存储张量数组指针和张量数组长度，结构体声明如下。包括两个成员变量：张量数组长度 handle_num和指向张量数组的指针 handle_list。
    typedef struct OH_AI_TensorHandleArray {
       size_t handle_num;
        OH_AI_TensorHandle *handle_list;
    } OH_AI_TensorHandleArray;
| Hi3322、Hi1156、Hi3863
系统配置 | OH_AI_InitFromFile | 加载配置文件并初始化 | Hi3322、Hi1156
OH_AI_Init | 从内存数据初始化 | Hi3863
OH_AI_Deinit | 去初始化 | Hi3322、Hi1156、Hi3863
Context管理 | OH_AI_ContextHandle OH_AI_ContextCreate() | 创建一个OH_AI_Context。 | Hi3322、Hi1156、Hi3863
void OH_AI_ContextDestroy(OH_AI_ContextHandle* context) | 销毁一个OH_AI_Context。 | Hi3322、Hi1156、Hi3863
Tensor管理 | int64_t OH_AI_TensorGetElementNum(const MSTensorHandle tensor); | 获取OH_AI_Tensor的元素个数。 | Hi3322、Hi1156、Hi3863
void *OH_AI_TensorGetMutableData(const MSTensorHandle tensor); | 获取可变的OH_AI_Tensor的数据。 | Hi3322、Hi1156、Hi3863
模型加载与运行 | OH_AI_ModelHandle OH_AI_ModelCreate() | 创建一个模型对象。 | Hi3322、Hi1156、Hi3863
void OH_AI_ModelDestroy(OH_AI_ModelHandle *model) | 销毁一个模型对象。 | Hi3322、Hi1156、Hi3863
OH_AI_TensorHandleArray OH_AI_ModelGetInputs(const OH_AI_ModelHandle model) | 获取模型的输入张量数组结构体。 | Hi3322、Hi1156、Hi3863
OH_AI_TensorHandleArray OH_AI_ModelGetOutputs(const OH_AI_ModelHandle model) | 获取模型的输出张量数组结构体。 | Hi3322、Hi1156、Hi3863
OH_AI_TensorHandle OH_AI_ModelGetInputByTensorName(const OH_AI_ModelHandle model, const char *tensor_name) | 根据指定的张量名称获取模型对应的输入张量。 | Hi3863
OH_AI_TensorHandle OH_AI_ModelGetOutputByTensorName(const OH_AI_ModelHandle model, const char *tensor_name) | 根据指定的张量名称获取模型对应的输出张量。 | Hi3863
OH_AI_Status OH_AI_ModelBuild(OH_AI_ModelHandle model, const void *model_data, size_t data_size, const OH_AI_ContextHandle model_context) | 从内存缓冲区加载并编译模型。 | Hi3863
OH_AI_Status OH_AI_ModelBuildFromFile (OH_AI_ModelHandle model, const char * model_path, const OH_AI_ContextHandle model_context ) | 从模型文件加载并编译模型 | Hi3322、Hi1156、Hi3863
OH_AI_Status OH_AI_ModelBuildFromName (OH_AI_ModelHandle model, const char * model_name, const OH_AI_ContextHandle model_context ) | 从模型名称加载并编译模型 | Hi3863
OH_AI_Status OH_AI_ModelPredict(OH_AI_ModelHandle model, const OH_AI_TensorHandleArray inputs, OH_AI_TensorHandleArray *outputs) | 执行模型推理。 | Hi3322、Hi1156、Hi3863
错误码 | OH_AI_GetErrorCode | 获取错误码 | Hi3322、Hi1156、Hi3863

## 系统配置

### OH_AI_InitFromFile

【描述】

加载配置文件，并进行环境初始化。

【语法】

OH_AI_Status OH_AI_InitFromFile(char* config_file_path)

【参数说明】

参数名 | 说明
--- | ---
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)

【参数说明】

参数名 | 说明
--- | ---
config_data | 配置数据的内存地址
data_size | 内存中配置数据数据的长度，单位Byte

【返回值】

枚举类型的状态码OH_AI_Status，若返回“OH_AI_Status::OH_AI_STATUS_SUCCESS”则证明成功

### OH_AI_Deinit

【描述】

去初始化。

【语法】

OH_AI_Status OH_AI_Deinit()

## 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)

【参数说明】

参数名 | 说明
--- | ---
context | 指向OH_AI_Context的指针。

## Tensor管理

### OH_AI_TensorGetDataSize

【描述】

获取OH_AI_Tensor的数据字节数大小。

【语法】

size_t OH_AI_TensorGetDataSize (const OH_AI_TensorHandle tensor)

【参数说明】

参数名 | 说明
--- | ---
tensor | 指向OH_AI_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);

【参数说明】

参数名 | 说明
--- | ---
tensor | 指向OH_AI_Tensor的指针。
shape_num | 张量形状信息的维度

【返回值】OH_AI_Tensor的张量形状信息的内存地址。

### OH_AI_TensorGetDataType

【描述】

获取OH_AI_Tensor的数据类型。

【语法】

OH_AI_DataType OH_AI_TensorGetDataType(const OH_AI_TensorHandle tensor)

【参数说明】

参数名 | 说明
--- | ---
tensor | 指向OH_AI_Tensor的指针。

【返回值】OH_AI_Tensor的张量数据类型。

### OH_AI_TensorGetElementNum

【描述】

获取OH_AI_Tensor的元素个数。

【语法】

int64_t OH_AI_TensorGetElementNum(const OH_AI_TensorHandle tensor)

【参数说明】

参数名 | 说明
--- | ---
tensor | 指向OH_AI_Tensor的指针。

【返回值】OH_AI_Tensor的元素个数。返回值为-1说明入参为空指针。

### OH_AI_TensorGetMutableData

【描述】

获取可变的OH_AI_Tensor的数据。

【语法】

void* OH_AI_TensorGetMutableData(const OH_AI_TensorHandle tensor)

【参数说明】

参数名 | 说明
--- | ---
tensor | 指向OH_AI_Tensor的指针。

【返回值】

指向OH_AI_Tensor的可变数据的指针。

## 模型加载与执行

### OH_AI_ModelCreate

【描述】

创建一个模型对象。

【语法】

OH_AI_ModelHandle OH_AI_ModelCreate()

【返回值】

模型对象指针。

### OH_AI_ModelDestroy

【描述】

销毁一个模型对象。

【语法】

void OH_AI_ModelDestroy(OH_AI_ModelHandle* model)

【参数说明】

参数名 | 说明
--- | ---
model | 指向模型对象的指针。

### OH_AI_ModelGetInputs

【描述】

获取模型的输入张量数组结构体。

【语法】

OH_AI_TensorHandleArray OH_AI_ModelGetInputs(const OH_AI_ModelHandle model)

【参数说明】

参数名 | 说明
--- | ---
model | 指向模型对象的指针。

【返回值】模型输入对应的张量数组结构体。

### OH_AI_ModelGetOutputs

【描述】

获取模型的输出张量数组结构体。

【语法】

OH_AI_TensorHandleArray OH_AI_ModelGetOutputs(const OH_AI_ModelHandle model)

【参数说明】

参数名 | 说明
--- | ---
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)

【参数说明】

参数名 | 说明
--- | ---
model | 指向模型对象的指针。
model_data | 内存中已经加载的模型数据地址。
data_size | 模型数据的长度。
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 )

【参数说明】

参数名 | 说明
--- | ---
model | 指向模型对象的指针。
model_path | 模型文件路径。
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 )

【参数说明】

参数名 | 说明
--- | ---
model | 指向模型对象的指针。
model_name | 模型名称。
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)

【参数说明】

参数名 | 说明
--- | ---
model | 指向模型对象的指针。
inputs | 模型输入对应的张量数组结构体。
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)

【参数说明】

参数名 | 说明
--- | ---
model | 指向模型对象的指针。
tensor_name | 指定的张量名称。

【返回值】

与张量名称匹配的目标输入张量。

### OH_AI_ModelGetOutputByTensorName

【描述】

根据指定的张量名称获取模型对应的输出张量。

【语法】

OH_AI_TensorHandle OH_AI_ModelGetOutputByTensorName(const OH_AI_ModelHandle model, const char *tensor_name)

【参数说明】

参数名 | 说明
--- | ---
model | 指向模型对象的指针。
tensor_name | 指定的张量名称。

【返回值】

与张量名称匹配的目标输出张量。

## 错误码

### 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、Hi1156错误码定义参考文档《AscendCL应用开发指南（C&C++）》

Hi3863错误码定义参考文档《MindSpore Lite API文档》

# 样例使用指导

## 3863CPU平台样例使用指导

本章节介绍如何调用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调用成功。

1. 环境初始化。

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

2. 创建配置上下文。

       OH_AI_ContextHandle context_handle = OH_AI_ContextCreate();
       if (context_handle == NULL) {
         printf("OH_AI_ContextCreate failed.\n");
         return OH_AI_STATUS_FAILED;
       }

3. 模型创建加载。

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

4. 设置输入与输出数据。

       OH_AI_TensorHandleArray inputs_handle = OH_AI_ModelGetInputs(model_handle);
       if (inputs_handle.handle_list == NULL) {
         printf("OH_AI_ModelGetInputs failed");
         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");
         return OH_AI_STATUS_FAILED;
       }

5. 模型推理。

       ret = OH_AI_ModelPredict(model_handle, inputs_handle, &outputs_handle);
       if (ret != OH_AI_STATUS_SUCCESS) {
         OH_AI_ModelDestroy(&model_handle);
         return ret;
       }

6. 资源释放。

       OH_AI_ContextDestroy(&context_handle);
       OH_AI_ModelDestroy(&model_handle);

## NPU平台样例使用指导

本章节介绍如何调用HiSpark.AI API在NPU平台实现的部署推理；本部署推理指导当前支持Hi3322、Hi1156两款芯片。

### 样例模型获取

使用HiSpark Studio.AI或者amct、atc工具链将原始模型转化为exeom或者om模型。模型和数据获取的具体步骤请参考交付包中的AI Sample部署。

### 编译及运行应用

使用HiSpark.AI API执行推理，主要包括以下步骤，更详细的步骤请参考板端sample。

> 说明： 状态码说明：OH_AI_STATUS_FAILED表示相关API调用失败；OH_AI_STATUS_SUCCESS表示相关API调用成功。

1. 创建配置上下文。

       OH_AI_ContextHandle context_handle = OH_AI_ContextCreate();
       if (context_handle == NULL) {
         printf("OH_AI_ContextCreate failed.\n");
         return OH_AI_STATUS_FAILED;
       }

2. 模型创建加载。

       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, "./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);
         return ret;
       }

3. 设置输入与输出数据。

       OH_AI_TensorHandleArray inputs_handle = OH_AI_ModelGetInputs(model_handle);
       if (inputs_handle.handle_list == NULL) {
         printf("OH_AI_ModelGetInputs failed");
         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");
         return OH_AI_STATUS_FAILED;
       }

4. 模型推理。

       ret = OH_AI_ModelPredict(model_handle, inputs_handle, &outputs_handle);
       if (ret != OH_AI_STATUS_SUCCESS) {
         OH_AI_ModelDestroy(&model_handle);
         return ret;
       }

5. 资源释放。

       OH_AI_ModelDestroy(&model_handle);
       OH_AI_ContextDestroy(&context_handle);

6. 环境去初始化。

       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进程切换，即可避免此原因导致的内存崩溃。