“All in Cloud”之后,和你聊聊「云原生DevOps的Kubernetes技巧」 了解详情
写点什么

滴滴开源 AoE!帮你在终端快速集成 AI 框架

  • 2019 年 8 月 21 日
  • 本文字数:3458 字

    阅读完需:约 11 分钟

滴滴开源AoE!帮你在终端快速集成AI框架

随着人工智能技术快速发展,这两年涌现出了许多运行在终端的推理框架,在给开发者带来更多选择的同时,也增加了将 AI 布署到终端的成本。滴滴开源的 AoE (AI on Edge) 将解决这一痛点,帮助开发者将不同框架的深度学习算法轻松部署到终端高效执行。


背景

AoE 是什么

AoE (AI on Edge) 是一个滴滴开源的终端侧 AI 集成运行时环境(IRE)。以 “稳定性、易用性、安全性” 为设计原则,帮助开发者将不同框架的深度学习算法轻松部署到终端高效执行,Github 地址是:https://github.com/didi/aoe


为什么要做一个 AI 终端集成运行时框架,原因有两个:



  • 一是随着人工智能技术快速发展,这两年涌现出了许多运行在终端的推理框架,在给开发者带来更多选择的同时,也增加了将 AI 布署到终端的成本;



  • 二是通过推理框架直接接入 AI 的流程比较繁琐,涉及到动态库接入、资源加载、前处理、后处理、资源释放、模型升级,以及如何保障稳定性等问题。



目前 AoE SDK 已经在滴滴银行卡 OCR 上应用,想更加清晰地理解 AoE 和推理框架、宿主 App 的关系,可以通过下面的业务集成示意图来了解它。



终端推理框架一览

下面是终端运行的 8 种主流推理框架(排名不分先后)。



AoE 如何支持各种推理框架

从本质上来说,无论是什么推理框架,都必然包含下面 5 个处理过程,对这些推理过程进行抽象,是 AoE 支持各种推理框架的基础。


目前,AoE 实现了两种推理框架 NCNN 和 TensorFlow Lite 的支持,以这两种推理框架为例,说明一下 5 个推理过程在各自推理框架里的形式。



AoE 支持哪些平台

目前,AoE 已经开源的运行时环境 SDK 包括 Android 和 iOS 平台,此外 Linux 平台运行时环境 SDK 正在紧锣密鼓地开发中,预计在 9 月底也会和大家正式见面。


工作原理

抽象推理框架的处理过程

前面已经介绍了,不同推理框架包含着共性的过程,它们分别是初使化、前处理、执行推理、后处理、释放资源。对 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);}
复制代码


稳定性保障

众所周知,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。


@Overridepublic Object run(@NonNull Object input) {    if (isServiceRunning()) {        ...(代码省略)//执行推理    } else {        bindService();//重启独立进程    }    return null;}
复制代码


第三个部分,跨进程通信优化,因为独立进程,必然涉及到跨进程通信,在跨进程通信里最大的问题是耗时损失,这里,有两个因素造成了耗时损失:


  • 传输耗时

  • 序列化/反序列化耗时


相比较使用 binder 机制的传输耗时,序列化/反序列化占了整个通信耗时的 90%。由此可见,对序列化/反序列化的优化是跨进程通信优化的重点。


对比了当下主流的序列化/反序列化工具,最终 AoE 集成运行环境使用了 kryo 库进行序列化/反序列。以下是对比结果,数据参考 oschina 的文章《各种 Java 的序列化库的性能比较测试结果》。


MNIST 集成示例

对 TensorFlowLiteInterpreter 的继承

当我们要接入一个新的模型时,首先要确定的是这个模型运行在哪一个推理框架上,然后继承这个推理框架的 InterpreterComponent 实现,完成具体的业务流程。MNIST 是运行在 TF Lite 框架上的模型,因此,我们实现 AoE 的 TF Lite 的 Interpreter 抽象类,将输入数据转成模型的输入,再从模型的输出读取业务需要的数据。初始化、推理执行和资源回收沿用 TensorFlowLiteInterpreter 的默认实现。


public class MnistInterpreter extends TensorFlowLiteInterpreter<float[], Integer, float[], float[][]> {     @Nullable    @Override    public float[] preProcess(@NonNull float[] input) {        return input;    }     @Nullable    @Override    public Integer postProcess(@Nullable float[][] modelOutput) {        if (modelOutput != null && modelOutput.length == 1) {            for (int i = 0; i < modelOutput[0].length; i++) {                if (Float.compare(modelOutput[0][i], 1f) == 0) {                    return i;                }            }        }        return null;    }}
复制代码


运行时环境配置

接入 MNIST 的第二个步骤是配置推理框架类型和模型相关参数,代码如下:


mClient = new AoeClient(requireContext(), "mnist",        new AoeClient.Options()                .setInterpreter(MnistInterpreter.class)/*                .useRemoteService(false)*/,        "mnist");
复制代码


推理执行

以下是 MINST 初始化推理框架、推理执行和资源回收的实现:


//初始化推理框架int resultCode = mClient.init();//推理执行Object result = mClient.process(mSketchModel.getPixelData());if (result instanceof Integer) {    int num = (int) result;    Log.d(TAG, "num: " + num);    mResultTextView.setText((num == -1) ? "Not recognized." : String.valueOf(num));}//资源回收if (mClient != null) {    mClient.release();}
复制代码


写在最后

帮助 AI 在终端落地,开源 AoE 集成运行环境是我们走出的第一步!未来,为终端的开发者提供更多推理框架的支持,提供更多有价值的特性,是我们不懈追求的目标。如果您对这个项目感兴趣,如果您在终端 AI 运行环境方面有想法,如果您在使用时有疑问,诚挚邀请您加入我们。QQ 群号:815254379


2019 年 8 月 21 日 08:113197

评论

发布
暂无评论
发现更多内容

【架构实战营】第 7 模块作业

swordman

架构实战营

前端性能优化实践 | 百度APP个人主页优化

百度开发者中心

大前端 百度app

越学越有趣:『手把手带你学NLP』系列项目07 ——机器翻译的那些事儿

百度大脑

机器学习 nlp

Mobileye智慧出行再加码,中国市场生态建设取得新进展

新闻科技资讯

Redis学习之Redis概述及原理、基本操作及持久化

Linux服务器开发

redis 分布式 后端 中间件 Linux服务器开发

爆款阿里P5到P7晋升之路,九大源码文档助我超神果然努力幸运并存

Java BAT

TDengine JDBC整合Druid

山石道人

涛思数据 tdengine Druid Spring MVC taos-jdbc

教你给场景添加天空盒,超简单!

森友小锘

大数据 大前端 开发 可视化 数字孪生

北鲲云超算平台——让科技更好地服务于用户

北鲲云

再获权威认可!DataPipeline实时数据融合平台通过信通院大数据产品能力评测

DataPipeline数见科技

大数据 数据融合 数据管理

半年摸爬滚打,我是如何从小白进阶渗透测试工程师

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞分析

“用友 • 华为云杯”第三届企业云服务开发者大赛

ToB行业头条

开发者 低代码 用友

Hightopo可视化入局“智慧工厂”,助力企业改革创新

一只数据鲸鱼

数据可视化 绿色工业 3D数据可视化 高炉炼铁 智慧工业

图的应用——拓扑排序

若尘

数据结构 拓扑排序

阿里P8手抄本惨遭泄露,并出现病毒式传播,致28人斩获大厂offer

Java架构师迁哥

GNURadio报错Unable to create context(windows10环境)

allu

问题总结

一周信创舆情观察(6.28~7.4)

统小信uos

DataPipeline实时数据融合平台V3.0里程碑版发布!澎湃新动能

DataPipeline数见科技

大数据 数据融合 数据管理

用好“实时数据管理”助推器,旭辉集团加快数字化转型步伐

DataPipeline数见科技

大数据 数据融合 数据管理

云南智慧公安研判分析系统搭建,重点人员研判分析平台

MindSpore教程免费学,还有入门奖品

Geek_6cdeb6

人工智能 机器学习 深度学习 自我提升 羊毛

构筑智能制造时代“四重护城河”,联想中国开创产业新格局

科技大数据

智邦国际ERP系统31.99版本发布,解锁精准高效协同管理模式!

叶落便知秋

32岁的我裸辞了,八年Java老鸟,只因薪水被应届生倒挂,在闭关三个月后拿到阿里Offer,定级P7!

Java架构师迁哥

一图读懂DataPipeline实时数据融合平台V3.0

DataPipeline数见科技

大数据 数据融合 数据管理

“京东商城”亿级高并发秒杀系统到底是怎么设计的?自己做该如何下手?

Java架构师迁哥

我是如何从设计师转到软件行业的? | 可怜巴巴的程序猿

Python研究所

随笔 话题讨论

免费分享JDBC与MyBatis的优秀图书

Java入门到架构

Java

2021年,BAT接连入局!“低代码”为何能备受资本追捧?

优秀

低代码

2021百度云智峰会|DataPipeline携手百度赋能实时数据资产构建与应用

DataPipeline数见科技

大数据 数据融合 数据管理

Android开发中如何封装camera底层接口

Changing Lin

7月日更

西门子低代码:探讨应用程序开发的下一步演进方向

西门子低代码:探讨应用程序开发的下一步演进方向

滴滴开源AoE!帮你在终端快速集成AI框架_语言 & 开发_邹月富_InfoQ精选文章