一、概述
1、功能简介
AI 业务子系统是 OpenHarmony 提供原生的分布式 AI 能力的子系统。AI 业务子系统提供了统一的 AI 引擎框架,实现算法能力快速插件化集成。
AI 引擎框架主要包含插件管理、模块管理和通信管理模块,完成对 AI 算法能力的生命周期管理和按需部署。插件管理主要实现插件的生命周期管理及插件的按需部署,快速集成 AI 能力插件;模块管理主要实现任务的调度及管理客户端的实例;通信管理主要实现客户端和服务端之间的跨进程通信管理及 AI 服务与插件之间的数据传输。后续,会逐步定义统一的 AI 能力接口,便于 AI 能力的分布式调用。同时,框架提供适配不同推理框架层级的统一推理接口。
AI 引擎框架结构如下图所示。
图 1 AI 引擎框架
2、搭建环境
-
准备开发板:Hi3516DV300 或 Hi3518EV300
-
下载源码
二、技术规范
1、代码管理规范
AI 引擎框架包含 client、server 和 common 三个主要模块,其中 client 提供 server 端连接管理功能,OpenHarmony SDK 在算法对外接口中需封装调用 client 提供的公共接口;server 提供插件加载以及任务管理等功能,各 Plugin 实现由 server 提供的插件接口,完成插件接入;common 提供与平台相关的操作方法、引擎协议以及相关工具类,供其他各模块调用。AI 引擎框架各模块之间的代码依赖关系如下图所示:
图 2 AI 引擎代码依赖关系
建议:插件与 OpenHarmony SDK 在 AI 引擎指定的路径下进行代码开发
在 AI 引擎框架的整体规划中,OpenHarmony SDK 属于 client 端的一部分,插件由 server 端调用,属于 server 端的一部分,因此 AI 引擎框架为接入的插件与 OpenHarmony SDK 规划的路径:
SDK 代码路径://foundation/ai/engine/services/client/algorithm_sdk
示例 1://foundation/ai/engine/services/client/algorithm_sdk/cv
示例 2://foundation/ai/engine/services/client/algorithm_sdk/nlu
插件代码路径://foundation/ai/engine/services/server/plugin
示例 1://foundation/ai/engine/services/server/plugin/cv
示例 2://foundation/ai/engine/services/server/plugin/nlu
规则:插件提供的全部对外接口,统一存放在 AI 业务子系统 interfaces/kits 目录
OpenHarmony SDK 对外接口是 AI 业务子系统提供能力的对外暴露方式,按照 OpenHarmony 的接口管理要求,需统一存放在各子系统的 interfaces/kits 目录中。当前 AI 业务子系统插件对外接口路径为//foundation/ai/engine/interfaces/kits,不同插件可在该路径下添加目录,比如增加 cv 插件,则在路径//foundation/ai/engine/interfaces/kits/cv 下面存放接口文件。
规则:插件编译输出路径必须是在/usr/lib
server 端加载插件是采用 dlopen 方式,只支持在/usr/lib 路径进行,因此插件在编译 so 时,需要在编译配置文件中指定输出路径为/usr/lib。
2、命名规范
SDK 命名规则:领域_关键词<其他信息 1_其他信息 2…>_sdk.so
关于领域,建议使用当前主流简称,比如图片视频相关的使用"cv",语音识别相关的使用“asr”,翻译相关的使用“translation”等,存在其他领域的可增加定义;关键词则需要恰当准确的描述所对应插件的算法能力,比如唤醒词识别,则使用 keyword_spotting;对于其他信息,比如插件支持的芯片类型、国内海外等信息,可在关键词与“sdk”之间依次添加,信息之间以下划线连接;SDK 命名,必须以“_sdk”结尾。
例如:唤醒词识别插件对应的 SDK,只支持麒麟 9000 芯片,适用于中国国内地区适用,则对应的 SDK 命名为:asr_keyword_spotting_kirin9000_china_sdk.so
插件命名规则:领域_关键词<其他信息 1_其他信息 2…>.so
插件与 SDK 存在一一对应的关系,故插件命名的领域、关键词、其他信息等名词解释与要求,均与 SDK 命名要求保持一致。两者唯一的不同之处在于 SDK 命名多了个“_sdk”结尾;比如插件命名为“asr_keyword_spotting.so”,则对应 SDK 命名为“asr_keyword_spotting_sdk.so”。
例如:唤醒词识别插件对应的 SDK,只支持麒麟 9000 芯片,适用于中国国内地区适用,则对应的插件命名为:asr_keyword_spotting_kirin9000_china.so
3、 接口开发规范
规则:SDK 需按算法调用顺序,封装 client 对外提供接口;对于异步插件对应的 SDK,需要实现 client 提供的回调接口 IClientCb
AI 引擎的 client 端对外提供的接口包括 AieClientInit、AieClientPrepare、AieClientSyncProcess、AieClientAsyncProcess、AieClientRelease、AieClientDestroy、AieClientSetOption、AieClientGetOption,SDK 需要根据插件的接口按照顺序至少封装 AieClientInit、AieClientPrepare、AieClientSyncProcess/AieClientAsyncProcess、AieClientRelease、AieClientDestroy 五个接口,否则会出现调用问题或者内存泄漏。比如封装过程遗漏了 AieClientPrepare 接口,则 server 端无法完成插件加载,故后面的接口都无法调用成功。
对于异步插件,SDK 需要实现 IClientCb 接口,用于接收来自 client 端的算法推理结果