滴滴开源 AoE:一种快速集成 AI 的终端运行环境 SDK
滴滴开源了一个终端侧 AI 集成运行时环境(IRE)—— AoE(AI on Edge)。AoE 以 “稳定性、易用性、安全性” 为设计原则,可以帮助开发者将不同框架的深度学习算法轻松部署到终端高效执行。
滴滴之所以要做这样一个运行时框架,原因有两个:
- 一是随着人工智能技术快速发展,这两年涌现出了许多运行在终端的推理框架,在给开发者带来更多选择的同时,也增加了将 AI 布署到终端的成本;
- 二是通过推理框架直接接入 AI 的流程比较繁琐,涉及到动态库接入、资源加载、前处理、后处理、资源释放、模型升级,以及如何保障稳定性等问题。
根据介绍,当前有以下 8 种终端运行的主流推理框架:
从本质上来说,无论是什么推理框架,都必然包含初使化、前处理、执行推理、后处理、释放资源这 5 个处理过程,对这些推理过程进行抽象,是 AoE 支持各种推理框架的基础。目前 AoE 实现了对两种推理框架 NCNN 和 TensorFlow Lite 的支持。
具体来说,AoE 集成运行环境最基本的便是抽象推理操作,通过依赖倒置的设计,使得业务只依赖 AoE 的上层抽象,而不用关心具体推理框架的接入实现。这种设计带来的最大的好处是开发者随时可以添加新的推理框架,而不用修改框架实现,做到了业务开发和 AoE SDK 开发完全解耦。
在 AoE SDK 中这一个抽象是:
- InterpreterComponent:用来处理模型的初使化、执行推理和释放资源。
- Convertor:用来处理模型输入的前处理和模型输出的后处理。
InterpreterComponent 具体实现如下:
/** * 模型翻译组件 */ interface InterpreterComponent<TInput, TOutput> extends Component { /** * 初始化,推理框架加载模型资源 * * @param context 上下文,用与服务绑定 * @param modelOptions 模型配置列表 * @return 推理框架加载 */ boolean init(@NonNull Context context, @NonNull List<AoeModelOption> modelOptions); /** * 执行推理操作 * * @param input 业务输入数据 * @return 业务输出数据 */ @Nullable TOutput run(@NonNull TInput input); /** * 释放资源 */ void release(); /** * 模型是否正确加载完成 * * @return true,模型正确加载 */ boolean isReady(); }
Convertor 的具体实现如下:
interface Convertor<TInput, TOutput, TModelInput, TModelOutput> { /** * 数据预处理,将输入数据转换成模型输入数据 * * @param input 业务输入数据 * @return 模型输入数据 */ @Nullable TModelInput preProcess(@NonNull TInput input); /** * 数据后处理,将模型输出数据转换成业务输出数据 * * @param modelOutput 模型输出数据 * @return */ @Nullable TOutput postProcess(@Nullable TModelOutput modelOutput); }
AoE 还有另一个特性是具有稳定性保障。众所周知,Android 平台开发的一个重要的问题是机型适配,尤其是包含大量 Native 操作的场景,机型适配的问题尤其重要,一旦应用在某款机型上面崩溃,造成的体验损害是巨大的。
有数据表明,因为性能问题,移动 App 每天流失的活跃用户占比 5%,这些流失的用户,6 成的用户选择了沉默,不再使用应用,3 成用户改投竞品,剩下的用户会直接卸载应用。因此,对于一个用户群庞大的移动应用来说,保证任何时候 App 主流程的可用性是一件最基本、最重要的事。
结合 AI 推理过程来看,不可避免地,会有大量的操作发生在 Native 过程中,不仅仅是推理操作,还有一些前处理和资源回收的操作也比较容易出现兼容问题。为此,AoE 运行时环境 SDK 为 Android 平台上开发了独立进程的机制,让 Native 操作运行在独立进程中,同时保证了推理的稳定性(偶然性的崩溃不会影响后续的推理操作)和主进程的稳定性(主进程任何时候不会崩溃)。
具体实现过程主要有三个部分:注册独立进程、异常重新绑定进程以及跨进程通信优化。
第一个部分,注册独立进程,在 Manifest 中增加一个 RemoteService 组件,代码如下:
<application> <service android:name=".AoeProcessService" android:exported="false" android:process=":aoeProcessor" /> </application>
第二个部分,异常重新绑定独立进程,在推理时,如果发现 RemoteService 终止了,执行 “bindService()” 方法,重新启动 RemoteService。
@Override public Object run(@NonNull Object input) { if (isServiceRunning()) { ...(代码省略)//执行推理 } else { bindService();//重启独立进程 } return null; }
第三个部分,跨进程通信优化,因为独立进程,必然涉及到跨进程通信,在跨进程通信里最大的问题是耗时损失,这里,有两个因素造成了耗时损失:
- 传输耗时
- 序列化/反序列化耗时
相比较使用 binder 机制的传输耗时,序列化/反序列化占了整个通信耗时的 90%。由此可见,对序列化/反序列化的优化是跨进程通信优化的重点。对比了当下主流的序列化/反序列化工具,最终 AoE 集成运行环境使用了 kryo 库进行序列化/反序列。以下是对比结果,数据参考《各种 Java 的序列化库的性能比较测试结果》。
目前 AoE SDK 已经在滴滴银行卡 OCR 上应用使用,想更加清晰地理解 AoE 和推理框架、宿主 App 的关系,可以通过下面的业务集成示意图来了解它:
已经开源的运行时环境 SDK 包括 Android 和 iOS 平台,此外 Linux 平台运行时环境 SDK 正在紧锣密鼓地开发中,预计在 9 月底也会释出。
详情查看:
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
每日一博 | Spring 如何解决循环依赖的问题
在关于Spring的面试中,我们经常会被问到一个问题,就是Spring是如何解决循环依赖的问题的。这个问题算是关于Spring的一个高频面试题,因为如果不刻意研读,相信即使读过源码,面试者也不一定能够一下子思考出个中奥秘。本文主要针对这个问题,从源码的角度对其实现原理进行讲解。 1. 过程演示 关于Spring bean的创建,其本质上还是一个对象的创建,既然是对象,读者朋友一定要明白一点就是,一个完整的对象包含两部分:当前对象实例化和对象属性的实例化。在Spring中,对象的实例化是通过反射实现的,而对象的属性则是在对象实例化之后通过一定的方式设置的。这个过程可以按照如下方式进行理解: 理解这一个点之后,对于循环依赖的理解就已经帮助一大步了,我们这里以两个类A和B为例进行讲解,如下是A和B的声明: @Component public class A { private B b; public void setB(B b) { this.b = b; } } @Component public class B { private A a; public void setA(A a) {...
- 下一篇
华为宣布方舟编译器将于8月31日开源
注:方舟编译器已经正式发布开源 https://www.oschina.net/news/109491/arkcompiler-opensourced 昨日华为EMUI官方微信公众号发文宣布,方舟编译器开源准备就绪,将于8月31日开源。 并配文道: 方舟扬帆,开源启航 开放共赢,携手共进 8月31日 我们与你一起驶入开源的星辰大海 今年 4 月份华为发布了方舟编译器(ArkCompiler),同时宣布将在 8 月将其编译框架代码开源,开发者可以研究参考,并在11 月完整开源方舟编译器代码。 华为方舟编译器作为一款全新的安卓应用编译器可以显著提高手机的运行速度,它不采用现有安卓编译器边解释边执行的模式,而是将这种动态编译改为静态编译,可以做到全程执行机器码,进而高效运行程序,大大缩短程序响应时间。 华为官方表示方舟编译器能够将系统操作流畅度提升 24%、系统响应力提升 44%、第三方应用操作流畅度提升 60%。
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7设置SWAP分区,小内存服务器的救世主