前言

越来越多的业务会用到AI相关的技术,大多数的AI模型是部署在云端使用的,毕竟服务端计算更快,管理也更容易。随着终端设备性能提升,在终端使用 AI 模型有了更大的价值,可以更好满足业务对响应实时性、数据隐私性的需求。滴滴出行的银行卡识别功能也打算部署在客户端,但是遇到的问题也不少:

1.模型升级困难,模型在终端的存在一般都是已应用软件为载体,用户可以选择是否对应用软件进行更新,导致模型版本会产生分化。

2.硬件适配问题,不同的终端设备因为厂商深度定制因素,会出现一些兼容问题

3.不同模型运行框架不同,对于客户端工程师不够友好。

针对这些问题滴滴的终端智能团队推出了AoE作为解决方案,设计之初就将多模型管理支持可能升级、多框架支持、模型加密等功能定为基础设施。

AoE是怎么做好模型管理的

我们针对遇到的问题,主要做了3部分工作:

  1. 尝试了多机型覆盖测试做好模型的验证
  2. 利用运行环境配制化来实现加载模型
  3. 通过动态更新来升级模型

下面针对这三项分别进行介绍。

运行环境配置化

AoE SDK将推理框架总结了5个过程,它们分别是初使化、前处理、执行推理、后处理、释放资源。对 AoE 集成运行环境来说,最基本的便是抽象推理操作,通过 依赖倒置 的设计,使得业务只依赖AoE的上层抽象,而不用关心具体推理框架的接入实现。这种设计带来的最大的好处是开发者随时可以添加新的推理框架,而不用修改框架实现,做到了业务开发和 AoE SDK 开发完全解耦。

用户只需要简单的描述json文件即可完成对运行环境的配置,简化了用户的使用过程,更为简洁高效。

简单的配置如下:

{
"version": "1.0.0", // 版本号
"tag": "tag_mnist", // 区分业务场景
"runtime": "tensorflow", // runtime类型
"source": "installed", // 安装源
"modelDir": "mnist", // 所在文件夹
"modelName": "mnist_cnn_keras", // 模型文件名
"updateURL": "https://www.didiglobal.com" // 升级配置链接
}

机型覆盖测试

针对硬件差异的问题,我们在做模型验证期间尝试了多机型的覆盖测试,将模型在不同机型上的表现都记录下来反馈给模型生产团队,帮助模型不断的升级修复。

截取了部分测试时产生的耗时对比数据大致如下:

虽然模型不相同,使用指令可能不同,但是大致也可以了解到机器的性能,具体数值仅供参考。在这个过程中,沉淀下来了benchmark工具来帮助验证多机型的覆盖测试,将来这个工具也会是开源的一部分来帮助大家验证模型的可用性,以及建立有效的机型比较。

动态更新

AoE的模型管理模块将模型按分发方式分为两种:

  1. 本地模型,意为应用软件自带的模型
  2. 远程模型,则是通过策略配置,从服务器下载匹配模型到本地的模型

本地模型与远程模型最大的区别就是本地模型无法更改,只能跟随应用软件一起更新,而远程模型则是通过和本地模型作比较后更新的较新模型,模型与模型之间通过版本做比较。本地模型与远程模型二者可以共存,也可以单独存在,在最新版的滴滴出行中,为了减少包的大小甚至没有本地模型,所有的模型都是来自远端下载。

之所以将模型分成两部种,是为了保证模型是可用的且可靠的,为什么这么说?一般本地模型都是经过长时间测试后才作为稳定版本跟随APP带到了线上,既可以作为最新版本,又可以作为后来的稳定版本:即使发现后来下载升级的远程模型效果不理想也可以通过灰度测试停止远程使用远程模型的使用,保证模型的高可用性。

远程模型的存在使业务模型拥有了动态更新的能力,方便了产品的迭代,不再依赖客户端的发布周期。在动态开关的写协助下,甚至可以做到精确指定模型版本的加载。

整体模型管理的结构如下图:

模型加载怎么使用?

模型管理器是AoE的一个基础组件,以iOS为例,组件实现在Loader目录下。默认支持的模型配置文件为json格式,运行环境配置化部分的代码就描述了mnist demo的配置。

模型和模型配置文件名的格式配置以及远程版本存放地址,都可以通过继承AoEModelConfig类来做修改,具体的使用方式可以参照squeezenet的实例

在已经开源的版本中AoE还为大家提供了单功能多模型的支持,拿银行卡识别来举例,整个过程分两步,一是找到卡片以及卡片上的数字区域,二是根据数字区域的图片识别出卡号,所以整个过程需要两个模型。开源项目使用的模型配置的tag字段主要用来定义模型所属功能,结合dir字段,就可以定位到具体的模型。

欢迎关注:https://github.com/didi/AoE

AoE (AI on Edge,终端智能,边缘计算) 是一个终端侧AI集成运行时环境 (IRE),帮助开发者提升效率。

欢迎添加小助手微信进入AOE开源交流群!

有了AOE,妈妈再也不用担心我的模型管理!的更多相关文章

  1. 妈妈再也不用担心别人问我是否真正用过redis了

    1. Memcache与Redis的区别 1.1. 存储方式不同 1.2. 数据支持类型 1.3. 使用底层模型不同 2. Redis支持的数据类型 3. Redis的回收策略 4. Redis小命令 ...

  2. 有了 tldr,妈妈再也不用担心我记不住命令了

    引言 有一次我在培训时说「程序员要善于使用 Terminal 以提高开发效率」,一位程序员反驳道:「这是 21 世纪,我们为什么要用落后的命令行,而不是先进的 GUI?」 是的,在一些人眼里,这个黑黑 ...

  3. 妈妈再也不用担心我使用git了

    妈妈再也不用担心我使用git了 Dec 29, 2014 git git由于其灵活,速度快,离线工作等特点而倍受青睐,下面一步步来总结下git的基本命令和常用操作. 安装msysgit 下载地址:ms ...

  4. 利用CH341A编程器刷新BIOS,恢复BIOS,妈妈再也不用担心BIOS刷坏了

    前几天,修电脑主析就捣鼓刷BIOS,结果刷完黑屏开不了机,立刻意识到完了,BIOS刷错了.就从网上查资料,各种方法试了个遍,什么用处都没有.终于功夫不负有心人,找到了编码器,知道了怎么用.下面看看具体 ...

  5. python爬虫07 | 有了 BeautifulSoup ,妈妈再也不用担心我的正则表达式了

    我们上次做了 你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍 有些朋友觉得 利用正则表达式去提取信息 太特么麻烦了 有没有什么别的方式 更方便过滤我们想要的内容啊 emmmm 你还别说 还 ...

  6. 锋利的js之妈妈再也不用担心我找错钱了

    用js实现收银功能. <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <hea ...

  7. 有了jsRender,妈妈再也不用担心我用jq拼接DOM拼接的一团糟了、页面整齐了、其他伙伴读代码也不那么费劲了

    写在前面 说来也很巧, 下午再做一个页面,再普通不过的分页列表,我还是像往常一样,基于MVC环境下,我正常用PagedList.MVC AJAX做无刷新分页,这时候问题就来了,列表数据中有个轮播图用到 ...

  8. 【C#】妈妈再也不用担心自定义控件如何给特殊类型的属性添加默认值了,附自定义GroupBox一枚

    ------------------更新:201411190903------------------ 经过思考和实践,发现套路中的第1条是不必要的,就是完全可以不用定义一个名为Default+属性名 ...

  9. 妈妈再也不用担心我的移动端了:网易和淘宝的rem方案剖析

    从博主学习前端一路过来的经历了解到,前端移动开发是大部分从PC端转战移动端的小伙伴都非常头疼的一个问题,这边博主就根据一篇自己看过的移动开发文章来剖析一下网易和淘宝的rem解决方案,希望能够帮助到一些 ...

随机推荐

  1. 谈一谈个人利用Java的mysql的知识完成的数据库的项目-----用户信息管理系统

    首先,我先简述一下自己做的过程啊,相信大家来找这样的博客,也都是为了完成自己课程任务吧.我也一样是一名大一的学生,是为了自己的课程任务而开始做数据库的项目的.因为还没学mysql吗,所以是自己找视频啊 ...

  2. 区块链学习笔记:DAY01 区块链的技术原理

    其实很早之前就听过区块链,也看过有关区块链的介绍,那个时候的理解主要还是一句话:分布式记账 然后开始关注比特币,听了有几年了,对于其来历.用途其实一直都是一知半解. 这次的课算是第一次以一个学员的身份 ...

  3. CocoaPods 详解之----更新篇

    CocoaPods 大概是 2011 年出现的开源组件管理工具(目前已支持 Objective-C 和 Swift),近年来普及率越来越高,几乎已是所有 Cocoa 开源项目的标配.另外,很多大点的团 ...

  4. echarts 堆叠柱状图 + 渐变柱状图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. [TimLinux] Linux shell获取进程pid

    调用脚本时,获取进程PID: (/this/is/a/script/file.sh > /out/to/log.txt & echo $!) & 脚本内部,获取进程PID: ec ...

  6. yuv和yCbCr的差异

    一.和rgb之间换算公式的差异 yuv<-->rgb Y'= 0.299*R' + 0.587*G' + 0.114*B' U'= -0.147*R' - 0.289*G' + 0.436 ...

  7. Shell排序 C&&C++

    Shell排序   Shell排序是大量数据需要排序时,更为高效的插入排序.它的算法思想基于插入排序的算法思想 流程: (1)将n个元素数组分成n/2个数字序列,第一个数据和第n/2个数据为一对,等等 ...

  8. 一篇文章搞清楚HashMap和TreeMap的内部结构

    一.HashMap 1.基于哈希表的 Map 接口的实现. 此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 Has ...

  9. lede install unifi controller

    requirement: sdb3 should be formated as ext4, DO not use f2fs/NTFS/exFAT. debootstrap --arch=amd64 s ...

  10. CCPC Wannafly Winter Camp Div2 部分题解

    Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...