欢迎来到天天文库
浏览记录
ID:27851224
大小:117.00 KB
页数:11页
时间:2018-12-06
《分享TensorFlow Lite应用案例.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、分享TensorFlowLite应用案例 从2016年开始,Kika技术团队一直致力于AI技术在移动端落地,尤其是在keyboard输入法引擎做了很多算法与工程上的探索工作。2017年5月,Kika技术团队基于TensorFlowMobile研发了KikaAIEngine,将其应用于Kika的全系输入法产品中。2017年11月,Google发布TensorFlowLite(TFLite)后,Kika技术团队迅速进行了跟进,并于2018年1月成功地开发了基于TFLite全新一代的KikaAIEngine,同时进行了线上产品的更新。 1、移动端深度学习的技术选型 输入法引擎的技术要求
2、包括:快、准、全。需要在客户端环境下,根据用户输入的上文内容以及当前键入的键码,实时进行『预测』。预测的内容包括:单词,词组,emoji等等一切可能通过输入法发送的内容。从算法的原理上来讲,这是一个典型的RNN应用场景。 输入法引擎预测效果图 作为输入法这样的一个重度使用的工具类APP,在移动端做轻量化部署非常重要,具体包括以下四个方面:模型压缩、快速的响应时间、较低的内存占用以及较小的so库(sharedobject,共享库)大小等。 在Kika将TFMobile部署到移动端的过程中,除了CPU占用偏高,还有由于TFMobile内存管理与内存保护设计的问题,导致: 内存保护机
3、制不完善,在实际内存不是很充足的情况(尤其对于部分低端机型以及在内存消耗较大的应用,如大型手游中弹起输入法),容易引发内存非法操作。 内存大小控制机制存在一定的问题,例如模型本身在计算时只有20MB,但加载到内存之后的运行时峰值可能会飙升40到70MB。 TFLite对于CNN类的应用支持较好,目前对于RNN的支持尚存在op支持不足的缺点。但是考虑到内存消耗和性能方面的提升,Kika仍然建议投入一部分的研发力量,在移动端考虑采用TFLite做为基于RNN深度学习模型的inference部署方案。 2.TensorFlowLite对RNN/LSTMbased模型的原生支持情况 相对于
4、CNN而言,TFLite对于RNN/LSTM的支持程度稍显不足。目前的情况是,RNN相关的基本元素的op目前都已经支持,最近也刚刚支持了LSTM,但遗憾的是beamSearch支持暂时还没有完成。 不支持的op主要集中有两大类情况: 包括控制流(controlflow)的op 相对于TFmobile,TFLite的部分op只支持最简单的case 目前的一个好的消息就是TensorFlow项目组一直在持续的推进对RNN系列的支持。 3.如何应对op缺失的情况 对于移动端用TFLite部署最友好的开发姿势是在设计模型之处就了解当前的TFLite版本哪些op是缺失或者功能不完整的,然
5、后在模型设计过程中: 尽量避免使用这些TFLite不支持的op; 对于不得不使用的情况,也需要结合具体的业务逻辑,优化设计,使得在移动端部署的二次开发的工作量尽可能的小。 以下是应对op缺失的一些常见做法。 组合 最为常见的处理方式,例如在早期的TFLite版本中,tf.tile和tf.range都不支持,这个时候建议采用broadcast_add来组合代替实现。 补充 TFmobile的op相当于完整版的TensorFlow,于此相比,TFLite缺失最严重的是包含控制流的部分。例如seq2seq模型中常用的beamsearch。 补充的方式有两种: 直接开发一个全新的
6、op; 在TFLite之外的上层api中实现(此时可能需要拆解模型)。 两种方式各有优劣,具体的需要根据功能的复杂度和业务逻辑决定。 模型拆分 1)原因 需要模型拆分的原因一般有3个: 训练时用流程控制的方式(如batch)一次性跑完多个样本,但在Inference的过程中,需要用到单步运行; 某些op不支持,需要在TFLite的上层『手动』实现,可能需要将原有的模型拆分为若干的子模型(subgraph); 有部分的冗余,但是重新设计graph再训练的时间代价较大。 2)方法与坑 以下通过一个实例来描述如何进行模型的拆分。 将variable共享给不同的op,甚至于不
7、同的subgraph,通用做法是采用`placeholder`的方式将输入输出分开,然后在导出freezegraph的时候用`tf.graph_util.convert_variables_to_constants`只抓取需要的部分。 代码实例: python vars=tf.get_variable(。..) inputs=tf.placeholder(‘inputids’,shape=[BATCH,None]
此文档下载收益归作者所有