TensorFlow Lite 助力产品落地
文 / 开发技术推广工程师 Khanh LeViet
TensorFlow Lite (tensorflow.google.cn/lite) 是在边缘设备上运行 TensorFlow 模型推理的正式框架。TensorFlow Lite 部署在全球超过 40 亿台边缘设备上,且支持基于 Android、iOS 和 Linux 的物联网设备及微控制器。
自 2017 年底 TensorFlow Lite 首次发布以来,我们一直在探索与改进,在保证可靠性的同时让更多开发者(无论机器学习领域的专家或初学者)都能参与进来,轻松上手与使用。
本文中,我们将重点介绍最近发布的产品,助力您的设备端用例从原型设计到生产部署过渡得更流畅。
如需相关视频,请观看 TensorFlow DevSummit 2020 发布的演讲。
中文字幕:TFLite 从产品原型设计到落地
原型:从最前沿的模型入手
机器学习领域正在飞速发展,因此在投入资源开发功能之前,调研最新技术能带来哪些改善是不可缺失的一环。我们提供了预训练模型的代码库与相应的示例应用。通过示例应用,无需编写任何代码即可在您的设备上试用 TensorFlow Lite 模型。您可以快速将模型集成到自己的应用上。您的应用从设计原型到开始测试用户体验,与以往训练模型所需的时间相当。
模型
https://tensorflow.google.cn/lite/models
中文字幕:TensorFlow Lite 示例应用库介绍
问答
https://tensorflow.google.cn/lite/models/bert_qa/overview风格转化
https://tensorflow.google.cn/lite/models/style_transfer/overview
此外,我们也致力于将研究团队的前沿模型引入到 TensorFlow Lite。最近,我们已支持 3 种全新的模型架构:EfficientNet-Lite (论文)、MobileBERT (论文) 和 ALBERT-Lite (论文):
EfficientNet-Lite 是一种新型图像分类模型,可在使用更少参数、消耗更少算力的情况下,达到目前最佳准确率。模型针对 TensorFlow Lite 进行了优化,不仅支持量化且准确率损失微乎其微,还完全受 GPU Delegate 支持,可实现更快速的推理。如需了解详情,请参阅我们的文章。
在四线程 Pixel 4 CPU 上进行基准测试,2020 年 3 月
MobileBERT 是主流 BERT (论文)模型的优化版本,针对一系列 NLP 任务(如问答、自然语言推理等)都可达到目前最佳准确率。与 BERT 相比,MobileBERT 速度提升约 4 倍,体型更小,但准确率依旧维持原来的高水准。 ALBERT 是 BERT 的另一个轻量级版本,在保持相同准确率的同时对模型大小进行了优化。ALBERT-Lite 是兼容 TensorFlow Lite 的 ALBERT 版本,体型仅为 BERT 的 1/6(比 MobileBERT 小 1.5x),但延迟与 BERT 相当。
在四线程 Pixel 4 CPU 上进行基准测试,2020 年 3 月
模型超参数:序列长度 128,词汇大小 30K
开发模型:无需ML背景也可构建模型
在 TensorFlow Lite 中引入前沿研究模型的同时,我们还希望您能够为自己的用例与需求轻松自定义这些模型。
我们很高兴地发布 TensorFlow Lite Model Maker,这款工具简单易用。通过迁移学习,您可在您的数据集上应用前沿的机器学习模型。此工具将复杂的机器学习概念封装在直观的 API 中,无需机器学习专业知识,您也可以开启机器学习之旅。只需 4 行代码即可训练最前沿的图像分类:
data = ImageClassifierDataLoader.from_folder('flower_photos/')
model = image_classifier.create(data)
loss, accuracy = model.evaluate()
model.export('flower_classifier.tflite', 'flower_label.txt', with_metadata=True)
Model Maker
https://github.com/tensorflow/examples/tree/master/tensorflow_examples/lite/model_maker
Model Maker 支持 TensorFlow Hub 上提供的许多最前沿模型,其中包括 EfficientNet-Lite 模型。如果想获得更高的准确率,仅需修改一行代码(保留其余的训练流水线),即可切换到不同的模型架构。
# EfficinetNet-Lite2.
model = image_classifier.create(data, efficientnet_lite2_spec)
# ResNet 50.
model = image_classifier.create(data, resnet_50_spec)
Model Maker 目前支持两种用例:图像分类(教程)和文本分类(教程),不久将添加更多计算机视觉和 NLP 用例。
图像分类教程
https://colab.research.google.com/github/tensorflow/examples/blob/master/tensorflow_examples/lite/model_maker/demo/image_classification.ipynb文本分类教程
https://colab.research.google.com/github/tensorflow/examples/blob/master/tensorflow_examples/lite/model_maker/demo/image_classification.ipynb
开发模型:关联元数据无缝替换模型
机器可读参数:如标准化参数,像平均值和标准差、类别标签文件。其他系统可读取这些参数,从而生成封装类代码 (Wrapper Code)。我们在下一节中提供了一个相关示例。 人类可读参数:如模型描述、模型许可。这类参数可为使用模型的应用开发者提供关于如何正确使用模型的关键信息:如他们应注意到的一些优点或缺点。此外,像许可这样的字段在决定是否可使用某个模型时也很关键。将此类字段附加到模型可减少障碍,大幅提高采用率。
为强化这类工作,无论是 TensorFlow Lite Model Maker 创建的模型,还是 TensorFlow Hub (tensorflow.google.cn/hub) 上与图像相关的 TensorFlow Lite 模型,都已附加元数据。如果您正在创建自己的模型,可以通过附加元数据实现更轻松地共享。
# Creates model info.
model_meta = _metadata_fb.ModelMetadataT()
model_meta.name = "MobileNetV1 image classifier"
model_meta.description = ("Identify the most prominent object in the "
"image from a set of 1,001 categories such as "
"trees, animals, food, vehicles, person etc.")
model_meta.version = "v1"
model_meta.author = "TensorFlow"
model_meta.license = ("Apache License. Version 2.0 "
"http://www.apache.org/licenses/LICENSE-2.0.")
# Describe input and output tensors
# ...
# Writing the metadata to your model
b = flatbuffers.Builder(0)
b.Finish(
model_meta.Pack(b),
_metadata.MetadataPopulator.METADATA_FILE_IDENTIFIER)
metadata_buf = b.Output()
populator = _metadata.MetadataPopulator.with_model_file(model_file)
populator.load_metadata_buffer(metadata_buf)
populator.load_associated_files(["your_path_to_label_file"])
populator.populate()
有关如何为 MobileNet v1 填充元数据的完整示例,请参阅本指南 (https://tensorflow.google.cn/lite/convert/metadata)。
开发应用:从模型自动生成代码
通过元数据的机器可读部分,代码生成器能生成可用于集成的封装类代码 (Wrapper Code),而非通过复制和粘贴易出错的样板代码,将类型化对象(如位图)转换为 ByteArray 后再传递给 TensorFlow Lite 解释器。
您可以使用我们为 Android 构建的首款代码生成器生成模型封装类 (Wrapper)。同时,我们也在努力将此工具集成到 Android Studio。
为 Android 构建的首款代码生成器
https://tensorflow.google.cn/lite/guide/codegen集成
https://developer.android.google.cn/studio/preview/features#tensor-flow-lite-models
开发应用:通过基准和分析工具了解性能
创建模型后,我们想要了解它在移动设备上的性能表现。TensorFlow Lite 提供了基准工具来度量模型的性能。我们已为所有运行时选项添加了运行基准的支持,包括在 GPU 或其他受支持的硬件加速器上运行模型、指定线程数等。您还可以将推理延迟细分为单个操作粒度,以识别其中的最耗时操作,并优化模型推理。
基准工具
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/tools/benchmark
将模型集成到应用后,您可能会遇到其他性能问题,这时可使用平台提供的性能分析工具。例如,在 Android 上,您可以通过各种跟踪工具来排查性能问题。我们在 Android 上发布了 TensorFlow Lite 性能跟踪模块,助您了解 TensorFlow Lite 的内部机制。默认情况下,该模块安装在我们的 Nightly 版本中。用户可通过跟踪了解推理过程中是否出现了资源冲突问题。如需详细了解在 Android 基准工具中使用模块的方法,请参阅文档。
跟踪工具
https://developer.android.google.cn/topic/performance/tracing参阅文档
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/tools/benchmark/android#to-trace-tensorflow-lite-internals-including-operator-invocation
我们将继续努力改进 TensorFlow Lite 性能工具,在度量和调整各种设备上的 TensorFlow Lite 性能时提供更直观、更实用的工具。
部署:轻松扩展到多个平台
如今,多数应用都需同时支持多个平台。这也是我们构建 TensorFlow Lite 的原因:实现在 Android、iOS、Raspberry Pi 以及其他基于 Linux 的物联网设备间的无缝工作。TensorFlow Lite 的所有模型在官方支持的平台上都是现成可用的,因此您可以专注于创建优质模型,无需担心该如何根据不同平台进行调整。
在 Android 上,我们支持了可在数百万台设备上使用的 Qualcomm Hexagon DSP。如此一来,开发者便可在版本低于 Android 8.1 且不支持 Android NN API 的旧版设备上利用 DSP。 在 iOS 上,我们发布了 CoreML Delegate,以支持在 Apple 的 Neural Engine 上运行 TensorFlow Lite 模型。 CoreML Delegate
https://blog.tensorflow.org/2020/04/tensorflow-lite-core-ml-delegate-faster-inference-iphones-ipads.html
此外,我们也将继续改进了现有已支持平台的性能,如下图所示,我们对比了 2019 年 5 月和 2020 年 2 月的性能。只需升级到最新版 TensorFlow Lite 库,您便可享受这些改进所带来的好处。
Pixel 4 - 单线程 CPU,2020 年 2 月
工作展望
不断发布最新、最前沿的设备端模型,包括为 NLP 任务的 BERT 系列模型和全新视觉模型提供更佳支持。 发布新教程以及展示更多应用示例,包括如何使用 C/C++ API 在移动设备上进行推理。 增强 Model Maker 以支持更多任务,包括对象检测和多个 NLP 任务。我们将为 NLP 任务(如问答任务)添加 BERT 支持。如此一来,不具备机器学习专业知识的开发者也可通过迁移学习构建最前沿的 NLP 模型。 扩展元数据和 Codegen 工具以支持更多用例,包括对象检测及更多 NLP 任务。 发布更多平台集成以打造更轻松的端到端体验,包括更出色的 Android Studio 和 TensorFlow Hub 集成。
反馈
我们承诺将继续改进 TensorFlow Lite,同时也期待看到您利用 TensorFlow Lite 构建的模型,以及收到您的反馈。您也在此直接提交,或在微信后台留言与我们分享您的用例。如要报告错误和提 issue,请在 GitHub (https://github.com/tensorflow/tensorflow/issues) 上与我们联系。
致谢
感谢 Amy Jang、Andrew Selle、Arno Eigenwillig、Arun Venkatesan、Cédric Deltheil、Chao Mei、Christiaan Prins、Denny Zhou、Denis Brulé、Elizabeth Kemp、Hoi Lam、Jared Duke、Jordan Grimstad、Juho Ha、Jungshik Jang、Justin Hong、Hongkun Yu、Karim Nosseir、Khanh LeViet、Lawrence Chan、Lei Yu、Lu Wang、Luiz Gustavo Martins、Maxime Brénon、Mia Roh、Mike Liang、Mingxing Tan、Renjie Liu、Sachin Joglekar、Sarah Sirajuddin、Sebastian Goodman、Shiyu Hu、Shuangfeng Li、Sijia Ma、Tei Jeong、Tian Lin、Tim Davis、Vojtech Bardiovsky、Wei Wei、Wouter van Oortmerssen、Xiaodan Song、Xunkai Zhang、YoungSeok Yoon、Yuqi Li、Yi Zhou、Zhenzhong Lan、Zhiqing Sun 等人员。
如果您想详细了解 本文提及 的相关内容,请参阅以下文档。这些文档深入探讨了这篇文章中提及的许多主题:
EfficientNet-Lite (论文)
https://tfhub.dev/s?deployment-format=lite&q=efficientnet%20lite
https://arxiv.org/abs/1905.11946MobileBERT (论文)
https://tfhub.dev/tensorflow/mobilebert/1
https://arxiv.org/abs/2004.02984ALBERT-Lite (论文)
https://tfhub.dev/s?deployment-format=lite&q=albert
https://arxiv.org/abs/1909.11942BERT (论文)
https://github.com/google-research/bert
https://arxiv.org/abs/1810.04805
了解更多请点击 “阅读原文” 访问官网。