未验证 提交 919c7b92 编写于 作者: O openharmony_ci 提交者: Gitee

!18020 按照NNRt V2.0版本更新对应的《NNRt设备开发指导》文档

Merge pull request !18020 from win10wei/master
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
NNRt(Neural Network Runtime,神经网络运行时)是面向AI领域的跨芯片推理计算运行时,作为中间桥梁连通上层AI推理框架和底层加速芯片,实现AI模型的跨芯片推理计算。 NNRt(Neural Network Runtime,神经网络运行时)是面向AI领域的跨芯片推理计算运行时,作为中间桥梁连通上层AI推理框架和底层加速芯片,实现AI模型的跨芯片推理计算。
NNRt开放了设备接口,芯片厂商通过设备接口将专有加速芯片接入NNRt,实现接入OpenHarmony的社区生态,以下将介绍芯片如何接入NNRt。 NNRt开放了设备接口,芯片厂商通过设备接口将专有加速芯片接入NNRt,从而实现与OpenHarmony社区生态的对接。以下内容将介绍芯片如何接入NNRt。
### 基本概念 ### 基本概念
在开发前,开发者需要先了解以下概念,以便更好地理解全文内容: 在开发前,开发者需要先了解以下概念,以便更好地理解全文内容:
...@@ -26,37 +26,36 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程 ...@@ -26,37 +26,36 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程
![架构图](./figures/nnrt_arch_diagram.png) ![架构图](./figures/nnrt_arch_diagram.png)
整个架构主要分为三层,AI应用在应用层,AI推理框架和NNRt在系统层,设备服务在芯片层。AI应用如要使用专用加速芯片模型推理,需要经过AI推理框架和NNRt才能调用到底层专用加速芯片,而NNRt就是负责适配底层各种专用加速芯片,它开放了标准统一的设备接口,众多的第三方芯片设备都可以通过HDI接口接入OpenHarmony 整个架构主要分为三层,AI应用在应用层,AI推理框架和NNRt在系统层,设备服务在芯片层。AI应用如果要使用AI专用加速芯片进行模型推理,需要经过AI推理框架和NNRt才能调用到底层AI专用加速芯片,NNRt就是负责适配底层各种AI专用加速芯片的中间层。NNRt开放了标准统一的HDI设备接口,众多AI专用加速芯片都可以通过HDI接口接入OpenHarmony。此外NNRt也开放了标准统一的接口对接上层各种AI推理框架
程序运行时,AI应用、AI推理框架、NNRt都在用户进程中,底层设备服务在服务进程中,NNRt根据HDI接口实现了HDI Client,服务端也需要根据HDI接口实现HDI Service,使得两个进程间能够跨进程通信。 程序运行时,AI应用、AI推理框架、NNRt都运行在用户进程中,底层AI芯片设备服务运行在HDI服务进程中。NNRt根据HDI接口实现了HDI Client,服务端也需要根据HDI接口实现HDI Service,两者通过OpenHarmony标准的HDF子系统实现跨进程通信。
## 开发指导 ## 开发指导
### 场景介绍 ### 场景介绍
当需要将一款AI加速芯片接入NNRt的时候,可以参考下文。下文以RK3568芯片为例,展示RK3568 CPU如何通过HDI接口接入NNRt,并完成AI模型推理 当需要将一款AI加速芯片接入NNRt的时候,可以参考下文。下文以RK3568芯片为例,展示RK3568 CPU如何通过NNRt的V2.0版本HDI接口接入NNRt,并完成AI模型推理。V1.0版本HDI接口接入NNRt的流程与此类似
> 依赖说明:该教程展示的RK3568 CPU接入NNRt并没有实际去写CPU的驱动,而是借用了MindSpore Lite的CPU算子,故会依赖MindSpore Lite的动态库以及头文件,实际开发时并不需要依赖MindSpore Lite的任何库或者头文件。 > 依赖说明:该教程展示的RK3568 CPU接入NNRt并没有真正实现CPU的驱动,而是借用了MindSpore Lite的runtime和CPU算子,因此会依赖MindSpore Lite的动态库以及头文件。实际开发时并不需要依赖MindSpore Lite的任何库或者头文件。
### 开发流程 ### 开发流程
专用加速芯片接入NNRt的整体流程如下: AI专用加速芯片接入NNRt的整体流程如下:
**图2** 专用加速芯片接入NNRt流程 **图2** AI专用加速芯片接入NNRt流程
![开发流程](./figures/nnrt_dev_flow.png) ![开发流程](./figures/nnrt_dev_flow.png)
### 开发步骤 ### 开发步骤
开发者具体可通过以下步骤实现芯片对接NNRt: AI芯片设备HDI服务开发者具体可通过以下步骤实现AI专用加速芯片对接NNRt:
#### 生成HDI头文件 #### 生成HDI头文件
开源社区下载OpenHarmony的代码,编译drivers_interface部件,生成HDI接口的头文件。 开源社区下载OpenHarmony的代码,编译drivers_interface部件,生成HDI接口的头文件。
1. [下载源码](../get-code/sourcecode-acquire.md) 1. [下载源码](../get-code/sourcecode-acquire.md)
2. 编译接口IDL文件。 2. 进入OpenHarmony源码根目录,编译NNRt的IDL接口文件(以RK3568产品为例):
```shell ```shell
./build.sh --product-name productname –ccache --build-target drivers_interface_nnrt ./build.sh --product-name rk3568 –ccache --build-target drivers_interface_nnrt
``` ```
> productname为产品名称,此处为RK3568。
编译完成后,在```out/rk3568/gen/drivers/interface/nnrt```目录下生成HDI头文件,默认语言类型为C++。若需要生成C类型的头文件,请在编译之前使用如下命令对```drivers/interface/nnrt/v1_0/BUILD.gn```文件中的```language```配置项进行设置。 编译完成后,会在```out/rk3568/gen/drivers/interface/nnrt/v2_0```目录下生成C++类型的HDI头文件。若需要生成C类型的头文件,请在编译之前使用如下命令对```drivers/interface/nnrt/v2_0/BUILD.gn```文件中的```language```配置项进行设置。
```shell ```shell
language = "c" language = "c"
...@@ -65,13 +64,13 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程 ...@@ -65,13 +64,13 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程
生成头文件目录如下所示: 生成头文件目录如下所示:
```text ```text
out/rk3568/gen/drivers/interface/nnrt out/rk3568/gen/drivers/interface/nnrt
└── v1_0 └── v2_0
├── drivers_interface_nnrt__libnnrt_proxy_1.0_external_deps_temp.json ├── drivers_interface_nnrt__libnnrt_proxy_2.0_external_deps_temp.json
├── drivers_interface_nnrt__libnnrt_stub_1.0_external_deps_temp.json ├── drivers_interface_nnrt__libnnrt_stub_2.0_external_deps_temp.json
├── innrt_device.h # 设备接口头文件 ├── innrt_device.h # 设备接口头文件
├── iprepared_model.h # 编译AI模型对象头文件 ├── iprepared_model.h # 编译AI模型对象头文件
├── libnnrt_proxy_1.0__notice.d ├── libnnrt_proxy_2.0__notice.d
├── libnnrt_stub_1.0__notice.d ├── libnnrt_stub_2.0__notice.d
├── model_types.cpp # AI模型结构定义实现文件 ├── model_types.cpp # AI模型结构定义实现文件
├── model_types.h # AI模型结构定义头文件 ├── model_types.h # AI模型结构定义头文件
├── nnrt_device_driver.cpp # 设备驱动实现参考样例 ├── nnrt_device_driver.cpp # 设备驱动实现参考样例
...@@ -95,55 +94,58 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程 ...@@ -95,55 +94,58 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程
#### 实现HDI服务 #### 实现HDI服务
1. 在drivers/peripheral目录下新建开发目录,用于HDI服务开发,开发目录结构如下所示: 1. 进入OpenHarmony源码根目录,在```drivers/peripheral```目录下新建开发目录```nnrt```,用于HDI服务开发。开发目录结构如下所示:
```text ```text
drivers/peripheral/nnrt drivers/peripheral/nnrt
├── BUILD.gn # 代码编译脚本文件
├── bundle.json ├── bundle.json
└── hdi_cpu_service # 自定义目录 ├── v2_0
├── BUILD.gn # 代码编译脚本文件 ├── BUILD.gn # 代码编译脚本文件
├── include └── hdi_cpu_service # 自定义目录
│   ├── nnrt_device_service.h # 设备服务端头文件 ├── BUILD.gn # 代码编译脚本文件
│   ├── node_functions.h # 非必须,由具体实现决定 ├── include
│   ├── node_registry.h # 非必须,由具体实现决定 │   ├── nnrt_device_service.h # 设备服务端头文件
│   └── prepared_model_service.h # 编译AI模型对象服务端头文件 │   ├── node_functions.h # 非必须,由具体实现决定
└── src │   ├── node_registry.h # 非必须,由具体实现决定
├── nnrt_device_driver.cpp # 设备驱动实现文件 │   └── prepared_model_service.h # 编译AI模型对象服务端头文件
├── nnrt_device_service.cpp # 设备服务端实现文件 └── src
├── nnrt_device_stub.cpp # 非必须,由具体实现决定 ├── nnrt_device_driver.cpp # 设备驱动实现文件
├── node_attr_types.cpp # 非必须,由具体实现决定 ├── nnrt_device_service.cpp # 设备服务端实现文件
├── node_functions.cpp # 非必须,由具体实现决定 ├── nnrt_device_stub.cpp # 非必须,由具体实现决定
├── node_registry.cpp # 非必须,由具体实现决定 ├── node_attr_types.cpp # 非必须,由具体实现决定
└── prepared_model_service.cpp # 编译AI模型对象服务端实现文件 ├── node_functions.cpp # 非必须,由具体实现决定
├── node_registry.cpp # 非必须,由具体实现决定
└── prepared_model_service.cpp # 编译AI模型对象服务端实现文件
``` ```
2. 实现设备驱动,无特殊需求可直接使用步骤1中生成的nnrt_device_driver.cpp文件,否则根据具体驱动开发。 2. 实现设备驱动,无特殊需求可直接使用IDL文件编译生成的```nnrt_device_driver.cpp```文件,否则根据具体驱动开发。
3. 实现服务接口,可参考nnrt_device_service.cpp和prepared_model_service.cpp实现文件,接口定义可以参考[NNRt的HDI接口定义](https://gitee.com/openharmony/drivers_interface/tree/master/nnrt) 3. 实现服务接口,可参考```nnrt_device_service.cpp``````prepared_model_service.cpp```实现文件,接口定义可以参考[NNRt的HDI接口定义](https://gitee.com/openharmony/drivers_interface/tree/master/nnrt)
4. 编译驱动和服务的实现文件为共享库。 4. 编译驱动和服务的实现文件为共享库。
在```drivers/peripheral/nnrt/hdi_cpu_service/```下新建```BUILD.gn```文件,文件内容如下所示,相关参数配置内容可参考[Build教程](https://gitee.com/openharmony/build)。 在```drivers/peripheral/nnrt/v2_0/hdi_cpu_service/```下新建```BUILD.gn```文件,文件内容如下所示,相关参数配置内容可参考[Build教程](https://gitee.com/openharmony/build)。
```shell ```shell
import("//build/ohos.gni") import("//build/ohos.gni")
import("//drivers/hdf_core/adapter/uhdf2/uhdf.gni") import("//drivers/hdf_core/adapter/uhdf2/uhdf.gni")
ohos_shared_library("libnnrt_service_1.0") { ohos_shared_library("libnnrt_service_2.0") {
include_dirs = [] include_dirs = []
sources = [ sources = [
"src/nnrt_device_service.cpp", "src/nnrt_device_service.cpp",
"src/prepared_model_service.cpp",
"src/node_registry.cpp",
"src/node_functions.cpp", "src/node_functions.cpp",
"src/node_attr_types.cpp" "src/node_registry.cpp",
"src/prepared_model_service.cpp",
"src/shared_buffer_parser.cpp",
"src/validation.cpp",
] ]
public_deps = [ "//drivers/interface/nnrt/v1_0:nnrt_idl_headers" ]
external_deps = [ external_deps = [
"hdf_core:libhdf_utils",
"hiviewdfx_hilog_native:libhilog",
"ipc:ipc_single",
"c_utils:utils", "c_utils:utils",
"drivers_interface_nnrt:libnnrt_stub_2.0",
"hdf_core:libhdf_utils",
"hilog_native:libhilog",
"ipc:ipc_core",
] ]
install_images = [ chipset_base_dir ] install_images = [ chipset_base_dir ]
...@@ -154,15 +156,17 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程 ...@@ -154,15 +156,17 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程
ohos_shared_library("libnnrt_driver") { ohos_shared_library("libnnrt_driver") {
include_dirs = [] include_dirs = []
sources = [ "src/nnr_device_driver.cpp" ] sources = [ "src/nnr_device_driver.cpp" ]
deps = [ "//drivers/peripheral/nnrt/hdi_cpu_service:libnnrt_service_1.0" ] deps = [ ":libnnrt_service_2.0" ]
external_deps = [ external_deps = [
"c_utils:utils",
"drivers_interface_nnrt:libnnrt_stub_2.0",
"hdf_core:libhdf_host", "hdf_core:libhdf_host",
"hdf_core:libhdf_ipc_adapter", "hdf_core:libhdf_ipc_adapter",
"hdf_core:libhdf_utils", "hdf_core:libhdf_utils",
"hiviewdfx_hilog_native:libhilog", "hdf_core:libhdi",
"ipc:ipc_single", "hilog_native:libhilog",
"c_utils:utils", "ipc:ipc_core",
] ]
install_images = [ chipset_base_dir ] install_images = [ chipset_base_dir ]
...@@ -173,22 +177,20 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程 ...@@ -173,22 +177,20 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程
group("hdf_nnrt_service") { group("hdf_nnrt_service") {
deps = [ deps = [
":libnnrt_driver", ":libnnrt_driver",
":libnnrt_service_1.0", ":libnnrt_service_2.0",
] ]
} }
``` ```
将```group("hdf_nnrt_service")```添加到```drivers/peripheral/nnrt/BUILD.gn```文件中,以便在更上目录层级就能引用。 将```group("hdf_nnrt_service")```添加到```drivers/peripheral/nnrt/v2_0/BUILD.gn```文件中,以便在更上目录层级就能引用。
```shell ```shell
if (defined(ohos_lite)) { if (defined(ohos_lite)) {
group("nnrt_entry") { group("nnrt_entry") {
deps = [ ] deps = []
} }
} else { } else {
group("nnrt_entry") { group("nnrt_entry") {
deps = [ deps = [ "./hdi_cpu_service:hdf_nnrt_service" ]
"./hdi_cpu_service:hdf_nnrt_service",
]
} }
} }
``` ```
...@@ -198,7 +200,7 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程 ...@@ -198,7 +200,7 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程
{ {
"name": "drivers_peripheral_nnrt", "name": "drivers_peripheral_nnrt",
"description": "Neural network runtime device driver", "description": "Neural network runtime device driver",
"version": "3.2", "version": "4.0",
"license": "Apache License 2.0", "license": "Apache License 2.0",
"component": { "component": {
"name": "drivers_peripheral_nnrt", "name": "drivers_peripheral_nnrt",
...@@ -209,10 +211,10 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程 ...@@ -209,10 +211,10 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程
"ram": "2048KB", "ram": "2048KB",
"deps": { "deps": {
"components": [ "components": [
"ipc", "c_utils",
"hdf_core", "hdf_core",
"hiviewdfx_hilog_native", "hilog_native",
"c_utils" "ipc"
], ],
"third_part": [ "third_part": [
"bounds_checking_function" "bounds_checking_function"
...@@ -220,7 +222,7 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程 ...@@ -220,7 +222,7 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程
}, },
"build": { "build": {
"sub_component": [ "sub_component": [
"//drivers/peripheral/nnrt:nnrt_entry" "//drivers/peripheral/nnrt/v2_0:nnrt_entry"
], ],
"test": [ "test": [
], ],
...@@ -233,7 +235,7 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程 ...@@ -233,7 +235,7 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程
#### 声明HDI服务 #### 声明HDI服务
在对应产品的uhdf hcs配置文件中声明用户态驱动与服务,例如针对RK3568服务需要在```vendor/hihope/rk3568/hdf_config/uhdf/device_info.hcs```文件中新增如下配置: 在对应产品的uhdf hcs配置文件中声明NNRt的用户态驱动与服务。例如针对RK3568,服务需要在```vendor/hihope/rk3568/hdf_config/uhdf/device_info.hcs```文件中新增如下配置:
```text ```text
nnrt :: host { nnrt :: host {
hostName = "nnrt_host"; hostName = "nnrt_host";
...@@ -265,23 +267,60 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程 ...@@ -265,23 +267,60 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程
#### 配置SELinux #### 配置SELinux
OpenHarmony已经开启SELinux特性,需要对新增的进程和服务配置相应的SELinux规则,用于运行host进程启动访问某些资源、发布HDI服务。 OpenHarmony已经开启SELinux特性,需要对新增的进程和服务配置相应的SELinux规则,用于运行host进程访问某些资源、发布HDI服务等。
1.```base/security/selinux/sepolicy/ohos_policy/drivers/adapter/public/hdf_service_contexts```文件中新增配置:
```text
# 新增配置
nnrt_device_service u:object_r:hdf_nnrt_device_service:s0
```
> ```nnrt_host```为[声明HDI服务](#声明hdi服务)步骤中配置的进程名称,下同。
2.```base/security/selinux/sepolicy/ohos_policy/drivers/adapter/public/hdf_service.te```文件中新增配置:
```text
# 新增配置
type hdf_nnrt_device_service, hdf_service_attr;
```
1.```base/security/selinux/sepolicy/ohos_policy/drivers/adapter/vendor/type.te```文件中配置nnrt_host进程安全上下文,新增配置如下: 3.```base/security/selinux/sepolicy/ohos_policy/drivers/adapter/public/hdfdomain.te```文件中新增配置:
```text
# 新增配置
neverallow { domain -hdfdomain -sadomain } { hdfdomain -nnrt_host -allocator_host -hdf_public_domain }:binder call;
```
4.```base/security/selinux/sepolicy/ohos_policy/drivers/adapter/public/type.te```文件中新增配置:
```text ```text
# 新增配置 # 新增配置
type nnrt_host, hdfdomain, domain; type nnrt_host, hdfdomain, domain;
``` ```
> nnrt_host为上文配置的进程名称。
2. 由于SeLinux是白名单访问的权限机制,需要根据实际权限需求配置。将服务启动之后,可通过以下dmesg命令查看avc告警, 5.```base/security/selinux/sepolicy/ohos_policy/drivers/adapter/vendor/hdf_devmgr.te```文件中新增配置:
avc告警会给出缺少的权限。SeLinux的配置也可以参考[OpenHarmony SeLinux子系统的说明](https://gitee.com/openharmony/security_selinux/blob/master/README.md) ```text
```shell # 新增配置
hdc_std shell allow hdf_devmgr nnrt_host:binder { call transfer };
dmesg | grep nnrt allow hdf_devmgr nnrt_host:dir { search };
allow hdf_devmgr nnrt_host:file { open read write };
allow hdf_devmgr nnrt_host:process { getattr };
``` ```
3. 新建nnrt_host.te配置文件,将权限配置到nnrt_host.te文件中。 6.```base/security/selinux/sepolicy/ohos_policy/drivers/adapter/vendor/init.te```文件中新增配置:
```text
# 新增配置
allow init nnrt_host:process { rlimitinh siginh transition };
```
7.```base/security/selinux/sepolicy/ohos_policy/startup/init/public/chipset_init.te```文件中作如下修改:
找到chipset_init这一行:
```text
allow chipset_init { light_host input_user_host wifi_host camera_host power_host audio_host }:process { rlimitinh siginh transition };
```
在host列表中增加nnrt_host:
```text
allow chipset_init { light_host input_user_host wifi_host camera_host power_host audio_host nnrt_host }:process { rlimitinh siginh transition };
```
8. 新建```nnrt_host.te```配置文件:
```shell ```shell
# 创建nnrt文件夹 # 创建nnrt文件夹
mkdir base/security/selinux/sepolicy/ohos_policy/drivers/peripheral/nnrt mkdir base/security/selinux/sepolicy/ohos_policy/drivers/peripheral/nnrt
...@@ -293,24 +332,47 @@ avc告警会给出缺少的权限。SeLinux的配置也可以参考[OpenHarmony ...@@ -293,24 +332,47 @@ avc告警会给出缺少的权限。SeLinux的配置也可以参考[OpenHarmony
touch base/security/selinux/sepolicy/ohos_policy/drivers/peripheral/nnrt/vendor/nnrt_host.te touch base/security/selinux/sepolicy/ohos_policy/drivers/peripheral/nnrt/vendor/nnrt_host.te
``` ```
4. 将所需的权限写入nnrt_host.te文件中,比如 9. 将所需的权限写入```nnrt_host.te```文件中
```text ```text
allow nnrt_host dev_hdf_kevent:chr_file { ioctl }; allow nnrt_host dev_hdf_kevent:chr_file { ioctl };
allow nnrt_host hilog_param:file { read }; allow nnrt_host hilog_param:file { read open map };
allow nnrt_host sh:binder { transfer }; allow nnrt_host sh:binder { transfer };
allow nnrt_host samgr:binder { call };
allow nnrt_host dev_ashmem_file:chr_file { open }; allow nnrt_host dev_ashmem_file:chr_file { open };
allow nnrt_host dev_unix_socket:dir { search };
allow nnrt_host hdf_device_manager:hdf_devmgr_class { get };
allow nnrt_host hdf_nnrt_device_service:hdf_devmgr_class { add get };
allow nnrt_host dev_console_file:chr_file { read write };
allow nnrt_host debug_param:file { read open map };
allow nnrt_host sa_device_service_manager:samgr_class { get };
allow nnrt_host hdf_devmgr:binder { call transfer };
allow nnrt_host hdf_nnrt_device_service:binder { call };
allow nnrt_host sysfs_devices_system_cpu:file { read open getattr };
allow sh hdf_nnrt_device_service:hdf_devmgr_class { add get };
allow sh hdf_hci_interface_service:hdf_devmgr_class { get };
allow sh nnrt_host:dir { getattr search };
allow sh nnrt_host:file { open read };
allow sh nnrt_host:process { getattr };
allow sh nnrt_host:binder { call };
allow sh nnrt_host:fd { use }; allow sh nnrt_host:fd { use };
``` ```
10. 由于SELinux是白名单访问的权限机制,需要根据实际权限需求配置。将服务启动之后,可通过以下dmesg命令查看avc告警,
avc告警会给出缺少的权限。SELinux的配置也可以参考[OpenHarmony SELinux子系统的说明](https://gitee.com/openharmony/security_selinux/blob/master/README.md)
```shell
hdc_std shell
dmesg | grep nnrt
```
#### 配置部件编译入口 #### 配置部件编译入口
以RK3568产品为例: 以RK3568产品为例:
```shell ```shell
vim //productdefine/common/inherit/chipset_common.json vim //productdefine/common/inherit/chipset_common.json
``` ```
"subsystems", "subsystem":"hdf", "components"中添加: ```"subsystems"```, ```"subsystem":"hdf"```, ```"components"```中添加:
```shell ```shell
{ {
"component": "drivers_peripheral_foo", "component": "drivers_peripheral_nnrt",
"features": [] "features": []
} }
``` ```
...@@ -326,22 +388,22 @@ rm -rf ./out ...@@ -326,22 +388,22 @@ rm -rf ./out
### 调测验证 ### 调测验证
服务开发完成后,可以使用XTS用例验证基本功能和兼容性开发者可通过以下步骤进行验证: 服务开发完成后,可以使用XTS用例验证基本功能和兼容性开发者可通过以下步骤进行验证:
1. 编译NNRt的hats用例,用例在```test/xts/hats/hdf/nnrt```目录下。 1. 编译NNRt的hats用例,用例在```test/xts/hats/ai/nnrt/hdi```目录下。
```shell ```shell
# 进入hats目录 # 进入hats目录
cd test/xts/hats cd test/xts/hats
# 编译hats测试用例 # 编译hats测试用例
./build.sh suite=hats system_size=standard --product-name rk3568 ./build.sh suite=hats system_size=standard product_name=rk3568
# 回到代码根目录 # 回到代码根目录
cd - cd -
``` ```
编译好的测试用例会输出到相对代码根目录的```out/rk3568/suites/hats/testcases/HatsHdfNnrtFunctionTest```路径下。 编译好的测试用例可执行文件```HatsHdfNnrtFunctionTest```会输出到```out/rk3568/suites/hats/testcases/```下。
2. 将测试用例push到设备上 2. 将测试用例push到RK3568设备的```/data/local/tmp/```目录下
```shell ```shell
# 将测试用例可执行文件推送到设备上,HatsHdfNnrtFunctionTest是测试用例可执行文件。 # 将测试用例可执行文件推送到设备上,HatsHdfNnrtFunctionTest是测试用例可执行文件。
hdc_std file send out/rk3568/suites/hats/testcases/HartsHdfNnrtFunctionTest /data/local/tmp/ hdc_std file send out/rk3568/suites/hats/testcases/HartsHdfNnrtFunctionTest /data/local/tmp/
...@@ -356,7 +418,7 @@ rm -rf ./out ...@@ -356,7 +418,7 @@ rm -rf ./out
hdc_std shell "/data/local/tmp/HatsHdfNnrtFunctionTest" hdc_std shell "/data/local/tmp/HatsHdfNnrtFunctionTest"
``` ```
所有hats用例执行成功,可以看到测试报告显示已通过47个用例,说明服务通过了兼容性测试。 测试报告显示已通过47个用例,说明所有hats用例已执行成功,服务已通过兼容性测试。
```text ```text
... ...
[----------] Global test environment tear-down [----------] Global test environment tear-down
...@@ -368,37 +430,40 @@ rm -rf ./out ...@@ -368,37 +430,40 @@ rm -rf ./out
### 开发实例 ### 开发实例
完整Demo代码可以参考[社区实现](https://gitee.com/openharmony/ai_neural_network_runtime/tree/master/example/drivers) 完整Demo代码可以参考[社区实现](https://gitee.com/openharmony/ai_neural_network_runtime/tree/master/example/drivers)
1. 拷贝```example/driver/nnrt```目录到```drivers/peripheral```路径下。 1. 进入OpenHarmony源码根目录,在```drivers/peripheral```路径下创建```nnrt```目录,拷贝NNRt源码路径```foundation/ai/neural_network_runtime```下的```example/driver/nnrt/v2_0```目录到```drivers/peripheral/nnrt```路径下。
```shell ```shell
cp -r example/driver/nnrt drivers/peripheral cp -r example/drivers/nnrt/v2_0 drivers/peripheral/nnrt
``` ```
2. 补充bundle.json文件到```drivers/peripheral/nnrt```,bundle.json参考本教程上面的[开发步骤](#开发步骤)章节。 2. ```drivers/peripheral/nnrt```下补充```bundle.json```文件,```bundle.json```的写法参考本教程上面[开发步骤](#开发步骤)中的[实现HDI服务](#实现hdi服务)章节。
3. 由于Demo依赖MindSpore Lite CPU算子,故需要添加MindSpore Lite依赖文件。 3. 由于Demo依赖MindSpore Lite CPU算子,因此需要添加MindSpore Lite依赖文件:
- 下载MindSpore Lite的头文件,[MindSpore Lite 1.5.0](https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.5.0/MindSpore/lite/release/linux/mindspore-lite-1.5.0-linux-x64.tar.gz) - 下载MindSpore Lite的头文件,[MindSpore Lite 1.8.1](https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.8.1/MindSpore/lite/release/android/gpu/mindspore-lite-1.8.1-android-aarch64.tar.gz)
-```drivers/peripheral/nnrt```目录下新建mindspore目录,用于存放mindspore依赖库和头文件。 -```drivers/peripheral/nnrt/v2_0```下创建```mindspore```目录,用于存放mindspore动态库和头文件。
```shell
mkdir drivers/peripheral/nnrt/v2_0/mindspore
```
- 解压```mindspore-lite-1.8.1-android-aarch64.tar.gz```文件,将```runtime/include```目录拷贝到```drivers/peripheral/nnrt/v2_0/mindspore```目录下。
```shell ```shell
mkdir drivers/peripheral/nnrt/mindspore cp mindspore-lite-1.8.1-android-aarch64/runtime/include drivers/peripheral/nnrt/v2_0/mindspore
``` ```
- 解压mindspore-lite-1.5.0-linux-x64.tar.gz文件,将```runtime/include```目录拷贝到```drivers/peripheral/nnrt/mindspore```目录下。 - Demo还依赖mindspore的```schema```文件:
- Demo还依赖mindspore的schema文件。
```shell ```shell
# 创建mindspore_schema目录 # 创建mindspore_schema目录
mkdir drivers/peripheral/nnrt/hdi_cpu_service/include/mindspore_schema mkdir drivers/peripheral/nnrt/v2_0/hdi_cpu_service/include/mindspore_schema
# 拷贝mindspore schema文件 # 从third_party目录拷贝mindspore schema文件
cp third_party/mindspore/mindspore/lite/schema/* drivers/peripheral/nnrt/hdi_cpu_service/include/mindspore_schema/ cp third_party/mindspore/mindspore/lite/schema/* drivers/peripheral/nnrt/v2_0/hdi_cpu_service/include/mindspore_schema/
``` ```
- 编译MindSpore Lite的动态库,并将动态库放到mindspore目录下。 - 编译OpenHarmony的MindSpore Lite动态库,并将动态库拷贝到```mindspore```目录下。
```shell ```shell
# 编译mindspore动态库 # 编译mindspore动态库
./build.sh --product-name rk3568 -ccaache --jobs 4 --build-target mindspore_lib ./build.sh --product-name rk3568 -ccaache --jobs 4 --build-target mindspore_lib
# 将mindspore动态库 # 在drivers/peripheral/nnrt/v2_0/mindspore下创建mindspore目录
mkdir drivers/peripheral/nnrt/mindspore/mindspore mkdir drivers/peripheral/nnrt/v2_0/mindspore/mindspore
# 将mindspore动态拷贝到drivers/peripheral/nnrt/mindspore/mindspore。 # 从out目录将mindspore动态库拷贝到drivers/peripheral/nnrt/v2_0/mindspore/mindspore下
cp out/rk3568/package/phone/system/lib/libmindspore-lite.huawei.so drivers/peripheral/nnrt/mindspore/mindspore/ cp out/rk3568/package/phone/system/lib/libmindspore-lite.huawei.so drivers/peripheral/nnrt/v2_0/mindspore/mindspore/
``` ```
4. 其他配置请参考本教程上面的[开发步骤](#开发步骤)章节。 4. 其他配置请参考本教程上面的[开发步骤](#开发步骤)章节。
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册