From 9abfe4541eefb1e5c257b3463a4267850f56bdb0 Mon Sep 17 00:00:00 2001 From: gWX1231951 Date: Thu, 10 Aug 2023 09:59:05 +0800 Subject: [PATCH 1/4] change to ndk and change nnrt_ndk.so Signed-off-by: gWX1231951 --- frameworks/BUILD.gn | 3 +- interfaces/kits/c/BUILD.gn | 30 +++++++++---------- interfaces/kits/c/neural_network_runtime.h | 1 + .../kits/c/neural_network_runtime_type.h | 3 +- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/frameworks/BUILD.gn b/frameworks/BUILD.gn index 3263b30..b5dee03 100644 --- a/frameworks/BUILD.gn +++ b/frameworks/BUILD.gn @@ -106,6 +106,7 @@ ops_sources = [ ohos_shared_library("libneural_network_runtime") { sources = nnrt_sources sources += ops_sources + output_extension = "so" include_dirs = [ "..", "//third_party/mindspore/mindspore-src/source/mindspore/lite/mindir/include", @@ -130,6 +131,6 @@ ohos_shared_library("libneural_network_runtime") { ] subsystem_name = "ai" - innerapi_tags = [ "platformsdk_indirect" ] + innerapi_tags = [ "ndk" ] part_name = "neural_network_runtime" } diff --git a/interfaces/kits/c/BUILD.gn b/interfaces/kits/c/BUILD.gn index db9a140..856097a 100644 --- a/interfaces/kits/c/BUILD.gn +++ b/interfaces/kits/c/BUILD.gn @@ -14,21 +14,21 @@ import("//build/ohos.gni") ohos_ndk_library("libneural_network_runtime_ndk") { - output_name = "neural_network_runtime.z" - output_extension = "so" - ndk_description_file = "libneural_network_runtime.ndk.json" - min_compact_version = "9" - system_capability = "SystemCapability.AI.NeuralNetworkRuntime" - system_capability_headers = [ - "neural_network_runtime.h", - "neural_network_runtime_type.h", - ] + output_name = "neural_network_runtime" + output_extension = "so" + ndk_description_file = "libneural_network_runtime.ndk.json" + min_compact_version = "9" + system_capability = "SystemCapability.AI.NeuralNetworkRuntime" + system_capability_headers = [ + "neural_network_runtime.h", + "neural_network_runtime_type.h", + ] } ohos_ndk_headers("libneural_network_runtime_header") { - dest_dir = "$ndk_headers_out_dir/neural_network_runtime" - sources = [ - "neural_network_runtime.h", - "neural_network_runtime_type.h", - ] -} \ No newline at end of file + dest_dir = "$ndk_headers_out_dir/neural_network_runtime" + sources = [ + "neural_network_runtime.h", + "neural_network_runtime_type.h", + ] +} diff --git a/interfaces/kits/c/neural_network_runtime.h b/interfaces/kits/c/neural_network_runtime.h index b5cc5e2..b7740e1 100644 --- a/interfaces/kits/c/neural_network_runtime.h +++ b/interfaces/kits/c/neural_network_runtime.h @@ -31,6 +31,7 @@ * to construct and compile models and perform inference and computing on acceleration hardware. * Note: Currently, the APIs of Neural Network Runtime do not support multi-thread calling. \n * + * @library libneural_network_runtime.so * @since 9 * @version 1.0 */ diff --git a/interfaces/kits/c/neural_network_runtime_type.h b/interfaces/kits/c/neural_network_runtime_type.h index 3bbbb4c..00aefb6 100644 --- a/interfaces/kits/c/neural_network_runtime_type.h +++ b/interfaces/kits/c/neural_network_runtime_type.h @@ -28,7 +28,8 @@ * @file neural_network_runtime_type.h * * @brief Defines the structure and enumeration for Neural Network Runtime. - * + * + * @library libneural_network_runtime.so * @since 9 * @version 1.0 */ -- Gitee From 72fb95d8d8ed0c354efdac980ab4ee2bc1641b2c Mon Sep 17 00:00:00 2001 From: gWX1231951 Date: Thu, 24 Aug 2023 17:03:53 +0800 Subject: [PATCH 2/4] =?UTF-8?q?nnrt=E5=91=8A=E8=AD=A6=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: gWX1231951 --- .../src/nnrt_device_service.cpp | 22 ++++++++++--------- .../src/nnrt_device_service.cpp | 22 ++++++++++--------- frameworks/native/device_discover_v2_0.cpp | 13 ++++++----- frameworks/native/hdi_device_v2_0.cpp | 2 +- frameworks/native/hdi_device_v2_0.h | 2 +- frameworks/native/hdi_prepared_model_v1_0.cpp | 4 ++-- frameworks/native/hdi_prepared_model_v2_0.cpp | 4 ++-- frameworks/native/inner_model.h | 2 +- test/fuzztest/data.h | 4 ++-- .../hdinnrtdevice_fuzzer.cpp | 2 +- .../hdinnrtpreparedmodel_fuzzer.cpp | 3 +-- 11 files changed, 42 insertions(+), 38 deletions(-) diff --git a/example/drivers/nnrt/v1_0/hdi_cpu_service/src/nnrt_device_service.cpp b/example/drivers/nnrt/v1_0/hdi_cpu_service/src/nnrt_device_service.cpp index f609edf..3ce36d6 100644 --- a/example/drivers/nnrt/v1_0/hdi_cpu_service/src/nnrt_device_service.cpp +++ b/example/drivers/nnrt/v1_0/hdi_cpu_service/src/nnrt_device_service.cpp @@ -265,18 +265,20 @@ int32_t NnrtDeviceService::ValidateModel(const Model& model) const } size_t tensorSize = model.allTensors.size(); - for (auto index : model.inputIndex) { - if (index > tensorSize) { - HDF_LOGE("Input index is invalid, index=%u", index); - return HDF_ERR_INVALID_PARAM; - } + auto inputIt = std::find_if(model.inputIndex.begin(), model.inputIndex.end(), [tensorSize](size_t inputIndex) { + return inputIndex > tensorSize; + }) + if (inputIt != model.inputIndex.end()) { + HDF_LOGE("Input index is invalid, index=%u", *inputIt); + return HDF_ERR_INVALID_PARAM; } - for (auto index : model.outputIndex) { - if (index > tensorSize) { - HDF_LOGE("Output index is invalid, index=%u", index); - return HDF_ERR_INVALID_PARAM; - } + auto outputIt = std::find_if(model.outputIndex.begin(), model.outputIndex.end(), [tensorSize](size_t outputIndex) { + return outputIndex > tensorSize; + }) + if (outputIt != model.outputIndex.end()) { + HDF_LOGE("Output index is invalid, index=%u", *outputIt); + return HDF_ERR_INVALID_PARAM; } return HDF_SUCCESS; diff --git a/example/drivers/nnrt/v2_0/hdi_cpu_service/src/nnrt_device_service.cpp b/example/drivers/nnrt/v2_0/hdi_cpu_service/src/nnrt_device_service.cpp index 5da4e95..a2482a0 100644 --- a/example/drivers/nnrt/v2_0/hdi_cpu_service/src/nnrt_device_service.cpp +++ b/example/drivers/nnrt/v2_0/hdi_cpu_service/src/nnrt_device_service.cpp @@ -300,18 +300,20 @@ NNRT_ReturnCode NnrtDeviceService::ValidateModel(const Model& model) const } size_t tensorSize = model.allTensors.size(); - for (auto index : model.inputIndex) { - if (index > tensorSize) { - HDF_LOGE("Input index is invalid, index=%u", index); - return NNRT_ReturnCode::NNRT_INVALID_INPUT; - } + auto inputIt = std::find_if(model.inputIndex.begin(), model.inputIndex.end(), [tensorSize](size_t inputIndex) { + return inputIndex > tensorSize; + }) + if (inputIt != model.inputIndex.end()) { + HDF_LOGE("Input index is invalid, index=%u", *inputIt); + return NNRT_ReturnCode::NNRT_INVALID_INPUT; } - for (auto index : model.outputIndex) { - if (index > tensorSize) { - HDF_LOGE("Output index is invalid, index=%u", index); - return NNRT_ReturnCode::NNRT_INVALID_OUTPUT; - } + auto outputIt = std::find_if(model.outputIndex.begin(), model.outputIndex.end(), [tensorSize](size_t outputIndex) { + return outputIndex > tensorSize; + }) + if (outputIt != model.outputIndex.end()) { + HDF_LOGE("Output index is invalid, index=%u", *outputIt); + return NNRT_ReturnCode::NNRT_INVALID_OUTPUT; } return NNRT_ReturnCode::NNRT_SUCCESS; diff --git a/frameworks/native/device_discover_v2_0.cpp b/frameworks/native/device_discover_v2_0.cpp index 7b0ad86..d71ff33 100644 --- a/frameworks/native/device_discover_v2_0.cpp +++ b/frameworks/native/device_discover_v2_0.cpp @@ -31,8 +31,9 @@ std::shared_ptr DiscoverHDIDevicesV2_0(std::string& deviceName, std::str } auto ret = iDevice->GetDeviceName(deviceName); - if (ret != V2_0::NNRT_ReturnCode::NNRT_SUCCESS) { - if (ret < V2_0::NNRT_ReturnCode::NNRT_SUCCESS) { + int32_t nnrtSuccess = static_cast(V2_0::NNRT_ReturnCode::NNRT_SUCCESS); + if (ret != nnrtSuccess) { + if (ret < nnrtSuccess) { LOGW("Get device name failed. An error occurred in HDI, errorcode is %{public}d.", ret); } else { OHOS::HDI::Nnrt::V2_0::NNRT_ReturnCode nnrtRet = static_cast(ret); @@ -42,8 +43,8 @@ std::shared_ptr DiscoverHDIDevicesV2_0(std::string& deviceName, std::str } ret = iDevice->GetVendorName(vendorName); - if (ret != V2_0::NNRT_ReturnCode::NNRT_SUCCESS) { - if (ret < V2_0::NNRT_ReturnCode::NNRT_SUCCESS) { + if (ret != nnrtSuccess) { + if (ret < nnrtSuccess) { LOGW("Get vendor name failed. An error occurred in HDI, errorcode is %{public}d.", ret); } else { OHOS::HDI::Nnrt::V2_0::NNRT_ReturnCode nnrtRet = static_cast(ret); @@ -54,8 +55,8 @@ std::shared_ptr DiscoverHDIDevicesV2_0(std::string& deviceName, std::str std::pair hdiVersion; ret = iDevice->GetVersion(hdiVersion.first, hdiVersion.second); - if (ret != V2_0::NNRT_ReturnCode::NNRT_SUCCESS) { - if (ret < V2_0::NNRT_ReturnCode::NNRT_SUCCESS) { + if (ret != nnrtSuccess) { + if (ret < nnrtSuccess) { LOGW("Get version failed. An error occurred in HDI, errorcode is %{public}d.", ret); } else { OHOS::HDI::Nnrt::V2_0::NNRT_ReturnCode nnrtRet = static_cast(ret); diff --git a/frameworks/native/hdi_device_v2_0.cpp b/frameworks/native/hdi_device_v2_0.cpp index d10b508..e55d6a6 100644 --- a/frameworks/native/hdi_device_v2_0.cpp +++ b/frameworks/native/hdi_device_v2_0.cpp @@ -534,7 +534,7 @@ OH_NN_ReturnCode HDIDeviceV2_0::CopyOfflineModelToDevice(const std::vector& deviceBuffers, const ModelConfig& config, - const std::map> extensions, + const std::map>& extensions, std::shared_ptr& preparedModel) { V2_0::ModelConfig iModelConfig; diff --git a/frameworks/native/hdi_device_v2_0.h b/frameworks/native/hdi_device_v2_0.h index 61095f8..d3c3461 100644 --- a/frameworks/native/hdi_device_v2_0.h +++ b/frameworks/native/hdi_device_v2_0.h @@ -72,7 +72,7 @@ private: std::vector& deviceBuffers); OH_NN_ReturnCode PrepareOfflineModel(std::vector& deviceBuffers, const ModelConfig& config, - const std::map> extensions, + const std::map>& extensions, std::shared_ptr& preparedModel); private: diff --git a/frameworks/native/hdi_prepared_model_v1_0.cpp b/frameworks/native/hdi_prepared_model_v1_0.cpp index 35fccc6..d697ea3 100644 --- a/frameworks/native/hdi_prepared_model_v1_0.cpp +++ b/frameworks/native/hdi_prepared_model_v1_0.cpp @@ -133,7 +133,7 @@ OH_NN_ReturnCode HDIPreparedModelV1_0::Run(const std::vector& inputs, { V1_0::IOTensor iTensor; std::vector iInputTensors; - for (auto& input: inputs) { + for (const auto& input: inputs) { iTensor = TransIOTensor(input); if (iTensor.data.fd == INVALID_FD) { LOGE("Transform inputs tensor failed, cannot find data file descriptor."); @@ -143,7 +143,7 @@ OH_NN_ReturnCode HDIPreparedModelV1_0::Run(const std::vector& inputs, } std::vector iOutputTensors; - for (auto& output: outputs) { + for (const auto& output: outputs) { iTensor = TransIOTensor(output); if (iTensor.data.fd == INVALID_FD) { LOGE("Transform outputs tensor failed, cannot find data file descriptor."); diff --git a/frameworks/native/hdi_prepared_model_v2_0.cpp b/frameworks/native/hdi_prepared_model_v2_0.cpp index 40b15b2..9b0f0a4 100644 --- a/frameworks/native/hdi_prepared_model_v2_0.cpp +++ b/frameworks/native/hdi_prepared_model_v2_0.cpp @@ -133,7 +133,7 @@ OH_NN_ReturnCode HDIPreparedModelV2_0::Run(const std::vector& inputs, { V2_0::IOTensor iTensor; std::vector iInputTensors; - for (auto& input: inputs) { + for (const auto& input: inputs) { iTensor = TransIOTensor(input); if (iTensor.data.fd == INVALID_FD) { LOGE("Transform inputs tensor failed, cannot find data file descriptor."); @@ -143,7 +143,7 @@ OH_NN_ReturnCode HDIPreparedModelV2_0::Run(const std::vector& inputs, } std::vector iOutputTensors; - for (auto& output: outputs) { + for (const auto& output: outputs) { iTensor = TransIOTensor(output); if (iTensor.data.fd == INVALID_FD) { LOGE("Transform outputs tensor failed, cannot find data file descriptor."); diff --git a/frameworks/native/inner_model.h b/frameworks/native/inner_model.h index 8c7f3d5..7deec70 100644 --- a/frameworks/native/inner_model.h +++ b/frameworks/native/inner_model.h @@ -71,7 +71,7 @@ private: std::vector> m_outputTensors; // Used to pass output tensors to compilation. std::shared_ptr m_liteGraph {nullptr}; void* m_metaGraph {nullptr}; - Buffer m_quantBuffer; + Buffer m_quantBuffer = {nullptr, 0}; std::string m_modelName; }; } // namespace NeuralNetworkRuntime diff --git a/test/fuzztest/data.h b/test/fuzztest/data.h index f5b92d5..8ac8442 100644 --- a/test/fuzztest/data.h +++ b/test/fuzztest/data.h @@ -46,12 +46,12 @@ public: return object; } - const uint8_t* GetNowData() + const uint8_t* GetNowData() const { return dataFuzz + dataPos; } - size_t GetNowDataSize() + size_t GetNowDataSize() const { return dataSize - dataPos; } diff --git a/test/fuzztest/hdinnrtdevice_fuzzer/hdinnrtdevice_fuzzer.cpp b/test/fuzztest/hdinnrtdevice_fuzzer/hdinnrtdevice_fuzzer.cpp index 04a9928..9e2caf5 100644 --- a/test/fuzztest/hdinnrtdevice_fuzzer/hdinnrtdevice_fuzzer.cpp +++ b/test/fuzztest/hdinnrtdevice_fuzzer/hdinnrtdevice_fuzzer.cpp @@ -44,7 +44,7 @@ bool HdiNnrtDeviceFuzzTest(const uint8_t* data, size_t size) datas.RewindRead(0); MessageParcel reply; MessageOption option; - std::shared_ptr nnrtDeviceStub = std::make_shared(device); + OHOS::sptr nnrtDeviceStub = new V2_0::NnrtDeviceStub(device); if (nnrtDeviceStub == nullptr) { LOGE("[HdiNnrtDeviceFuzzTest]Nnrt device stub make failed."); return false; diff --git a/test/fuzztest/hdinnrtpreparedmodel_fuzzer/hdinnrtpreparedmodel_fuzzer.cpp b/test/fuzztest/hdinnrtpreparedmodel_fuzzer/hdinnrtpreparedmodel_fuzzer.cpp index 9473fa6..b02ae6e 100644 --- a/test/fuzztest/hdinnrtpreparedmodel_fuzzer/hdinnrtpreparedmodel_fuzzer.cpp +++ b/test/fuzztest/hdinnrtpreparedmodel_fuzzer/hdinnrtpreparedmodel_fuzzer.cpp @@ -44,8 +44,7 @@ bool HdiNnrtPreparedModelFuzzTest(const uint8_t* data, size_t size) datas.RewindRead(0); MessageParcel reply; MessageOption option; - std::shared_ptr preparedModelStub = - std::make_shared(preparedModel); + OHOS::sptr preparedModelStub = new V2_0::PreparedModelStub(preparedModel); if (preparedModelStub == nullptr) { LOGE("[HdiNnrtPreparedModelFuzzTest]Nnrt preparemodel stub make failed."); return false; -- Gitee From 614040d37115c7958a33f7fb040672a6f99920f5 Mon Sep 17 00:00:00 2001 From: gWX1231951 Date: Mon, 18 Sep 2023 21:42:38 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fuzz=E8=BE=93=E5=87=BA=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: gWX1231951 --- test/fuzztest/hdinnrtdevice_fuzzer/BUILD.gn | 2 +- test/fuzztest/hdinnrtpreparedmodel_fuzzer/BUILD.gn | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/fuzztest/hdinnrtdevice_fuzzer/BUILD.gn b/test/fuzztest/hdinnrtdevice_fuzzer/BUILD.gn index 46c96b6..d14bd87 100644 --- a/test/fuzztest/hdinnrtdevice_fuzzer/BUILD.gn +++ b/test/fuzztest/hdinnrtdevice_fuzzer/BUILD.gn @@ -15,7 +15,7 @@ import("//build/config/features.gni") import("//build/ohos.gni") import("//build/test.gni") -module_output_path = "drivers_interface_nnrt/nnrt" +module_output_path = "drivers_interface_nnrt/drivers_interface_nnrt" ##############################fuzztest########################################## ohos_fuzztest("HdiNnrtDeviceFuzzTest") { diff --git a/test/fuzztest/hdinnrtpreparedmodel_fuzzer/BUILD.gn b/test/fuzztest/hdinnrtpreparedmodel_fuzzer/BUILD.gn index c7614e3..99a094e 100644 --- a/test/fuzztest/hdinnrtpreparedmodel_fuzzer/BUILD.gn +++ b/test/fuzztest/hdinnrtpreparedmodel_fuzzer/BUILD.gn @@ -15,7 +15,7 @@ import("//build/config/features.gni") import("//build/ohos.gni") import("//build/test.gni") -module_output_path = "drivers_interface_nnrt/nnrt" +module_output_path = "drivers_interface_nnrt/drivers_interface_nnrt" ##############################fuzztest########################################## ohos_fuzztest("HdiNnrtPreparedModelFuzzTest") { -- Gitee From d9eb6dd742982720f527cab8593dfe578cdc004b Mon Sep 17 00:00:00 2001 From: weiwei Date: Thu, 21 Sep 2023 17:23:59 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9NNRt=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E5=BC=80=E5=8F=91=E6=8C=87=E5=AF=BC=E6=96=87=E6=A1=A3=EF=BC=8C?= =?UTF-8?q?=E5=8C=B9=E9=85=8D2.0=E7=89=88=E6=9C=AC=E7=9A=84HDI=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E5=8D=B3OpenHarmony=204.0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: weiwei --- example/drivers/README_zh.md | 557 ++++++++++++++++++++--------------- figures/arch_diagram.png | Bin 44475 -> 42053 bytes figures/dev_flow.png | Bin 28944 -> 19611 bytes 3 files changed, 322 insertions(+), 235 deletions(-) diff --git a/example/drivers/README_zh.md b/example/drivers/README_zh.md index 22df9a8..4098284 100644 --- a/example/drivers/README_zh.md +++ b/example/drivers/README_zh.md @@ -1,25 +1,23 @@ # NNRt设备开发指导 -## NNRt开发概述 +## 概述 ### 功能简介 -Neural Network Runtime(NNRt, 神经网络运行时)是面向AI领域的跨芯片推理计算运行时,作为中间桥梁连通上层AI推理框架和底层加速芯片,实现AI模型的跨芯片推理计算。 +NNRt(Neural Network Runtime,神经网络运行时)是面向AI领域的跨芯片推理计算运行时,作为中间桥梁连通上层AI推理框架和底层加速芯片,实现AI模型的跨芯片推理计算。 -本文介绍芯片厂商如何在将专有加速芯片接入NNRt,接入OpenHarmony社区生态。 +NNRt开放了设备接口,芯片厂商通过设备接口将专有加速芯片接入NNRt,从而实现与OpenHarmony社区生态的对接。以下内容将介绍芯片如何接入NNRt。 ### 基本概念 在开发前,开发者需要先了解以下概念,以便更好地理解全文内容: -- NNRt:Neural Network Runtime,神经网络运行时,是本指导主要介绍的部件。 -- OHOS:OpenHarmony Operating System,OpenHarmony操作系统。 -- HDI:Hardware Device Interface,硬件设备接口,是OHOS中系统组件与芯片组件通信的接口。 -- IDL:Interface Description Language,接口描述语言,是HDI接口的语言格式。 +- HDI(Hardware Device Interface):OpenHarmony硬件设备接口,定义系统中跨进程通信的接口,实现服务间的跨进程通信。 +- IDL(Interface Description Language):接口描述语言,是HDI接口的语言格式。 ### 约束与限制 -- 系统版本:OpenHarmony master分支。 +- 系统版本:OpenHarmony主干版本。 - 开发环境:Ubuntu 18.04及以上。 -- 接入设备:OpenHarmony定义的标准设备。 +- 接入设备:具备AI计算能力的芯片。 ### 运作机制 NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程通信。 @@ -28,74 +26,80 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程 ![架构图](../../figures/arch_diagram.png) -整个架构主要分为三层,AI应用在应用层,AI推理框架和神经网络运行时在系统层,设备服务在芯片层。AI应用要在专用加速芯片上完成模型推理,需要经过AI推理框架和神经网络运行时才能调用到底层的芯片设备,而神经网络运行时就是负责适配底层各种芯片设备,它开放了标准统一的南向接口,众多的第三方芯片设备都可以通过HDI接口接入OHOS。 +整个架构主要分为三层,AI应用在应用层,AI推理框架和NNRt在系统层,设备服务在芯片层。AI应用如果要使用AI专用加速芯片进行模型推理,需要经过AI推理框架和NNRt才能调用到底层AI专用加速芯片,NNRt就是负责适配底层各种AI专用加速芯片的中间层。NNRt开放了标准统一的HDI设备接口,众多AI专用加速芯片都可以通过HDI接口接入OpenHarmony。此外NNRt也开放了标准统一的接口对接上层各种AI推理框架。 -程序运行时,AI应用、AI推理框架、神经网络运行时都在同一个进程,底层设备服务在另一个进程,进程间是通过IPC的机制通信,神经网络运行时根据南向HDI接口实现了HDI Client,服务端也需要根据南向HDI接口实现HDI Service。 +程序运行时,AI应用、AI推理框架、NNRt都运行在用户进程中,底层AI芯片设备服务运行在HDI服务进程中。NNRt根据HDI接口实现了HDI Client,服务端也需要根据HDI接口实现HDI Service,两者通过OpenHarmony标准的HDF子系统实现跨进程通信。 -## NNRt开发指导 +## 开发指导 ### 场景介绍 -下文以rk3568芯片为例,展示rk3568 CPU如何通过HDI接口接入NNRt,并完成AI模型推理。 -> 依赖说明:该教程展示的rk3568 CPU接入NNRt并没有实际去写CPU的驱动,而是借用了Mindspore-Lite的CPU算子,故会依赖MindSpore-Lite的动态库以及头文件,实际开发时并不需要依赖MindSpore-Lite的任何库或者头文件。 +当需要将一款AI加速芯片接入NNRt的时候,可以参考下文。下文以RK3568芯片为例,展示RK3568 CPU如何通过NNRt的V2.0版本HDI接口接入NNRt,并完成AI模型推理。V1.0版本HDI接口接入NNRt的流程与此类似。 +> 依赖说明:该教程展示的RK3568 CPU接入NNRt并没有真正实现CPU的驱动,而是借用了MindSpore Lite的runtime和CPU算子,因此会依赖MindSpore Lite的动态库以及头文件。实际开发时并不需要依赖MindSpore Lite的任何库或者头文件。 ### 开发流程 -适配操作的整体流程如下: +AI专用加速芯片接入NNRt的整体流程如下: -**图2** NNRt适配流程 +**图2** AI专用加速芯片接入NNRt流程 ![开发流程](../../figures/dev_flow.png) ### 开发步骤 -开发者具体可通过以下步骤在芯片侧对接NNRt: -1. 开源社区下载OpenHarmony的代码,编译drivers_interface部件,生成HDI接口的头文件。 - - [下载源码](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/get-code/sourcecode-acquire.md)。 - - 编译接口IDL文件。 - ```shell - ./build.sh --product-name rk3568 –ccache --build-target drivers_interface_nnrt - ``` - - 编译之后,可以在```out/rk3568/gen/drivers/interface/nnrt```目录下找到生成的头文件,默认生成C++头文件,若需要生成C头文件,则修改```drivers/interface/nnrt/v1_0/BUILD.gn```文件中的language。 - ```shell - language = "c" - ``` - - 生成头文件目录如下所示: - ```text - out/rk3568/gen/drivers/interface/nnrt - └── v1_0 - ├── drivers_interface_nnrt__libnnrt_proxy_1.0_external_deps_temp.json - ├── drivers_interface_nnrt__libnnrt_stub_1.0_external_deps_temp.json - ├── innrt_device.h # 设备接口头文件 - ├── iprepared_model.h # 编译AI模型对象头文件 - ├── libnnrt_proxy_1.0__notice.d - ├── libnnrt_stub_1.0__notice.d - ├── model_types.cpp # AI模型结构定义实现文件 - ├── model_types.h # AI模型结构定义头文件 - ├── nnrt_device_driver.cpp # 设备驱动实现参考样例 - ├── nnrt_device_proxy.cpp - ├── nnrt_device_proxy.h - ├── nnrt_device_service.cpp # 设备服务端实现参考样例 - ├── nnrt_device_service.h # 设备服务端头文件 - ├── nnrt_device_stub.cpp - ├── nnrt_device_stub.h - ├── nnrt_types.cpp # 数据类型定义实现文件 - ├── nnrt_types.h # 数据类型定义头文件 - ├── node_attr_types.cpp # AI模型算子属性定义实现文件 - ├── node_attr_types.h # AI模型算子属性定义 - ├── prepared_model_proxy.cpp - ├── prepared_model_proxy.h - ├── prepared_model_service.cpp # 编译AI模型对象服务端实现参考样例 - ├── prepared_model_service.h # 编译AI模型对象服务端头文件 - ├── prepared_model_stub.cpp - └── prepared_model_stub.h - ``` - -2. 实现HDI服务。 - - 在drivers/peripheral目录下新建开发目录,用于HDI服务开发,开发目录结构如下所示。 - ```text - drivers/peripheral/nnrt +AI芯片设备HDI服务开发者具体可通过以下步骤实现AI专用加速芯片对接NNRt: +#### 生成HDI头文件 +开源社区下载OpenHarmony的代码,编译drivers_interface部件,生成HDI接口的头文件。 + +1. [下载源码](../get-code/sourcecode-acquire.md)。 + +2. 进入OpenHarmony源码根目录,编译NNRt的IDL接口文件(以RK3568产品为例): + ```shell + ./build.sh --product-name rk3568 –ccache --build-target drivers_interface_nnrt + ``` + + 编译完成后,会在```out/rk3568/gen/drivers/interface/nnrt/v2_0```目录下生成C++类型的HDI头文件。若需要生成C类型的头文件,请在编译之前使用如下命令对```drivers/interface/nnrt/v2_0/BUILD.gn```文件中的```language```配置项进行设置。 + + ```shell + language = "c" + ``` + + 生成头文件目录如下所示: + ```text + out/rk3568/gen/drivers/interface/nnrt + └── v2_0 + ├── drivers_interface_nnrt__libnnrt_proxy_2.0_external_deps_temp.json + ├── drivers_interface_nnrt__libnnrt_stub_2.0_external_deps_temp.json + ├── innrt_device.h # 设备接口头文件 + ├── iprepared_model.h # 编译AI模型对象头文件 + ├── libnnrt_proxy_2.0__notice.d + ├── libnnrt_stub_2.0__notice.d + ├── model_types.cpp # AI模型结构定义实现文件 + ├── model_types.h # AI模型结构定义头文件 + ├── nnrt_device_driver.cpp # 设备驱动实现参考样例 + ├── nnrt_device_proxy.cpp + ├── nnrt_device_proxy.h + ├── nnrt_device_service.cpp # 设备服务端实现参考样例 + ├── nnrt_device_service.h # 设备服务端头文件 + ├── nnrt_device_stub.cpp + ├── nnrt_device_stub.h + ├── nnrt_types.cpp # 数据类型定义实现文件 + ├── nnrt_types.h # 数据类型定义头文件 + ├── node_attr_types.cpp # AI模型算子属性定义实现文件 + ├── node_attr_types.h # AI模型算子属性定义 + ├── prepared_model_proxy.cpp + ├── prepared_model_proxy.h + ├── prepared_model_service.cpp # 编译AI模型对象服务端实现参考样例 + ├── prepared_model_service.h # 编译AI模型对象服务端头文件 + ├── prepared_model_stub.cpp + └── prepared_model_stub.h + ``` + +#### 实现HDI服务 + +1. 进入OpenHarmony源码根目录,在```drivers/peripheral```目录下新建开发目录```nnrt```,用于HDI服务开发。开发目录结构如下所示: + ```text + drivers/peripheral/nnrt + ├── bundle.json + ├── v2_0 ├── BUILD.gn # 代码编译脚本文件 - ├── bundle.json └── hdi_cpu_service # 自定义目录 ├── BUILD.gn # 代码编译脚本文件 ├── include @@ -111,172 +115,212 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程 ├── node_functions.cpp # 非必须,由具体实现决定 ├── node_registry.cpp # 非必须,由具体实现决定 └── prepared_model_service.cpp # 编译AI模型对象服务端实现文件 - ``` + ``` - - 实现设备驱动,无特殊需求可直接使用步骤1中生成的nnrt_device_driver.cpp文件,否则根据具体驱动开发。 - - 实现服务接口,主要实现nnrt_device_service.cpp和prepared_model_service.cpp文件,接口定义可以参考```drivers/interface/nnrt```。 +2. 实现设备驱动,无特殊需求可直接使用IDL文件编译生成的```nnrt_device_driver.cpp```文件,否则根据具体驱动开发。 - - 编译驱动和服务实现为共享库。 - 在```drivers/peripheral/nnrt/hdi_cpu_service/```下新建```BUILD.gn```文件,对驱动入口和服务实现编译为共享库。 +3. 实现服务接口,可参考```nnrt_device_service.cpp```和```prepared_model_service.cpp```实现文件,接口定义可以参考[NNRt的HDI接口定义](https://gitee.com/openharmony/drivers_interface/tree/master/nnrt)。 - ```shell - import("//build/ohos.gni") - import("//drivers/hdf_core/adapter/uhdf2/uhdf.gni") - - ohos_shared_library("libnnrt_service_1.0") { - include_dirs = [] - sources = [ - "src/nnrt_device_service.cpp", - "src/prepared_model_service.cpp", - "src/node_registry.cpp", - "src/node_functions.cpp", - "src/node_attr_types.cpp" - ] - public_deps = [ "//drivers/interface/nnrt/v1_0:nnrt_idl_headers" ] - external_deps = [ - "hdf_core:libhdf_utils", - "hiviewdfx_hilog_native:libhilog", - "ipc:ipc_single", - "c_utils:utils", - ] - - install_images = [ chipset_base_dir ] - subsystem_name = "hdf" - part_name = "drivers_peripheral_nnrt" - } +4. 编译驱动和服务的实现文件为共享库。 - ohos_shared_library("libnnrt_driver") { - include_dirs = [] - sources = [ "src/nnr_device_driver.cpp" ] - deps = [ "//drivers/peripheral/nnrt/hdi_cpu_service:libnnrt_service_1.0" ] - - external_deps = [ - "hdf_core:libhdf_host", - "hdf_core:libhdf_ipc_adapter", - "hdf_core:libhdf_utils", - "hiviewdfx_hilog_native:libhilog", - "ipc:ipc_single", - "c_utils:utils", - ] - - install_images = [ chipset_base_dir ] - subsystem_name = "hdf" - part_name = "drivers_peripheral_nnrt" - } + 在```drivers/peripheral/nnrt/v2_0/hdi_cpu_service/```下新建```BUILD.gn```文件,文件内容如下所示,相关参数配置内容可参考[Build教程](https://gitee.com/openharmony/build)。 - group("hdf_nnrt_service") { - deps = [ - ":libnnrt_driver", - ":libnnrt_service_1.0", - ] + ```shell + import("//build/ohos.gni") + import("//drivers/hdf_core/adapter/uhdf2/uhdf.gni") + + ohos_shared_library("libnnrt_service_2.0") { + include_dirs = [] + sources = [ + "src/nnrt_device_service.cpp", + "src/node_functions.cpp", + "src/node_registry.cpp", + "src/prepared_model_service.cpp", + "src/shared_buffer_parser.cpp", + "src/validation.cpp", + ] + + external_deps = [ + "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 ] + subsystem_name = "hdf" + part_name = "drivers_peripheral_nnrt" + } + + ohos_shared_library("libnnrt_driver") { + include_dirs = [] + sources = [ "src/nnr_device_driver.cpp" ] + deps = [ ":libnnrt_service_2.0" ] + + external_deps = [ + "c_utils:utils", + "drivers_interface_nnrt:libnnrt_stub_2.0", + "hdf_core:libhdf_host", + "hdf_core:libhdf_ipc_adapter", + "hdf_core:libhdf_utils", + "hdf_core:libhdi", + "hilog_native:libhilog", + "ipc:ipc_core", + ] + + install_images = [ chipset_base_dir ] + subsystem_name = "hdf" + part_name = "drivers_peripheral_nnrt" + } + + group("hdf_nnrt_service") { + deps = [ + ":libnnrt_driver", + ":libnnrt_service_2.0", + ] + } + ``` + + 将```group("hdf_nnrt_service")```添加到```drivers/peripheral/nnrt/v2_0/BUILD.gn```文件中,以便在更上目录层级就能引用。 + ```shell + if (defined(ohos_lite)) { + group("nnrt_entry") { + deps = [] } - ``` + } else { + group("nnrt_entry") { + deps = [ "./hdi_cpu_service:hdf_nnrt_service" ] + } + } + ``` - 将```group("hdf_nnrt_service")```添加到```drivers/peripheral/nnrt/BUILD.gn```文件中。 - ```shell - if (defined(ohos_lite)) { - group("nnrt_entry") { - deps = [ ] - } - } else { - group("nnrt_entry") { - deps = [ - "./hdi_cpu_service:hdf_nnrt_service", + 新建```drivers/peripheral/nnrt/bundle.json```用于定义新增的```drivers_peripheral_nnrt```部件。 + ```json + { + "name": "drivers_peripheral_nnrt", + "description": "Neural network runtime device driver", + "version": "4.0", + "license": "Apache License 2.0", + "component": { + "name": "drivers_peripheral_nnrt", + "subsystem": "hdf", + "syscap": [""], + "adapter_system_type": ["standard"], + "rom": "1024KB", + "ram": "2048KB", + "deps": { + "components": [ + "c_utils", + "hdf_core", + "hilog_native", + "ipc" + ], + "third_part": [ + "bounds_checking_function" + ] + }, + "build": { + "sub_component": [ + "//drivers/peripheral/nnrt/v2_0:nnrt_entry" + ], + "test": [ + ], + "inner_kits": [ ] } } - ``` + } + ``` - 新建```drivers/peripheral/nnrt/bundle.json```用于定义新增的```drivers_peripheral_nnrt```部件。 - ```json - { - "name": "drivers_peripheral_nnrt", - "description": "Neural network runtime device driver", - "version": "3.2", - "license": "Apache License 2.0", - "component": { - "name": "drivers_peripheral_nnrt", - "subsystem": "hdf", - "syscap": [""], - "adapter_system_type": ["standard"], - "rom": "1024KB", - "ram": "2048KB", - "deps": { - "components": [ - "ipc", - "hdf_core", - "hiviewdfx_hilog_native", - "c_utils" - ], - "third_part": [ - "bounds_checking_function" - ] - }, - "build": { - "sub_component": [ - "//drivers/peripheral/nnrt:nnrt_entry" - ], - "test": [ - ], - "inner_kits": [ - ] +#### 声明HDI服务 + + 在对应产品的uhdf hcs配置文件中声明NNRt的用户态驱动与服务。例如针对RK3568,服务需要在```vendor/hihope/rk3568/hdf_config/uhdf/device_info.hcs```文件中新增如下配置: + ```text + nnrt :: host { + hostName = "nnrt_host"; + priority = 50; + uid = ""; + gid = ""; + caps = ["DAC_OVERRIDE", "DAC_READ_SEARCH"]; + nnrt_device :: device { + device0 :: deviceNode { + policy = 2; + priority = 100; + moduleName = "libnnrt_driver.z.so"; + serviceName = "nnrt_device_service"; } - } } - ``` + } + ``` +> 注意:修改hcs文件需要删除out目录重新编译,才能生效。 + +#### 配置host进程用户ID和组ID + 对于新增的nnrt_host进程的场景,需要配置对应进程的用户ID和组ID。 进程的用户ID在文件```base/startup/init/services/etc/passwd```中配置,进程的组ID在文件```base/startup/init/services/etc/group```中配置。 + ```text + # 在base/startup/init/services/etc/passwd新增 + nnrt_host:x:3311:3311:::/bin/false + + # 在base/startup/init/services/etc/group新增 + nnrt_host:x:3311: + ``` + +#### 配置SELinux -3. 声明HDI服务。 - - 在对应产品的uhdf hcs配置文件中声明用户态驱动与服务,本例中rk3568对应在```vendor/hihope/rk3568/hdf_config/uhdf/device_info.hcs```文件中新增如下配置: +OpenHarmony已经开启SELinux特性,需要对新增的进程和服务配置相应的SELinux规则,用于运行host进程访问某些资源、发布HDI服务等。 + +1. 在```base/security/selinux/sepolicy/ohos_policy/drivers/adapter/public/hdf_service_contexts```文件中新增配置: ```text - nnrt :: host { - hostName = "nnrt_host"; - priority = 50; - uid = ""; - gid = ""; - caps = ["DAC_OVERRIDE", "DAC_READ_SEARCH"]; - nnrt_device :: device { - device0 :: deviceNode { - policy = 2; - priority = 100; - moduleName = "libnnrt_driver.z.so"; - serviceName = "nnrt_device_service"; - } - } - } + # 新增配置 + nnrt_device_service u:object_r:hdf_nnrt_device_service:s0 ``` - > 注意:修改hcs文件后请删除out目录重新编译,才能生效。 + > ```nnrt_host```为[声明HDI服务](#声明hdi服务)步骤中配置的进程名称,下同。 -4. 配置host进程用户和组。 - - 对于新增host进程的场景,需要新增配置对应进程的用户ID和组ID。 进程的用户ID在文件```base/startup/init/services/etc/passwd```中配置,进程的组ID在文件```base/startup/init/services/etc/group```中配置。 +2. 在```base/security/selinux/sepolicy/ohos_policy/drivers/adapter/public/hdf_service.te```文件中新增配置: ```text - # 在base/startup/init/services/etc/passwd新增 - nnrt_host:x:3311:3311:::/bin/false + # 新增配置 + type hdf_nnrt_device_service, hdf_service_attr; + ``` - # 在base/startup/init/services/etc/group新增 - nnrt_host:x:3311: +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; ``` - 完成上述所有配置后,全量编译版本后应该可以观察到新增host进程启动,也可以通过hilog输出检索新增的服务名称nnrt_interface_service观察到服务发布成功。 -5. SELinux配置。 +4. 在```base/security/selinux/sepolicy/ohos_policy/drivers/adapter/public/type.te```文件中新增配置: + ```text + # 新增配置 + type nnrt_host, hdfdomain, domain; + ``` - OHOS已经开启SELinux特性,需要对新增的进程和服务配置相应的SELinux规则,用于运行host进程启动访问某些资源、发布HDI服务。对于调用者来说,也需要配置SELinux规则运行获取和调用某个HDI服务。 +5. 在```base/security/selinux/sepolicy/ohos_policy/drivers/adapter/vendor/hdf_devmgr.te```文件中新增配置: + ```text + # 新增配置 + allow hdf_devmgr nnrt_host:binder { call transfer }; + allow hdf_devmgr nnrt_host:dir { search }; + allow hdf_devmgr nnrt_host:file { open read write }; + allow hdf_devmgr nnrt_host:process { getattr }; + ``` - 在```base/security/selinux/sepolicy/ohos_policy/drivers/adapter/vendor/type.te```文件中配置nnrt_host进程安全上下文,新增配置如下: +6. 在```base/security/selinux/sepolicy/ohos_policy/drivers/adapter/vendor/init.te```文件中新增配置: ```text # 新增配置 - type nnrt_host, hdfdomain, domain; + allow init nnrt_host:process { rlimitinh siginh transition }; ``` - 由于SeLinux是白名单访问的权限机制,需要根据实际权限需求配置,将服务启动起来之后,通过以下dmesg命令可能查看avc告警, - avc告警会给出缺少的权限,SeLinux的配置也可以参考[OpenHarmony SeLinux子系统的说明](https://gitee.com/openharmony/security_selinux/blob/master/README.md)。 - ```shell - hdc_std shell - dmesg | grep nnrt +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 }; ``` - 新建nnrt_host.te配置文件,将权限配置到nnrt_host.te文件中。 +8. 新建```nnrt_host.te```配置文件: ```shell # 创建nnrt文件夹 mkdir base/security/selinux/sepolicy/ohos_policy/drivers/peripheral/nnrt @@ -288,41 +332,78 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程 touch base/security/selinux/sepolicy/ohos_policy/drivers/peripheral/nnrt/vendor/nnrt_host.te ``` - 然后再将所需的权限写入nnrt_host.te文件中,比如: +9. 将所需的权限写入```nnrt_host.te```文件中: ```text 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 samgr:binder { call }; 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 }; ``` -6. 删除out目录编译整个系统。 +10. 由于SELinux是白名单访问的权限机制,需要根据实际权限需求配置。将服务启动之后,可通过以下dmesg命令查看avc告警, +avc告警会给出缺少的权限。SELinux的配置也可以参考[OpenHarmony SELinux子系统的说明](https://gitee.com/openharmony/security_selinux/blob/master/README.md)。 ```shell - # 删除out目录 - rm -rf ./out - - # 编译 - ./build.sh --product-name rk3568 –ccache --jobs=4 + hdc_std shell + dmesg | grep nnrt ``` +#### 配置部件编译入口 +以RK3568产品为例: +```shell +vim //productdefine/common/inherit/chipset_common.json +``` +在```"subsystems"```, ```"subsystem":"hdf"```, ```"components"```中添加: +```shell +{ + "component": "drivers_peripheral_nnrt", + "features": [] +} +``` + +#### 删除out目录并编译整个系统 +```shell +# 删除out目录 +rm -rf ./out + +# 编译 +./build.sh --product-name rk3568 –ccache --jobs=4 +``` + ### 调测验证 -服务开发完成后,可以使用XTS用例验证基本功能和兼容性,开发者可通过以下步骤进行验证: -1. 编译NNRt的hats用例,用例在```test/xts/hats/hdf/nnrt```目录下,编译NNRt的hats用例。 +服务开发完成后,可以使用XTS用例验证基本功能和兼容性。开发者可通过以下步骤进行验证: + +1. 编译NNRt的hats用例,用例在```test/xts/hats/ai/nnrt/hdi```目录下。 ```shell # 进入hats目录 cd test/xts/hats # 编译hats测试用例 - ./build.sh suite=hats system_size=standard --product-name rk3568 + ./build.sh suite=hats system_size=standard product_name=rk3568 # 回到代码根目录 cd - ``` - 编译好的测试用例会输出到相对代码根目录的out/rk3568/suites/hats/testcases/HatsHdfNnrtFunctionTest路径下。 + 编译好的测试用例可执行文件```HatsHdfNnrtFunctionTest```会输出到```out/rk3568/suites/hats/testcases/```下。 -2. 将测试用例push到设备上。 +2. 将测试用例push到RK3568设备的```/data/local/tmp/```目录下。 ```shell # 将测试用例可执行文件推送到设备上,HatsHdfNnrtFunctionTest是测试用例可执行文件。 hdc_std file send out/rk3568/suites/hats/testcases/HartsHdfNnrtFunctionTest /data/local/tmp/ @@ -337,7 +418,7 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程 hdc_std shell "/data/local/tmp/HatsHdfNnrtFunctionTest" ``` - 所有hats用例执行成功,可以看到测试报告通过47个用例: + 测试报告显示已通过47个用例,说明所有hats用例已执行成功,服务已通过兼容性测试。 ```text ... [----------] Global test environment tear-down @@ -347,36 +428,42 @@ NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程 ``` ### 开发实例 -完整Demo代码可以参考[社区实现](../drivers/nnrt/)。 -1. 拷贝```example/driver/nnrt```目录到```drivers/peripheral```路径下。 +完整Demo代码可以参考[社区实现](https://gitee.com/openharmony/ai_neural_network_runtime/tree/master/example/drivers)。 + +1. 进入OpenHarmony源码根目录,在```drivers/peripheral```路径下创建```nnrt```目录,拷贝NNRt源码路径```foundation/ai/neural_network_runtime```下的```example/driver/nnrt/v2_0```目录到```drivers/peripheral/nnrt```路径下。 ```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参考本教程上面的[开发步骤](#开发步骤)章节。 -3. 由于Demo依赖MindSpore-Lite CPU算子,故需要添加MindSpore-Lite依赖文件。 - - 下载MindSpore-Lite的头文件,[mindspore 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)。 - - 在```drivers/peripheral/nnrt```目录下新建mindspore目录,用于存放mindspore依赖库和头文件。 + +2. 在```drivers/peripheral/nnrt```下补充```bundle.json```文件,```bundle.json```的写法参考本教程上面[开发步骤](#开发步骤)中的[实现HDI服务](#实现hdi服务)章节。 + +3. 由于Demo依赖MindSpore Lite CPU算子,因此需要添加MindSpore Lite依赖文件: + - 下载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/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 - 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 # 创建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文件 - cp third_party/mindspore/mindspore/lite/schema/* drivers/peripheral/nnrt/hdi_cpu_service/include/mindspore_schema/ + # 从third_party目录拷贝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 # 编译mindspore动态库 ./build.sh --product-name rk3568 -ccaache --jobs 4 --build-target mindspore_lib - # 将mindspore动态库 - mkdir drivers/peripheral/nnrt/mindspore/mindspore + # 在drivers/peripheral/nnrt/v2_0/mindspore下创建mindspore目录 + mkdir drivers/peripheral/nnrt/v2_0/mindspore/mindspore - # 将mindspore动态拷贝到drivers/peripheral/nnrt/mindspore/mindspore。 - cp out/rk3568/package/phone/system/lib/libmindspore-lite.huawei.so 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/v2_0/mindspore/mindspore/ ``` - 4. 其他配置请参考本教程上面的[开发步骤](#开发步骤)章节。 \ No newline at end of file +4. 其他配置请参考本教程上面的[开发步骤](#开发步骤)章节。 \ No newline at end of file diff --git a/figures/arch_diagram.png b/figures/arch_diagram.png index ada94aec31cd5e6d713a660ea508a7221ba01f63..d0a721c2156ddb3c0df79feec763a8dfe6680c5d 100644 GIT binary patch literal 42053 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 R|9kBL;)2cjqI1_m{|%{0t$6?d diff --git a/figures/dev_flow.png b/figures/dev_flow.png index 3b12b59c932bb44aa6b8dc16fbe0668c20cc6e31..ca50b6ac1800e972a5a5f5dcb116771ac8730360 100644 GIT binary patch literal 19611 zcmeIa1yEdVx3<~PNC+B8f?G&%4elBsxVwAs;K2!+;32pNcXx*%f#B{ItQ!q34YND% z`R2%+??3PPr>1IV>Qs>;P)&F5z5Chsy6<(Z=aZ6x6y{^1#~=_0^R2Xm3h@0H1Onqf zLIM7VbT`Kdd_!}T)^-MguzKMC5c(Yo%|IXu&|3*nHIKA|Wqm8+y>*lusg?kJEhlA9 z^Ec&c-VZe27pBPB=&mFkXP_~-(C;Or~UU%ikYPSen@g!XLEGnSl_ zeVE6osL3K058RAC9GoBXQY})+Etv>^wKitEt@krR;EP3Wtl;lmQbFNIRs9pY@sgvh z)1USdbI5IaeXn9(&B01j-jz9AM%|__XJDpx#q(i zZ#4)}=(PV?`yFm7DCA)ja;(~7g4eA2G-DIwdnF%NG}A8pV7NRY_RdYwPg@}UwaTOx zxJAdVMt}{5fV;KIY<#%>^d@_{J(2Ztapg0o%PoxO%7wJ0Ly1i4AeghVgl_ovnK&Ar zF!J%~!<(CROKIUd3}@k4!ToE^#!EWZDm79SmK#6*z)zV%UEYCREKVpkYf(n8{m&3D0HM$!Xv|CoYM`r0AKsT8A`da3|ih1-vuWQN-z_=-y`9 zt?ujgq-TIicMjEeX7TF8g`QxIYy4qxG^V^9&5jqVlq(Uo6P3~qq0IZ#j?y2+aQ5ON zrpt~S!*Q|1eShXLOEU~~fAMOj{M=-pq_X8!LX%226TzaHin5=z)2>u$V6i&me$_W5 z{&3aU=?47Emr(M;L1dIAFg{S(6{WH^0aQm$hH7srvs!mlc;t!LZg@wwx0qOY{Z58( z%)0nm?%*?mz3#2YZ*H{=^F;ah~P?L3r3Xk>bk%fcVZ9_(e9 zu!LNH;u}5n>v(WL-hf&a*T;z$3A_#c+4+c7ZgBXP; z;3ekTSc7FG4F3K5YsI{wp79Vm*_)-|ahh(afFGc<-#siwsOZ3IM|`n`TzyCEA>cRe>$5psqWId66gCpu9eXgsqYtW{^)vtQ z8*@#w+IMmAH`956rpM_|LJ)h@(J zel{P?SsAY1cr88S>w9zJwKT*0ooKGt?E3s8YKA!W+@&i6Hb_s``(*i&<^9TDcMRnCQlp5(>-HCCdVwz< z#(2o5kCDyR`71`>y9U|FhHQwiVCY3T)}v$QgdR!>i&>>=ujyXSCA82f79#}Wn!`e6 z;LoVDRfJ`AS4@TTRh$WsDw*ES36Idf#(iO2Q%x@eoeT?#Zt_KFWaxyTwAC0muJ!s5 zXlse`2pjIm=AmS*;}7n?UvP@^!*o~CF!00g^~SExo17y&-yHP7#u@nL5uxMZ=YZGA z%8XL?3ZhW^j33IiRSXrgAwGi?9;q2N9Jhjye3Zn}`lKbreuZ=Dp+#jwInckzQ#@Ay z1)xcz_xl|9Mlhb4<~D}#kAIM;4|yWrJGS^s2Y$Q`+J4?Lk15rU5X7CON6w(n3+0cq zWt*$Flm`&+PXZ=kOQgRtK=`xASr&n0hVOics;0p<*aqnmW_51w8Pojzypi4QRzwYnHiqt@+qWjx^Ce|(EBl>X`#Wyvav5Q zT#9J&zJ1#ijE@^D9lfx!ZdGSU&!iiBm>@va{)u zH{twqLx_)d@#*CuU0Tf>FnXpUe}-;ri96BK4WdKo)Z^$?`{GZQ1$sh;O%znT0>6u} zun^`}YKWTkK|M0)eYO;pN&Qu!sBPd~bWl@zIv-dL*~|^gztbEEYC8l&wYHIEIYnB0 z2G&UzJq8__@TQ0`vjz}KrBp5-BNrzY4fC5RGiLaH;?Ung9K^nE?R_%udp7btMlO#s z@{*!~?~}9#5pjJRD!F7iCV0MoAgPS~lvhRD=vXH`K}GU40g0-xb84Tk#0wX^=Gu(! zTp>^Fv?o0#vyPBJ>ci*WWUtN`%#}KV&UKM2pmnjc*uwsLT%j+y3cu-1!o%yWFoTDZ|_WIRq2^J>=5^jrci!Z0%W1ObqtA zc|1thv(uZ0?Hh3UI?aJ4`HAQ({0tH$Hj7f1BrGyb`)S?D!5zDHyZUm`O9qd1#;WuC z!tRCJvMYzuPr6L0PVB|@SqLADMqBEbuRB0K_az#B-Dp;0NbfZGs$Y{R$`qq7fpvq) zD95A-n~L3(hAzHx>50)1!D0SSt~E5tY$osP`1Wn;$E)SW4(A|(lo|oZqRay2GZ%Mm z-%&!eCqF#nge;wwbX6bbF2`v<2w+I4CLYUk1T2k_e8JRV($A4idabqMF%dRy{4&k4 zTh_}_%HK{?gbn+Yr9)`Wy2IX!6Tyf;S$}ops`4k@7Uzm@1AYSW*UxOOSea<2 zL#PP9*+m%mUbfL;(1F>$4Q=f5EM}rss6UU@wBdFINRL7$-=PR>v$;{Er`8rw1Wc1sRh5Rn#LdnyxRL7}~DeP9d&BsMn zkLZSA133Y_4_7kgewudO48!_)e#Lc-=|pej31Oz9ZHX|%PG<_CFtq9 zQa@)mB#C1Q?(z?d6LXUBdpkp>~Eh_$t11 zwZ7V07Pj|nMZg)QGlD9ZYOxB%jdb35eS228(_?W^QP?+nnHqn+&xJJlj;Q(<0#-=^ zxu@AEc^VyF-D4Xg%`bxZ_ClWebsw~En{l`c89tb4C*TVllOXzIT<4)?AQ#BKxiH1t zHvt~?r7knm_l~Tg4jp(6Hf`UwwSb*5@P*IvAQ&|J+|c_HCY$Eo%xc#0a0jLHJ&QwE zzz@_}+t>AQLjkq>eLBtbzN(+x%1$6~Yz9re0IqI^<^PTHY-UJ0Ea=rfzdn{qLoWx{ zX9fJ+wv*;DzT457<4w?sDtFF7JNs4HIAUK^Oqa&g(w%sW|Wan4m5$AaGz6{g!mk>Vb`*<;VBd+ zD9!1MUQU6z;>X|IG2B&`wXjC1$X0?37bS0~-9oui&w&F&`N;NCHL;Q;L&B^;wF3jz z_al%z z4Rmb$ zYk^f|!qn`u>0mQ^CRIE#N`>~a^8UtpvGy9LO!yDsv1IvuEP)6!F=0`PRFTpRB~|vv zb4i$#xCu%m`eG_&ycgszztRPP5dwGA$QP{JV7*EosPTXmtuuayVIalh=szW8Lu-sb z1d%IYc&_V-~(?s6Q6JUOJ4Z*^2+`7{PRQ^l;X;yST;vq}O*A%%~ zVf!h+vPX^2pSw;-tbagwR9sO))<-Cy*#>@>yRunYo|Eia5~vg~^jvDUPUwR58yf|4 zuu>uW(cSKybxx0^ML{6Z&$2@b;KDD{)&e%;NAPxv-hx@+O`I@?6qx@W!cyvvp&5#+ z?(BttFJ{>bp-!0a>Ic? z_j~jAp&C(U{H3)*k#i&FTR!R}36qH0i_L7Mc6B>$yH&a^fQ=jg;eCSi!NkcVU*Hn{ z^X%+D2(BgQkGO2!uYV{&7r*d2IbvM7e&4xgqJ$3D_%vp4-CS^Lv{}KBNLddx$A3Gj z`wuVow?hE9zMuZ__`QaHq~6F9gXm`0+{YgG-(WX=C7PLL_k1_$aH&pz-wZOVco_Ws zi@3AG3|1e%r3+E4INnZX2U(ENk<3SNRze3d(78MA5&9N2;Ld%YtLYJUKGfsaY|JZc zN3FWMF)FY7HM!(Mbs(_&vft!*Iu0!!9$J_UZWPu3K{Zs}3TQMA$ZUW`@R*TDpT3&h z#t0u?-;~1c&NeR_%k;y5WZ=hdC^EJ{C|TtZRD%rESbw$Aa%8yCIvGrP3)?YNJjuz_ zb8IG(&HwX{I=cOpF&q&O3kiT>~2;)F<5ju_Z_7yg{Eabf+rPSVEQUEJdhfWwW*; z`H`H64uQC44Rl00Oggm=n>yZpY(ZDgrzm!a zrp~zNw`0VyZ;IW`L=F^Y{!iVWLp{`LV+RzA;Snmx2=8Q`^Q+E%F|w_96&eM|LERs4 z@-iM^ycm^tFE{ayE%CyFU+oi@(Nj@=3vMuQUfSX-K+(|Ni=J^1BjbKzu~OZj?PR-L}R;WK#Yhgl587zo~b0` z`FxdkdU_a?234w@go?W&r1(ZVweu7S3bRche=tR+6dEkSy0$q`%dL=q*Q1vGj9buP zof(kJ9E)_$e`TWAK2vGc97l%1b8fLUjU3j`;Fb^&h~6 zMOh|2eNh?hozxWw!Y+SdIM@ z?X+Fo7iYaMZr1y$FWQ-mBxY0S{zWR~xpTWl3det?U|DlP**cjT!X4`U>q&z(u-8F? zj|}U`{6liaRuImRaitITvp9-LA#@Zq&VUcZ(0Mi(cB(e5lE;r*IEky=&%v0uq|e9N z`Qd3bsQNT)3L~wsR4%W!I7teDRoG&0m-g&m^^t=t_~L)5j)NCx*e(`$EvJa3D8+j{ z*w3+TNYFr_3vyb7cMV0p&!{?pf}zaH7o~!VBuN4S)ED^8Crat>TzfanVkbOt7v<|Q z_~iSMwb0bCyN|d&>{lL!75rdZiO8M$E${vAV0KMus_G_6@L0RJ%!ioJoJ|7*LxG(Yb=-yxA@N^XAI?dR#wjLJG@&77;qCX@BIh!$@WFVsk##|q8_&~uu8 zYGCx04rfg0plWRMFz}n@h*ph^i6Sr?ZBm(=O6dyf6xrD8!X`9kDEh#Bbr8W32w#eJ z1K*=(jkYI_aWnm7k{l@C^OTm^+oHCMh)IRmQ~ga@8=3=ME~_JVjD4t-v>ix$^2?D$%;)A!Q*^V}kLiFF!7- zcq*EEJU|p@{rImPj^!i2&J;XZY$`>nHc?VUH#28?$EQ>%*dQLgys!l*70}#K102ln zAm10U|J2X@XNvJZ2K4_g1{9tREGc}pX~e^#eBBcAWzxLr8(`{O2b(*r&J2L;6>ELO zvuoi72(%?`k z94NCYB+2aMKWD=Ig&js?XgquY5#`C~)33O=1@!WC&c5**aAOBjUoP*g<0aBHBa9zv zaedP6O>-??4W7zD!?T+{vmD)l)xTpmH#R1MUXm!RY42v18=yCjc@J0UM$ zSfl6Gdx>c@33Q^s)acX>#d~`e@DGrDlxw!r7BYz=2)UV-$AXxFY`fg8h2uz>eXbCy zbohlJNaI=#i#{O_D4{{Li@Pe&mB1`LGNWlAl>ZKI1 zK%u8nf9;W_K%;5>sS?5d5~7rG36`pYrs<5~(Fv&!wa$DoYL43prqKjs99q@kXjjaR zXxjkP2@-e%+8(?0<$c_yPs6^6+64heh=JNuOjh7$mot_cFPz%BapRx2ZF>$~SioQg zyp8V85y^LYQ-4=Ta971cFMmi&QPmBD%~()5L#l{C35nRab*9sNb#yFU6x~p`jh5Pw zE*?eM#Y!Qek!yK~)W6OgD?84s^`;Gh@U2Jat{x)NUqJ0j;@>a$nxM`}DfF#Uzosm=m)!TU|0hF4Yw#JBnS4Etyk1(O8~J(`gdJMLPG09nYBXm>j1wBd;l*gMbJa zRkw3(jJ3Xj3*pR2H(5r_;~y+QN(f848S8ddJ4!L?AfHqy5>NEc5d_w!%I(sB1ojzK z8cj_R@wh!H5Iuv+K4nT#qJt1TQq$i*1&Xm|gYxk~uo?n?U{->|u8L}1R&@?(-?WgC zR|%?5gMH3X&fDB?xUHm0Ib0>|h^_G=j|CsCPM`?6P!05x1<%wpq1el4ynD+bXs2{Z zXeGaD+uiprR`KgXTT9C)nuCpX2*TZF!+7|p>sFe$@x`Z!^F9B)*x}s>&@6FXt;D-x zIv=*2j!Xqiy&`h_Q2&E6@V<|3XPC0H8m4lO&KUgDVZWs`HG{W5dX`z4&tSBPo_B4t z(8{f(qi90h6Bc#jA92qDOVZiZbgNg+8EvZ1T&9Z?=cDSxj3(Bx5p(zxnbcA_=A+Eq zR5wk(T?+U?%i-T8gpyhd zoXj#HPW|b|V1M1N(-~5aAh4lYhipb;^%=ST9uv9PqpeV4CrDCb}F7rd%TdsVh zJH6ERoA<_{Q=J;AV_gK_#8bnF<=T&;Sv2o7|1*1x@tkxV=9mGK_c3gX3 zpGb>R?G*l%06haRUej#kZKyzYrnK3ACffhLL+ywTuMM=9T$>5Vx*Zo;S=j_zRAIXGJ%|u4p#G@Z0n+opiH1Rf;PYKhXO|9h{oKqj9 z>Wj_ff4U#s3+mZDeGalZnuf>^K-x4nZQhYW*&VA!9#szV1VIR8m#Jw4IDF>S$R(d^ z_|L!1)e!E#-=#~_C`d1{IeS&!j8uNIjB8{^qv@j(=83@faOE1|f$65^s_>!;7E$h* z84&KO=5J@dw{du`a3(xrt{9oAiX{$rIPTwuie{F7sI%PC2Iv_fepwi#EmNebcP5+= zW1sD^)_@9wV_7?CT++}R7WHpw3%IR!gdAQ7K^=UUzFzCKoqxLFYYzWu`8igjy_!-= zD3GfY)Dm(iLp+Z}X3$r-#6Td#>dh`(0C^TfdBg7_SdU0zRDv*rBlv}+@<<``H^W{*uimMPs5Hfl>D zHy%dzRiAg*e$&gUh3bJi5n@Jjg6==Z(BsQDi1toXPLHp5B3TqmEh#$V$QGdc1!xxQJX$c8w_m#fp`Vd(nBh4CaU|D+7q1l&$;D=!Iyi5poWj}i=p+%Fed(* zRGH+QNs&7wN)6O-O6nawFAiLLzvP+><{S*SbL&89b8I}lVotB%2TH2PW%9fG{ zfcuy}-oL&8O@Yb0nUh{S`ggx{3pq~PUNwNzYoam$2J03%O-$Wji&&P(If2jiRr85MLDL83Y6k2M)U({}8@!{2m9j z9WOEMzgdi#F$s>&C{*&$!32)8n~M2S5Jeai^K9?g9oc75wRjcKu24~IOPDUnX={=# z7R=A;MiT37T+rN8wbYk;Omup6TtifKcPrPd0nv9od)CwFxs)nc68ds*R0H)bim98T z-tHf*%zv<8fm%`#7TPOtlLTwnOnwevt-16BKL64{k@OSKHV1Xx1Fs-~Fde@H3xr^& zbz2{oLhPtoaQZ<-Cuw}=ylere_FJI<x==Ag4r}y&*Cx|G`F%SIKy|KZuztsutq>T zrpAUAVQ_?=gzu(7OZ$G}h6Cu)9F`Khg8qv0Gx{Wz_0DRna1?hgq4v|oEza& zHJ^W-Iif2o%H~~u5-`#Q;#P8aI#&T(gQr(ouxFfBV#LsXHE+aVD@0z~;$g26Q6Uj} zBC%r6_gPM7iyHGt8}oq4+WWnxeSNwJZ>&F5p-wkTI#9K;f0~*Bc!{ae%0DCns3(lf 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 literal 28944 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

Cze64hl*$jsD+!`Mb0znP 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 U^TIyRVn}se&qTLU`&RV70F9UbUjP6A -- Gitee