50

TensorFlow 在移动设备与嵌入式设备上的轻量级跨平台解决方案

 5 years ago
source link: https://mp.weixin.qq.com/s/8v8zK492SxuJdWlt5qq5Zg?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Google 开发者大会 (Google Developer Days,简称 GDD) 是展示 Google 最新开发者产品和平台的全球盛会,旨在帮助你快速开发优质应用,发展和留住活跃用户群,充分利用各种工具获得更多收益。2018 Google 开发者大会于 9 月 20 日和 21 日于上海举办。点击 阅读原文 进入 Google 开发者大会 2018 掘金专题。

2018 年 9 月 21 日 ,凌钰城(Google Brain 软件工程师)带来一场《TensorFlow Lite:TensorFlow在移动设备与嵌入式设备上的轻量级跨平台解决方案》的演讲,本文将对演讲做一个回顾。

在终端 / 设备上运行机器学习日益重要

今天,机器学习的发展日新月异,机器学习不仅部署在服务器端,运行在个人电脑上,也存在于我们生活中许许多多的小设备上,比如移动设备和智能手机。智能手机上的OK Google可以通过语音设定一个闹钟,这是一个关键字检测和语音识别的机器学习综合应用。再比如Google的照片app,可以通过机器学习来制作背景虚化、人像清晰的照片,这些在移动设备、智能手机上的机器学习应用很有用、很有趣。

在移动设备上实现机器学习,可以有两种实现方法。一种是在设备上收集数据,传递给云端,服务器执行机器学习任务,最后把结果回传给设备。另一种方法是在终端设备上运行所有功能,包含机器学习模型。

在终端上运行机器学习有许多优点:

  • 没有网络延迟

  • 无需连接网络

  • 数据留在终端

    • 无需花费带宽去上传数据

    • 某些情况下比较省电

  • 可直接存取终端上的传感器

但是,在终端上运行应用也相当困难,主要存在以下几点限制:

  1. 移动终端上有更小的内存

  2. 对省电有要求

  3. 更弱的计算能力

对机器学习来说更是困难,我们为服务器开发的机器学习模型通常比较大,需要较大的内存,模型复杂,需要更多的耗电量和计算能力。

什么是TensorFlow Lite

TensorFlow Lite是TensorFlow在移动设备上运行机器学习的跨平台解决方案,具有低延迟、运行时库 (runtime library) 极小等特性,此外还有一系列的工具去转换、调试和优化模型。

采用TensorFlow Lite开发的应用优点之一是反应速度非常快,比如开发照片处理app,不需要将照片传输到云端,可以直接在终端上处理。优点之二是可以离线使用,这在网络条件比较差的地区尤为重要。

Tensorflow Lite具有高度可移植性,已经在如下平台成功移植:

  • Android、iOS

  • Raspberry PI、及其它Linux SoCs

  • 微处理器(包括没有操作系统,没有POSIX环境的系统)

  • 也能在PC、Mac运行,调试方便

使用TensorFlow Lite的流程

2UNvArn.jpg!web

TensorFlow Lite的优化

相较于TensorFlow,TensorFlow Lite进行了如下优化:

  • 压缩模型:缩小模型体积

  • 量化 (Quantization):TensorFlow模型中包含大量的矩阵,矩阵数值通常采用32bit的float数据类型,量化就是将这些32bit的浮点数采用8bit的byte表示。

  • CPU ops融合:比如特别为ARM Neon指令集优化

  • 优化的SIMD运算核心

eQFZZny.jpg!web

此外TensorFlow Lite还紧密整合硬件加速器,支持如下几类硬件加速器:

  • GPUs

  • Edge-TPUs

  • NNAPI支持的硬件加速器

QJNf6re.jpg!web

对GPUs的支持状况:

  • Android上:基于OpenGL的GPU加速

  • 预定2018年第四季度发布binary

  • 可加速MobileNet以及其它图像模型

关于Google打造的Edge TPUs:

NfeiayI.jpg!web

TensorFlow Lite可以通过参数决定runtime library大小。基本的interpreter 80K,所有内建Ops kernel 750KB,相当小。考虑到不同模型可能用到不同的ops,还可以继续优化,比如可以只注册你需要的Ops,这样其余的Ops就不会编译到runtime library中,体积还可以进一步缩减。

开发者的反馈

TensorFlow Lite得到了众多开发者的使用,得到了很多正面的反馈:

  • 跨平台部署

  • 更快的推断 (inference) 速度

  • 更小的runtime library

  • 硬件加速

也收集到了一些改进意见:

  • TensorFlow Lite更易于使用

  • 增加支持的Ops数量

  • 增强模型优化工具

  • 更多的文档、范例源码…

后面会进一步说明TensorFlow Lite团队对这些问题的改进。

谁使用了TensorFlow Lite

7jMvu2Y.jpg!web

以及…

ZzeAR3Z.jpg!web

如何使用TensorFlow Lite

TensorFlow Lite非常易于上手,建议采用如下步骤:

zQZNRb6.jpg!web

使用Demo App

  • 下载:从https://www.tensorflow.org/mobile/tflite下载一个demo app(iOS/Android)

  • 编译:在您的机器上简单的编译demo apps

  • 运行:运行demo app,并试着修改看看

预训练 (Pretrained) & 再训练 (Retrained) 模型

预训练模型:Tensorflow网站上提供了各种不同预训练的机器学习模型,比如图像分类、物体检测、图像分割、文字预测、等等。

再训练模型:请尝试迁移学习Colab教程 - Tensorflow for Poets。顾名思义,这个教程设计初衷是尽量简单,让没有技术背景的人也能运行。所谓迁移学习,是重新训练已经存在模型的一小部分,应用到一个新的问题上。

开发自己的模型

36Fb6rv.jpg!web

  1. 构建 & 训练模型

    使用TensorFlow(Estimator或Keras),构建模型,训练,取得Saved Model。

  2. 转换格式

    使用TensorFlow Lite转换器转换为TensorFlow Lite可用的模型,模型转换代码如下:

import tensorflow.contrib.lite as lite

graph_def_file = "/path/to/Downloads/mobilenet_v1_1.0_224/frozen_graph.pb"
input_arrays = ["input"]
output_arrays = ["MobilenetV1/Predictions/Softmax"]

converter = lite.TocoConverter.from_frozen_graph(
            graph_def_file, input_arrays, output_arrays)
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

验证

借助模型可视化工具:

ZFnYZvR.jpg!web

由于TensorFlow Lite支持的Ops有限,可能存在模型转换后,某些Ops不支持,针对这一问题,TensorFlow Lite团队计划支持更多的Ops

  • 目前已经有75个内建Ops

  • Coming soon: Tensorflow Lite Compat模式

  • 计划第四季度发布

  • 增加数百个支持的Ops

验证模型、分析性能:

  • 转换后的模型是否正确

  • 模型的推断速度多快

  • Runtime library多大

更多详细资料,请参考:https://www.tensorflow.org/mobile/tflite/performance/

部署

JbiYBnV.jpg!web

python API示例:

interpreter = tf.contrib.lite.Interpreter(
    "/tmp/awesome_model.tflite")
input = interpreter.get_input_details()[0]["index"]
interpreter.set_tensor(input, np.array([1, 2, 3]))
interpreter.invoke()
prediction = interpreter.get_tensor(output)

Java API示例:

import org.tensorflow.lite.Interpreter;
try {
    Interpreter tflite = new Interpreter(
        "/tmp/awesome_model.tflite");
    // Fill the inputs and output buffers
    // ...
    // Invoke the interpreter
    tflite.run(inputs, outputs);
}

补充:模型优化

在实际项目中,通常还会进行模型优化,这样在前面的流程中加入模型优化,演变为如下流程:

bYn26zz.jpg!web

TensorFlow Lite提供一系列的工具帮助开发者优化模型:

  • 训练后Quantization

这是最新发布的模型优化工具,其优点是使用简单,只需在前面的converter代码加入一行:

converter.post_training_quantization = True

Y3iQZzV.jpg!web

量化会造成模型精确度的损失,但据观察,对图像、音频模型预测精确度影响很小。经过量化,CNN模型可增加10~50%的性能提升,RNN可以增加到3倍性能提升。

  • 训练时Quantization

一年前发布的工具,理论上可以比训练后Quantization更好的精确度,但使用上比较复杂,只在CNN模型中比较有效果,对于RNN模型,效果有限。

uq2Ijua.jpg!web

团队同时在研究两者,希望两者都有所提升。

Demo

JBRJFfe.jpg!web

一个Raspberry PI实现的物件检测模型,可以进行目标检测,转动摄影机始终跟随目标

URVjQzR.jpg!web

一个采用Google Edge TPU的系统,展现TensorFlow Lite的实时处理能力

iymINry.jpg!web

采用ARM微处理的装置,展现TensorFlow Lite在极低硬件配置上的表现

jqMNrib.jpg!web

展现TensorFlow Lite的实时视频处理能力

展望未来

3E3AjeF.jpg!web

Compat是Compatibility (兼容) 的简写,所谓兼容模式,就是TensorFlow Lite在遇到不支持的Ops时,会提示是否启用Compat模式,这样支持的Ops (600+) 更多,但也意味着runtime library会增加,开发者需要在功能和体积之间做权衡。

另外,TensorFlow Lite搬家了,从原来的tensorflow/contrib/lite/…提升到tensorflow/lite/…,这意味着TensorFlow Lite开始作为一个正式的project,得到官方支持。

6Rf2eiI.jpg!web

以上就是本次演讲的全部内容,希望对大家有所帮助。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK