设备端机器学习框架 TensorFlow Lite 为手机、微控制器和 Edge TPU 等边缘设备提供机器学习功能,已被广泛用于许多应用领域。其中,”自然语言处理“ (Natural Language Processing) 是备受研究界和业界关注的关键领域之一。去年我们在 TensorFlow World 上演示了基于 TFLite 的设备端问答用例后,引起了社区的浓厚兴趣,并且获得将更多此类 NLP 模型用于设备端推理的期待与反馈。

知乎视频​www.zhihu.com

得益于这些反馈的启发,今天我们很高兴推出支持 TensorFlow Lite 上 NLP 任务端到端部署的新功能。在新功能的帮助下,越来越多的 NLP 模型能够在手机上运行,用户可以享受 NLP 模型的优势,同时个人数据仍保留在设备端。本文中,我们将介绍一些新功能:

  1. 新的预训练 NLP 模型
  2. 创建您自己的 NLP 模型
  3. TensorFlow NLP 模型转换为 TensorFlow Lite 更轻松
  4. 在移动设备上部署这些模型

使用新的预训练 NLP 模型

参考应用

参考应用是一组开源移动应用,封装了预训练的机器学习模型、推理代码和可运行的演示。我们提供了一系列与 Android Studio 和 XCode 集成的 NLP 应用,因此开发者只需点击一下就可以将其构建并部署在 Android 或 iOS 手机上。

使用以下 NLP 参考应用,移动开发者可以了解如何集成现有 NLP 模型(BERT、MobileBERT或ALBERT)、转换原始文本数据以及连接模型的输入和输出以生成预测结果的端到端流程。

  • 文本分类:模型根据给定的文本数据预测标签
  • 问答应用:给定文章和用户问题,模型可以根据文章的内容回答问题
  • 智能回复 (Smart reply):基于给定的上下文,模型可以预测并生成潜在的自动回复

上述参考应用中使用的预训练模型可在 TensorFlow Hub 中找到。下表显示了模型之间的延迟、大小和 F1 得分。

Pixel 4 CPU、4 线程基准测试,2020 年 3 月(模型超参数:序列长度 128,词汇量 30K)

针对设备端用例优化 NLP 模型

与服务器端模型相比,设备端模型有不同的约束。它们运行在内存较低、芯片速度较慢的设备上,因此需要针对模型大小和推理速度进行优化。以下是我们如何针对 NLP 任务优化模型的几个示例。

量化 MobileBERT

MobileBERT 是在 GitHub 上开源的紧凑型 BERT 模型。它的大小约为基础版 BERT (float32) 的四分之一,速度也比后者快 5.5 倍,并且能够在 GLUE 和 SQuAD 数据集上实现相当的结果。

在初始版本后,我们进一步改进了模型 - 使用量化优化模型大小和性能,使其能够利用 GPU/DSP 等加速器(如果有)。量化后的 MobileBERT 的大小为基础 BERT 的十六分之一,速度加快 8 倍,却几乎没有准确率损失。MLPerf for Mobile 社区正在利用量化 MobileBERT 模型进行移动推理基准测试,该模型还可以通过 TensorFlow.js 在 Chrome 中运行。

下表显示了量化后的 MobileBERT 与基础版 BERT 基础模型 (416MB) 在相同设置下的性能比较。

使用投影方法的无嵌入向量 NLP 模型

语言识别是对给定文本的语言进行分类的一种问题类型。最近我们开源了两个使用投影方法的模型,即 SGNN 和 PRADO。

我们使用 SGNN 展示了使用 Tensorflow Lite 处理 NLP 任务的简单和高效。SGNN 将文本投影到固定长度的特征,然后是全连接层。利用注释来告知 TensorFlow Lite 转换器融合 TF.Text API,这样我们可以获得一个更高效的模型在 TensorFlow Lite 上推理。以前,该模型在基准上运行需要 1332.87 μs;而在融合后,在同一台机器运行,需 64.06 μs,带来了 20 倍加速。

我们还演示了名为 PRADO 的模型架构。PRADO 首先从单词分词序列中计算出可训练的投影特征,然后应用卷积和注意力将特征映射到固定长度编码。通过结合投影层、卷积和注意力编码器机制,PRADO 实现了与 LSTM 相似的准确率,但模型大小却是后者的百分之一。

这些模型背后的理念是使用投影来计算文本中的特征,这样模型就不需要维护一个很大的嵌入向量表来将文本特征转换为嵌入向量。通过这种方式,我们证明了该模型将比基于嵌入向量的模型要小得多,但是能够保持相似的性能和推理延迟。

创建您自己的 NLP 模型

除了使用预训练的模型外,TensorFlow Lite 还为您提供了诸如 Model Maker 之类的工具,让您可以根据自己的数据自定义现有模型。

TensorFlow Lite Model Maker:面向机器学习初学者的迁移学习工具包

TensorFlow Lite Model Maker 是一款易于使用的迁移学习工具,可根据您的数据集调整最前沿 (SOTA) 的机器学习模型。借助 Model Maker,移动开发者在没有任何机器学习专业知识的情况下也可以创建模型,通过迁移学习减少所需的训练数据并缩短训练时间。

在专注于视觉任务的初始版本之后,我们最近向 Model Maker 添加了两个新的 NLP 任务。您可以按照文本分类和问答的 Colab 和指南进行操作。执行以下操作以安装 Model Maker:

pip install tflite-model-maker

开发者需要编写几行 Python 代码来自定义模型,如下所示:

# Loads Data.
train_data = TextClassifierDataLoader.from_csv(train_csv_file, mode_spec=spec)
test_data = TextClassifierDataLoader.from_csv(test_csv_file, mode_spec=spec)# Customize the TensorFlow model.
model = text_classifier.create(train_data, model_spec=spec)# Evaluate the model.
loss, acc = model.evaluate(test_data)# Export as a TensorFlow Lite model.
model.export(export_dir, quantization_config=config)

转换:NLP 模型转换为 TensorFlow Lite 更轻松

由于 TensorFlow Lite 内置算子库仅支持部分 TensorFlow 算子,因此在将 NLP 模型转换为 TensorFlow Lite 时可能会遇到问题,原因可能是缺少算子或不受支持的数据类型(如 RaggedTensor 支持、哈希表支持和资源文件处理等)。以下是有关在这些情况下如何解决转换问题的一些提示。

在 TensorFlow Lite 中运行 TensorFlow 算子和 TF.text 算子

我们增强了选择 TensorFlow 算子以支持各种情况。按照“选择 TF 算子”的说明操作,开发者可以在没有内置 TensorFlow Lite 等效算子的情况下利用 TensorFlow 算子在 TensorFlow Lite 上运行模型。例如,在训练 TensorFlow 模型时通常会使用 TF.Text 算子和 RaggedTensor,现在这些模型可以轻松转换为 TensorFlow Lite 并采用必要的算子运行。

此外,我们还提供使用算子选择性构建的解决方案,获得用于移动部署的精简二进制文件。它可以在最终的构建目标中选择一小组使用过的算子,从而缩减部署中的二进制文件大小。

更高效、更友好的自定义算子

在 TensorFlow Lite 中,我们为 NLP 提供了一些新的适合移动设备的算子,例如 Ngram、SentencePieceTokenizer、WordPieceTokenizer 和 WhitespaceTokenizer。

以前,有一些限制会阻止 SentencePiece 模型转换为 TensorFlow Lite。面向移动设备的新 SentencePieceTokenizer API 解决了这些难题,同时优化了实现,使其运行更快。

同样,Ngram 和 WhitespaceTokenizer 现在不仅受支持了,而且能够在设备上更高效地执行。

TensorFlow Lite 最近推出了与 MLIR 的算子融合。我们使用相同的机制将 TF.Text API 融合到自定义 TensorFlow Lite 算子中,显著提高了推理效率。例如,WhitespaceTokenizer API 由多个算子组成,在 TensorFlow Lite 的原始计算图中运行需要 0.9 ms。在将这些算子融合成一个单独的算子后,只需 0.04 ms 即可完成计算,速度提高了 23 倍。事实证明,这种方式在上述 SGNN 模型中可以大幅改善推理延迟。

哈希表支持

哈希表对于许多 NLP 模型都很重要,因为我们通常需要通过将单词转换为 token ID 来在语言模型中利用数字计算,反之亦然。哈希表将很快在 TensorFlow Lite 中启用。其支持方式是以 TensorFlow Lite 格式原生处理资源文件并将算子内核作为 TensorFlow Lite 内置算子。

部署:如何在设备端运行 NLP 模型

现在,使用 TensorFlow Lite 运行推理比以前要容易得多。仅需 5 行代码您便可以使用预构建的推理 API 集成模型,或者使用实用工具构建自己的 Android/iOS 推理 API。

用 TensorFlow Lite Task Library 进行简单的模型部署

TensorFlow Lite Task Library 是一个功能强大且易于使用的特定于任务的库,它为 ML 推理提供了所需的开箱即用的预处理和后处理实用工具,使应用开发者能够使用 TensorFlow Lite 轻松创建机器学习功能。Task Library 支持三种文本 API,分别对应于上述用例和模型:

  • NLClassifier:将输入文本分类为一组已知类别。
  • BertNLClassifier:为 BERT 系列模型而优化的文本分类。
  • BertQuestionAnswerer:根据给定段落的内容,使用 BERT 系列模型回答问题。

Task Library 可在 Android 和 iOS 上跨平台运行。以下示例显示了使用 Java/Swift 代码的 BertQA 模型推理:

// Initialization
BertQuestionAnswerer answerer = BertQuestionAnswerer.createFromFile(androidContext, modelFile);
// Answer a question
List answers = answerer.answer(context, question);

// Initialization
let mobileBertAnswerer =   TFLBertQuestionAnswerer.mobilebertQuestionAnswerer(modelPath: modelPath)
// Answer a question
let answers = mobileBertAnswerer.answer(context: context, question: question)

自定义推理 API

如果现有任务库不支持您的用例,您还可以利用 Task API Infrastructure,使用同一仓库中的通用 NLP 实用工具(如 Wordpiece 和 Sentencepiece 分词器)构建自己的 C++/Android/iOS 推理 API。

结论

在本文中,我们介绍了 TensorFlow Lite 中对 NLP 任务的新支持。利用 TensorFlow Lite 的最新更新,开发者可以轻松地在设备端创建、转换和部署 NLP 模型。我们将继续提供更多实用的工具,并加快从研究到生产的设备端 NLP 模型的开发流程。我们希望听到您对新的 NLP 工具与实用工具的反馈和建议。请向 tflite@tensorflow.org 发送电子邮件或在 GitHub 为 TensorFlow Lite 提 issue。

致谢

感谢 Khanh LeViet、Arun Venkatesan、Max Gubin、Robby Neale、Terry Huang、Peter Young、Gaurav Nemade、Prabhu Kaliamoorthi、Ping Yu、Renjie Liu、Lu Wang、Xunkai Zhang、Yuqi Li、Sijia Ma、Thai Nguyen、Xingying Song、Chung-Ching Chang、Shuangfeng Li 对本文的贡献


谷歌开发者官方现已开通知乎专栏:TensorFlow 学习资源站,一站式收录来自官方的 TensorFlow 相关实用技术资源,欢迎关注,及时收到更新提醒!

想获取更多产品发布新消息?欢迎关注 TensorFlow 官方微信公众号(TensorFlow_official)!

模型部署到移动端_TensorFlow Lite 自然语言处理模型的最新功能,助力设备端 NLP 部署...相关推荐

  1. ROHM | 开发出数十毫瓦超低功耗的设备端学习AI芯片,无需云服务器、在设备端即可实时预测故障

    ROHM开发出一款设备端学习*AI芯片(配备设备端学习AI加速器的SoC),该产品利用AI(人工智能)技术,能以超低功耗实时预测内置电机和传感器等的电子设备的故障(故障迹象检测),非常适用于IoT领域 ...

  2. 一文搞懂 USB 设备端驱动框架

    关注+星标公众号,不错过精彩内容 转自 | 漫谈嵌入式 hello 大家好,今天带领大家学习一下USB 设备端驱动 内核版本:4.4.94 1. Linux USB 子系统 在介绍设备端驱动前,我们先 ...

  3. 移动端目标识别(1)——使用TensorFlow Lite将tensorflow模型部署到移动端(ssd)之TensorFlow Lite简介...

    平时工作就是做深度学习,但是深度学习没有落地就是比较虚,目前在移动端或嵌入式端应用的比较实际,也了解到目前主要有 caffe2,腾讯ncnn,tensorflow,因为工作用tensorflow比较多 ...

  4. 手把手教程:用Python开发一个自然语言处理模型,并用Flask进行部署

    截住到目前为止,我们已经开发了许多机器学习模型,对测试数据进行了数值预测,并测试了结果.实际上,生成预测只是机器学习项目的一部分,尽管它是我认为最重要的部分.今天我们来创建一个用于文档分类.垃圾过滤的 ...

  5. 怎么将tflite部署在安卓上_tensorflow从训练自定义CNN网络模型到Android端部署tflite...

    网上有很多关于tensorflow lite在安卓端部署的教程,但是大多只讲如何把训练好的模型部署到安卓端,不讲如何训练,而实际上在部署的时候,需要知道训练模型时预处理的细节,这就导致了自己训练的模型 ...

  6. 谷歌终于推出TensorFlow Lite,实现在移动设备端部署AI

    安妮 编译整理 量子位 出品 | 公众号 QbitAI 还得从半年前说起. 今年5月的谷歌I/O大会上,安卓工程副总裁Dave Burke宣布将推出一个专门为移动设备优化的TensorFlow,称为T ...

  7. 干货!考虑部署在移动端的视频插帧模型:CDFI

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 对于给定的视频进行插帧操作提高帧率会使得视频更加流畅,但往往用于视频插帧的深度神经网络都具有复杂的模型架构,这使得它们无法部署在系统资源 ...

  8. 模型部署到移动端_分分钟打开倾斜摄影模型,新版本的老子云移动端也太好用了吧!...

    距离上次老子云web端更新已经过去一个月了 在这一期间老子云开发团队又在做什么呢? 没错,就是在筹备移动端更新ing 经过多次方案讨论与需求修改 2020年最后一个月 老子云移动端3.1版本更新啦 本 ...

  9. 【项目实战课】从零掌握安卓端Pytorch原生深度学习模型部署

    欢迎大家来到我们的项目实战课,本期内容是<从零掌握安卓端Pytorch原生深度学习模型部署>.所谓项目课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题,进行代码级的实战 ...

最新文章

  1. hi3516a的文件系统错误
  2. 中画图title函数_MATLAB-基础画图meshgrid
  3. mysql限制小数位_Mysql中设置小数点用什么数据类型 decimal
  4. redis集群常用命令
  5. 小学计算机房简单介绍,介绍计算机教室的小学作文我们学校的机房
  6. bulk of the 用法_代词的用法详解:第三部分(不定代词)
  7. IoT 打响安防保卫战!
  8. C++(八)— 死锁原因及解决方法
  9. 如何创建 Visual Studio 2017 RC 离线安装包
  10. 冒险岛PHP源码,岁月最新源码 岁月冒险岛端源码。。部分源码需要的拿走了、不谢!!! 联合开发网 - pudn.com...
  11. 抖音计算机音乐的id,抖音卡点音乐叫什么名字 抖音卡点bgm介绍
  12. php网页背景音乐代码,HTML5背景音乐播放器代码
  13. 未知USB设备(设备描述符请求失败)解决方法
  14. Kubernetes Downward API 基本用法
  15. JAVA后端如何保证业务操作的幂等性
  16. 2022-04-28 Unity核心1——图片导入与图片设置
  17. maven打jar包时报update interval of XXX has elapsed or updates are force
  18. 正则 验证密码(数字和英文同时存在)
  19. VC++按F5出现No matching symbolic info found程序运行完直接退出
  20. java datarow_Java DataRow類代碼示例

热门文章

  1. lodoop打印控件详解
  2. IntelliJ IDEA使用教程三 SVN的集成与使用
  3. oracle文字与格式字符串不匹配的解决
  4. Spring通过Gmail SMTP服务器MailSender发送电子邮件
  5. mootools 简介
  6. javq接口_Java的接口及实例
  7. python三大主流框架的对比
  8. golang连接mysql操作示例增删改查(已经测试)
  9. 编译安装php的openssl组件时遇到 libssl not found解决办法
  10. Bug错误openssl_encrypt()