概述
功能简介
NNRt(Neural Network Runtime,神经网络运行时)是面向AI领域的跨芯片推理计算运行时,作为中间桥梁连通上层AI推理框架和底层加速芯片,实现AI模型的跨芯片推理计算。
NNRt开放了设备接口,芯片厂商通过设备接口将专有加速芯片接入NNRt,从而实现与OpenHarmony社区生态的对接。以下内容将介绍芯片如何接入NNRt。
基本概念
在开发前,开发者需要先了解以下概念,以便更好地理解全文内容:
- HDI(Hardware Device Interface):OpenHarmony硬件设备接口,定义系统中跨进程通信的接口,实现服务间的跨进程通信。
- IDL(Interface Description Language):接口描述语言,是HDI接口的语言格式。
约束与限制
- 系统版本:OpenHarmony主干版本。
- 开发环境:Ubuntu 18.04及以上。
- 接入设备:具备AI计算能力的芯片。
运作机制
NNRt通过HDI接口实现与设备芯片的对接,由HDI接口实现跨进程通信。
图1 NNRt架构图
整个架构主要分为三层,AI应用在应用层,AI推理框架和NNRt在系统层,设备服务在芯片层。AI应用如果要使用AI专用加速芯片进行模型推理,需要经过AI推理框架和NNRt才能调用到底层AI专用加速芯片,NNRt就是负责适配底层各种AI专用加速芯片的中间层。NNRt开放了标准统一的HDI设备接口,众多AI专用加速芯片都可以通过HDI接口接入OpenHarmony。此外NNRt也开放了标准统一的接口对接上层各种AI推理框架。
程序运行时,AI应用、AI推理框架、NNRt都运行在用户进程中,底层AI芯片设备服务运行在HDI服务进程中。NNRt根据HDI接口实现了HDI Client,服务端也需要根据HDI接口实现HDI Service,两者通过OpenHarmony标准的HDF子系统实现跨进程通信。
开发指导
场景介绍
当需要将一款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 AI专用加速芯片接入NNRt流程
开发步骤
AI芯片设备HDI服务开发者具体可通过以下步骤实现AI专用加速芯片对接NNRt:
生成HDI头文件
开源社区下载OpenHarmony的代码,编译drivers_interface部件,生成HDI接口的头文件。
-
进入OpenHarmony源码根目录,编译NNRt的IDL接口文件(以RK3568产品为例):
./build.sh --product-name rk3568 –ccache --build-target drivers_interface_nnrt shell
编译完成后,会在
out/rk3568/gen/drivers/interface/nnrt/v2_0
目录下生成C++类型的HDI头文件。若需要生成C类型的头文件,请在编译之前使用如下命令对drivers/interface/nnrt/v2_0/BUILD.gn
文件中的language
配置项进行设置。language = "c"
生成头文件目录如下所示:
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 #