diff --git a/README_zh.md b/README_zh.md index 720bf3c0e49f4386ff954a2d89550536df15772e..0168d19875e42286b4a245870d35304f06541251 100644 --- a/README_zh.md +++ b/README_zh.md @@ -1,26 +1,57 @@ # Neural Network Runtime -Neural Network Runtime(神经网络运行时)是一套面向AI领域的运行时部件,适配上层AI推理引擎和底层加速芯片,为端侧AI推理引擎提供硬件加速的计算能力。 - -## 基本概念 +## 简介 -在开发前,需要先了解以下概念,以便更好地理解全文内容: +Neural Network Runtime(神经网络运行时)是一套面向AI领域的运行时部件,适配上层AI推理引擎和底层加速芯片,为端侧AI推理引擎提供硬件加速的计算能力。 -- Native API:Openharmony 面向应用开发者的C语言接口。 -- HDI:Hardware Device Interface,硬件设备接口,是OpenHarmony中系统组件与芯片组件通信的接口。关于更多HDI的细节,请浏览[驱动子系统](https://gitee.com/openharmony/docs/blob/master/zh-cn/readme/%E9%A9%B1%E5%8A%A8%E5%AD%90%E7%B3%BB%E7%BB%9F.md)。 +如架构图所示,在OpenHarmony系统上,AI应用通常要经过AI推理引擎和Neural Network Runtime才能对接底层芯片驱动,进而加速推理计算。Neural Network Runtime和芯片驱动直接通过HDI接口交互,Neural Network Runtime将模型和数据传递给芯片驱动,通过HDI接口在加速芯片上执行推理计算,计算结果通过Neural Network Runtime、AI推理引擎逐层返回至AI应用。 -## 运作机制 +通常,AI应用、AI推理引擎、Neural Network Runtime处在同一个进程下,芯片驱动运行在另一个进程下,两者之间需要借助进程间通信(IPC)传递模型和计算数据。Neural Network Runtime根据HDI接口实现了HDI客户端,相应的,芯片厂商需要根据HDI接口实现并开放HDI服务。 **图1** Neural Network Runtime架构图 !["Neural Network Runtime架构图"](neural_network_runtime_intro.png) -如图1所示,在OpenHarmony系统上,AI应用通常要经过AI推理引擎和Neural Network Runtime才能对接底层芯片驱动,进而加速推理计算。Neural Network Runtime和芯片驱动直接通过HDI接口交互,Neural Network Runtime将模型和数据传递给芯片驱动,通过HDI接口在加速芯片上执行推理计算,计算结果通过Neural Network Runtime、AI推理引擎逐层返回至AI应用。 +## 目录 -通常,AI应用、AI推理引擎、Neural Network Runtime处在同一个进程下,芯片驱动运行在另一个进程下,两者之间需要借助进程间通信(IPC)传递模型和计算数据。Neural Network Runtime根据HDI接口实现了HDI客户端,相应的,芯片厂商需要根据HDI接口实现并开放HDI服务。 +```undefined +/foundation/ai/neural_network_runtime +├── common +├── example # 开发样例目录 +│   ├── deep_learning_framework # 应用开发样例存放目录 +│   └── drivers # 设备驱动开发样例存放目录 +├── frameworks # 框架代码存放目录 +│   └── native +│   └── op # 算子头文件和实现存放目录 +├── interfaces # 对外接口存放目录 +│   ├── innerkits # 对内部子系统暴露的头文件存放目录 +│   └── kits # 对外开放的头文件存放目录 +└── test # 测试用例存放目录 + ├── system_test # 系统测试用例存放目录 + └── unittest # 单元测试用例存放目录 +``` + +## 编译构建 + +在OpenHarmony源码根目录下,调用以下指令,单独编译Neural Network Runtime。 +```shell +./build.sh --product-name name --ccache --build-target neural_network_runtime +``` +> **说明:** name为产品名称,例如Hi3516DV300、rk3568等。 + +## 说明 + +### 接口说明 + +完整的接口文档请参考: +- [neural_network_runtime.h](./interfaces/kits/c/neural_network_runtime.h) +- [neural_network_runtime_type.h](./interfaces/kits/c/neural_network_runtime_type.h) + +### 使用说明 + +- AI推理引擎/应用开发请参考:[Neural Network Runtime开发指导](./neural-network-runtime-guidelines.md) +- AI加速芯片驱动/设备开发请参考:[Neural Network Runtime设备开发指导](./example/drivers/README_zh.md) + +## 相关仓 -架构图中每层功能简单阐述如下: -- AI应用:借助AI模型,提供丰富的应用能力,如:图像分类、人脸识别、文字识别等。 -- AI推理引擎:为AI应用提供模型搭建、模型优化、推理计算的能力。 -- Neural Network Runtime:作为AI推理引擎和底层加速芯片的桥梁,它开放了标准统一的HDI接口,不同的芯片都可以通过HDI接口接入Neural Network Runtime。 -- HDI服务端:HDI服务端接收Neural Network Runtime传入的模型,将模型转换为加速芯片驱动所使用模型格式,并调用芯片驱动的接口执行计算。 -- 加速芯片:加速芯片通常能够加速AI模型或者模型中部分算子的计算,提供优于CPU的性能。 \ No newline at end of file +- [**neural_network_runtime**](https://gitee.com/openharmony-sig/neural_network_runtime) +- [Mindspore](https://gitee.com/openharmony/third_party_mindspore) diff --git a/interfaces/kits/c/neural_network_runtime.h b/interfaces/kits/c/neural_network_runtime.h index 15d8dc7375c99e6cb8ed25cf71d82b3d47d24b0d..520ddcf15fed54ce6208352b08865d47a4416bd6 100644 --- a/interfaces/kits/c/neural_network_runtime.h +++ b/interfaces/kits/c/neural_network_runtime.h @@ -35,7 +35,7 @@ extern "C" { * @addtogroup NNModel * @{ * - * @brief Neural Network Runtime 构图模块,提供了一系列构图接口实现操作数的添加、算子的添加和输入输出的设置,帮助开发者完成 + * @brief Neural Network Runtime 构图模块,提供了一系列构图接口实现张量的添加、算子的添加和输入输出的设置,帮助开发者完成 * AI模型的构建。 * * @since 9 @@ -60,19 +60,19 @@ extern "C" { OH_NNModel *OH_NNModel_Construct(void); /** - * @brief 向模型实例中添加操作数 + * @brief 向模型实例中添加张量 * - * Neural Network Runtime模型中的数据节点和算子参数均由模型的操作数构成。本方法根据tensor,向model实 - * 例中添加操作数。操作数添加的顺序是模型中记录操作数的索引值,{@link OH_NNModel_SetTensorData}、 + * Neural Network Runtime模型中的数据节点和算子参数均由模型的张量构成。本方法根据tensor,向model实 + * 例中添加张量。张量添加的顺序是模型中记录张量的索引值,{@link OH_NNModel_SetTensorData}、 * {@link OH_NNModel_AddOperation}和{@link OH_NNModel_SpecifyInputsAndOutputs} - * 方法根据该索引值,指定不同的操作数。\n + * 方法根据该索引值,指定不同的张量。\n * * Neural Network Runtime支持动态形状输入和输出。在添加动态形状的数据节点时,需要将tensor.dimensions中支持动态 * 变化的维度设置为-1。例如:一个4维tensor,将tensor.dimensions设置为[1, -1, 2, 2],表示其第二个维度支持 * 动态变化。\n * * @param model 指向{@link OH_NNModel}实例的指针。 - * @param tensor {@link OH_NN_Tensor}操作数的指针,tensor指定了添加到模型实例中操作数的属性。 + * @param tensor {@link OH_NN_Tensor}张量的指针,tensor指定了添加到模型实例中张量的属性。 * @return 函数执行的结果状态。执行成功返回OH_NN_SUCCESS;失败返回具体错误码,具体失败错误码可参考{@link OH_NN_ReturnCode}。 * @since 9 * @version 1.0 @@ -80,13 +80,13 @@ OH_NNModel *OH_NNModel_Construct(void); OH_NN_ReturnCode OH_NNModel_AddTensor(OH_NNModel *model, const OH_NN_Tensor *tensor); /** - * @brief 设置操作数的数值 + * @brief 设置张量的数值 * - * 对于具有常量值的操作数(如模型的权重),需要在构图阶段使用本方法设置数值。操作数的索引值根据操作数添加进模型的顺序决定,操作数的添加参考 + * 对于具有常量值的张量(如模型的权重),需要在构图阶段使用本方法设置数值。张量的索引值根据张量添加进模型的顺序决定,张量的添加参考 * {@link OH_NNModel_AddTensor}。\n * * @param model 指向{@link OH_NNModel}实例的指针。 - * @param index 操作数的索引值。 + * @param index 张量的索引值。 * @param dataBuffer 指向真实数据的指针。 * @param length 数据缓冲区的长度。 * @return 函数执行的结果状态。执行成功返回OH_NN_SUCCESS;失败返回具体错误码,具体失败错误码可参考{@link OH_NN_ReturnCode}。 @@ -100,11 +100,11 @@ OH_NN_ReturnCode OH_NNModel_SetTensorData(OH_NNModel *model, uint32_t index, con * * 本方法向模型实例中添加算子,算子类型由op指定,算子的参数、输入和输出由paramIndices、inputIndices和 * outputIndices指定。本方法将对算子参数的属性和输入输出的数量进行校验,这些属性需要在调用 - * {@link OH_NNModel_AddTensor}添加操作数的时候正确设置。每个算子期望的参数、输入和输出属性请参考 + * {@link OH_NNModel_AddTensor}添加张量的时候正确设置。每个算子期望的参数、输入和输出属性请参考 * {@link OH_NN_OperationType}。\n * - * paramIndices、inputIndices和outputIndices中存储的是操作数的索引值,每个索引值根据操作数添加进模型的顺序决定,正确 - * 设置并添加算子要求准确设置每个操作数的索引值。操作数的添加参考{@link OH_NNModel_AddTensor}。\n + * paramIndices、inputIndices和outputIndices中存储的是张量的索引值,每个索引值根据张量添加进模型的顺序决定,正确 + * 设置并添加算子要求准确设置每个张量的索引值。张量的添加参考{@link OH_NNModel_AddTensor}。\n * * 如果添加算子时,添加了额外的参数(非算子需要的参数),本方法返回{@link OH_NN_INVALID_PARAMETER};如果没有设置算子参数, * 则算子按默认值设置缺省的参数,默认值请参考{@link OH_NN_OperationType}。\n @@ -127,10 +127,10 @@ OH_NN_ReturnCode OH_NNModel_AddOperation(OH_NNModel *model, /** * @brief 指定模型的输入输出 * - * 模型实例需要指定操作数作为端到端的输入和输出,设置为输入和输出的操作数不能使用{@link OH_NNModel_SetTensorData}设置 + * 模型实例需要指定张量作为端到端的输入和输出,设置为输入和输出的张量不能使用{@link OH_NNModel_SetTensorData}设置 * 数值,需要在执行阶段调用OH_NNExecutor的方法设置输入、输出数据。\n * - * 操作数的索引值根据操作数添加进模型的顺序决定,操作数的添加参考 + * 张量的索引值根据张量添加进模型的顺序决定,张量的添加参考 * {@link OH_NNModel_AddTensor}。\n * * 暂时不支持异步设置模型输入输出。\n @@ -397,7 +397,7 @@ OH_NNExecutor *OH_NNExecutor_Construct(OH_NNCompilation *compilation); * * 由于Neural Network Runtime支持动态输入形状的模型,在固定形状输入和动态形状输入的场景下,本方法采取不同的处理策略: * - * - 固定形状输入的场景:tensor各属性必须和构图阶段调用{@link OH_NNModel_AddTensor}添加的操作数保持一致; + * - 固定形状输入的场景:tensor各属性必须和构图阶段调用{@link OH_NNModel_AddTensor}添加的张量保持一致; * - 动态形状输入的场景:在构图阶段,由于动态输入的形状不确定,调用本方法时,要求tensor.dimensions中的每个值必须大于0, * 以确定执行计算阶段输入的形状。设置形状时,只允许调整数值为-1的维度。假设在构图阶段,输入A的维度为 * [-1, 224, 224, 3],调用本方法时,只能调整第一个维度的尺寸,如:[3, 224, 224, 3]。调整其他维度将返回 @@ -409,7 +409,7 @@ OH_NNExecutor *OH_NNExecutor_Construct(OH_NNCompilation *compilation); * * @param executor 指向{@link OH_NNExecutor}实例的指针。 * @param inputIndex 输入的索引值。 - * @param tensor 设置输入数据对应的操作数。 + * @param tensor 设置输入数据对应的张量。 * @param dataBuffer 指向输入数据的指针。 * @param length 数据缓冲区的字节长度。 * @return 函数执行的结果状态。执行成功返回OH_NN_SUCCESS;失败返回具体错误码,具体失败错误码可参考{@link OH_NN_ReturnCode}。 @@ -575,7 +575,7 @@ void OH_NNExecutor_DestroyOutputMemory(OH_NNExecutor *executor, uint32_t outputI * * @param executor 指向{@link OH_NNExecutor}实例的指针。 * @param inputIndex 输入的索引值。 - * @param tensor 指向{@link OH_NN_Tensor}的指针,设置单个输入所对应的操作数。 + * @param tensor 指向{@link OH_NN_Tensor}的指针,设置单个输入所对应的张量。 * @param memory 指向{@link OH_NN_Memory}的指针。 * @return 函数执行的结果状态。执行成功返回OH_NN_SUCCESS;失败返回具体错误码,具体失败错误码可参考{@link OH_NN_ReturnCode}。 * @since 9 diff --git a/interfaces/kits/c/neural_network_runtime_type.h b/interfaces/kits/c/neural_network_runtime_type.h index 73f932002ae5d710464d6a61510be72512cfaed0..dda57ee7402cfcd9bc57ef5f6abd1885d08e108e 100644 --- a/interfaces/kits/c/neural_network_runtime_type.h +++ b/interfaces/kits/c/neural_network_runtime_type.h @@ -171,31 +171,31 @@ typedef enum { * @version 1.0 */ typedef enum { - /** 操作数数据类型未知 */ + /** 张量数据类型未知 */ OH_NN_UNKNOWN = 0, - /** 操作数数据类型为bool */ + /** 张量数据类型为bool */ OH_NN_BOOL = 1, - /** 操作数数据类型为int8 */ + /** 张量数据类型为int8 */ OH_NN_INT8 = 2, - /** 操作数数据类型为int16 */ + /** 张量数据类型为int16 */ OH_NN_INT16 = 3, - /** 操作数数据类型为int32 */ + /** 张量数据类型为int32 */ OH_NN_INT32 = 4, - /** 操作数数据类型为int64 */ + /** 张量数据类型为int64 */ OH_NN_INT64 = 5, - /** 操作数数据类型为uint8 */ + /** 张量数据类型为uint8 */ OH_NN_UINT8 = 6, - /** 操作数数据类型为uint16 */ + /** 张量数据类型为uint16 */ OH_NN_UINT16 = 7, - /** 操作数数据类型为uint32 */ + /** 张量数据类型为uint32 */ OH_NN_UINT32 = 8, - /** 操作数数据类型为uint64 */ + /** 张量数据类型为uint64 */ OH_NN_UINT64 = 9, - /** 操作数数据类型为float16 */ + /** 张量数据类型为float16 */ OH_NN_FLOAT16 = 10, - /** 操作数数据类型为float32 */ + /** 张量数据类型为float32 */ OH_NN_FLOAT32 = 11, - /** 操作数数据类型为float64 */ + /** 张量数据类型为float64 */ OH_NN_FLOAT64 = 12 } OH_NN_DataType; @@ -1351,9 +1351,9 @@ typedef enum { } OH_NN_OperationType; /** - * @brief 操作数的类型 + * @brief 张量的类型 * - * 操作数通常用于设置模型的输入、输出和算子参数。作为模型(或算子)的输入和输出时,需要将操作数类型设置为{@link OH_NN_TENSOR};操作数 + * 张量通常用于设置模型的输入、输出和算子参数。作为模型(或算子)的输入和输出时,需要将张量类型设置为{@link OH_NN_TENSOR};张量 * 用于设置算子参数时,需要指定参数类型。假设正在设置{@link OH_NN_OPS_CONV2D}算子的pad参数,则需要将 * {@link OH_NN_Tensor}实例的type属性设置为{@link OH_NN_CONV2D_PAD}。其他算子参数的设置以此类推,枚举值 * 的命名遵守 OH_NN_{算子名称}_{属性名} 的格式。 @@ -1591,25 +1591,25 @@ typedef struct OH_NN_QuantParam { } OH_NN_QuantParam; /** - * @brief 操作数结构体 + * @brief 张量结构体 * - * {@link OH_NN_Tensor}类型通常用于构造模型图中的数据节点和算子参数,在构造操作数时需要明确数据类型、维数、维度信息和量化信息。 - * type成员指定操作数的用途,当操作数用作模型图中的输入、输出,则要求type置为{@link OH_NN_TENSOR};当操作数用作算子参数, + * {@link OH_NN_Tensor}类型通常用于构造模型图中的数据节点和算子参数,在构造张量时需要明确数据类型、维数、维度信息和量化信息。 + * type成员指定张量的用途,当张量用作模型图中的输入、输出,则要求type置为{@link OH_NN_TENSOR};当张量用作算子参数, * 则需要指定为具体的枚举值,具体参考{@link OH_NN_TensorType}。 * * @since 9 * @version 1.0 */ typedef struct OH_NN_Tensor { - /** 指定操作数的数据类型,要求从{@link OH_NN_DataType}枚举类型中取值。 */ + /** 指定张量的数据类型,要求从{@link OH_NN_DataType}枚举类型中取值。 */ OH_NN_DataType dataType; - /** 指定操作数的维数 */ + /** 指定张量的维数 */ uint32_t dimensionCount; - /** 指定操作数的维度信息 */ + /** 指定张量的维度信息 */ const int32_t *dimensions; - /** 指定操作数的量化信息,数据类型要求为{@link OH_NN_QuantParam}。 */ + /** 指定张量的量化信息,数据类型要求为{@link OH_NN_QuantParam}。 */ const OH_NN_QuantParam *quantParam; - /** 指定操作数的类型, 要求从{@link OH_NN_TensorType}枚举类型中取值。 */ + /** 指定张量的类型, 要求从{@link OH_NN_TensorType}枚举类型中取值。 */ OH_NN_TensorType type; } OH_NN_Tensor; diff --git a/neural-network-runtime-guidelines.md b/neural-network-runtime-guidelines.md index bf191bc414aeda56b259ba844a6bc72bea5d1372..28145f1d322f426e6ff5ff4dc27faedddc01bf57 100644 --- a/neural-network-runtime-guidelines.md +++ b/neural-network-runtime-guidelines.md @@ -4,6 +4,13 @@ Neural Network Runtime作为AI推理引擎和加速芯片的桥梁,为AI推理引擎提供精简的Native接口,满足推理引擎通过加速芯片执行端到端推理的需求;同时为加速芯片提供了统一的HDI接口,使能加速芯片接入OpenHarmony社区生态。 +## 基本概念 + +在开发前,需要先了解以下概念,以便更好地理解全文内容: + +- Native API:Openharmony 面向应用开发者的C语言接口。 +- HDI:Hardware Device Interface,硬件设备接口,是OpenHarmony中系统组件与芯片组件通信的接口。关于更多HDI的细节,请浏览[驱动子系统](https://gitee.com/openharmony/docs/blob/master/zh-cn/readme/%E9%A9%B1%E5%8A%A8%E5%AD%90%E7%B3%BB%E7%BB%9F.md)。 + ## 环境准备 ### 环境要求 diff --git a/neural_network_runtime_intro.png b/neural_network_runtime_intro.png old mode 100644 new mode 100755 index 8f58413de5337ae7fb98aca126efe6f5fca2cefc..b416303dfc7d9267c3178d6c79706aa1d27cdb5e Binary files a/neural_network_runtime_intro.png and b/neural_network_runtime_intro.png differ