第 1 部分:快速、可扩展且准确的 NLP:为什么 TFX 是部署 BERT 的完美选择
2020 年 3 月 11 日
作者:SAP Concur Labs 高级机器学习工程师 Hannes Hapke。由 TFX 团队的 Robert Crowe 负责编辑。

Transformer 模型,尤其是 BERT 模型,彻底改变了 NLP 并为情感分析、实体提取或问答等任务开辟了新天地。BERT 模型允许数据科学家站在巨人的肩膀上。当模型由公司在大型语料库上进行预训练时,数据科学家可以将迁移学习应用于这些经过多用途训练的 Transformer 模型,并为其特定领域的问题取得突破性的结果。

SAP Concur Labs,我们希望加入这一潮流,并将 BERT 用于旅行和差旅领域的全新问题。我们希望简化 BERT 推理。不幸的是,我们尝试的解决方案从未感觉完美。

通过与 Google/TensorFlow 团队合作,并利用他们的最新开发成果,我们最终实现了始终如一、简单且特别快速的 BERT 模型推理目标。使用建议的实现方法,我们可以在几毫秒内完成从原始文本到分类的预测。让我们来看看各种 TensorFlow 库和组件如何帮助我们达到这一里程碑。

这篇博文将概述如何使用 TensorFlow 生态系统来实现可扩展、快速且高效的 BERT 部署。如果您有兴趣深入了解实现细节,请查看本博文关于实现步骤的详细信息的 第二部分。如果您想尝试我们的演示部署,请查看我们的 Concur Labs 演示页面,该页面展示了我们的情感分类项目。

关于服务的说明

本博文中讨论的方法将允许开发人员使用 TensorFlow Extended (TFX) v0.21 或更高版本训练 TensorFlow 模型。但是,当前版本的 TensorFlow Serving (v2.1) 尚未支持 tf.text 操作(包含在生成的训练模型中),但 nightly docker 版本中包含了该支持,并将包含在 v2.2 版本中。

想提前查看代码吗?

如果您想跳到完整的示例,请查看 Colab 笔记本。它展示了整个 TensorFlow Extended (TFX) 管道,以生成可部署的 BERT 模型,并将预处理步骤作为模型图的一部分。

BERT 部署的现状

Transformer 模型的最新发展令人惊叹。但不幸的是,将模型投入生产从未感觉简单或完美。理想情况下,我们希望将原始文本发送到服务器,但 BERT 模型需要对输入文本进行预处理,然后才能从实际模型中获得预测。一些现有的解决方案通过在客户端对文本进行预处理来解决这个问题,而其他解决方案则在服务器端实施了一个中间步骤来操作输入数据。这两种选择都感觉不太好,因为它们需要额外的部署协调(例如,在客户端-服务器传递过程中)或降低推理效率(例如,由于中间转换步骤导致复杂的预测批处理功能)。
图 1:当前 BERT 部署

最佳部署是什么样的?

在模型部署方面,越简单越好。我们希望部署 Transformer 模型,并将预处理步骤作为模型图的一部分。由于预处理集成到模型图中,我们能够将单个模型简单地部署到模型服务器,消除任何其他部署依赖项(客户端或中间预处理),并利用模型服务器的全部优势(例如,批处理预测请求以优化我们的推理硬件使用)。

使用 TensorFlow 生态系统部署 BERT

TensorFlow 对我们来说是一个非常高效的框架,因为它不仅仅是一个机器学习框架,它还提供了一个广泛的生态系统,包含支持包和工具。对我们有用的工具之一是 TensorFlow Serving。它提供简单、一致且 可扩展的模型部署

我们密切关注的另一个生态系统项目是 TensorFlow Transform。它为我们提供了构建模型预处理步骤的机会,这些步骤可以作为图导出,然后我们可以与实际的深度学习模型一起导出。TensorFlow Transform 要求所有预处理步骤都以 TensorFlow 操作的形式表达。这就是为什么 TensorFlow Text 的最新发展对我们非常有帮助。不仅 RaggedTensors 的实现开辟了新的实现方式,该库还提供了实现自然语言预处理步骤所需的功能。

TensorFlow Text 的一项新功能,即 在 TensorFlowWorld 2019 上发布,是 BERT Tokenizer 的完整实现。因此,我们能够使用几行 TensorFlow 代码表达我们的预处理步骤。我们还通过利用另一个 TensorFlow 工具:TensorFlow Extended (TFX),实现了始终如一的模型管道和部署。TFX 允许我们以可重复的方式表达整个 ML 管道,因此有助于我们部署一致的机器学习模型。
图 2:带有 tf.Text 的 TFX 管道

使用 TensorFlow 操作编写预处理步骤

理想的模型部署接受原始文本作为模型的输入,并提供模型预测作为回报。简化 BERT 部署的关键在于将预处理步骤表示为 TensorFlow 操作。BERT 模型要求将原始输入文本标记化为标记 ID,以及相应的输入掩码数据结构和生成的输入类型 ID。借助 TensorFlow Text,我们现在可以用更少的代码行实现这一点。在本博文的第二部分,我们将讨论将原始文本转换为 BERT 特定数据结构的细节,包括添加 BERT 特定标记。
vocab_file_path = load_bert_layer().resolved_object.vocab_file.asset_path
bert_tokenizer = text.BertTokenizer(vocab_lookup_table=vocab_file_path, 
                                    token_out_type=tf.int64, 
                                    lower_case=do_lower_case)
...
input_word_ids = tokenize_text(text)
input_mask = tf.cast(input_word_ids > 0, tf.int64)
input_mask = tf.reshape(input_mask, [-1, MAX_SEQ_LEN])
 
zeros_dims = tf.stack(tf.shape(input_mask))
input_type_ids = tf.fill(zeros_dims, 0)
input_type_ids = tf.cast(input_type_ids, tf.int64)
图 3:BERT 标记器
使用 TensorFlow Transform 和上面的代码,预处理图可以与训练好的 TensorFlow 模型一起导出。随着 TensorFlow Serving 的最新更新,我们部署的 BERT 模型现在可以接受原始文本作为输入。瞧!无需额外的部署依赖项。

使用 TensorFlow Transform 为我们提供了几个实际优势。一方面,我们可以在组织上将数据预处理和模型架构工作之间的职责分开。另一方面,我们可以轻松地调试、测试和生成预处理输出的统计信息。转换组件输出转换后的训练集(作为 TFRecords),可以轻松地进行检查。在“调试”转换输出时,我们发现了一些不会导致模型训练失败,但可能会影响模型性能的小错误(例如,[SEP] 标记中的偏移量)。从技术上讲,这里不需要 TensorFlow Transform。由于每个示例预处理都独立于整个语料库进行,我们可以轻松地将其直接构建到模型图中。但我们发现以这种方式构建和调试管道更容易。
图 4:BERT 层
如果您有兴趣深入了解实现细节,我们推荐本博文的第二部分,其中详细介绍了实现方法。

理想的部署?

简化的开发

通过利用各种 TensorFlow 工具,我们能够以简单明了的方式部署 BERT 模型。将预处理步骤集成到模型图中减少了训练数据和推理数据之间偏差的风险。部署的模型不需要额外的客户端或服务器依赖项,这进一步降低了模型错误的风险。我们可以使用 TensorFlow Serving 一致地部署 BERT 模型,同时利用模型优化(如批处理推理)。

推理性能

我们的初始性能测试结果非常令人鼓舞。在我们包含预处理步骤和模型的演示 BERT 模型图上的推理平均每个预测约 15.5 毫秒(在单个 V100 GPU 上测量,最大 128 个标记,gRPC 请求,未优化的 TensorFlow Serving GPU 版本,未区分大小写基本 BERT 模型)。以前在客户端进行 BERT 标记化,并在 TensorFlow Serving 上托管分类模型的部署平均推理时间大约相同。当然,根据您的机器(和模型),您可能会看到不同的结果。

更多信息

如果您有兴趣深入了解实现细节,我们推荐本博文的第二部分。如果您想深入了解代码,请查看 Colab 笔记本,其中包含使用预训练 BERT 模型的情感分类模型的示例实现。如果您想尝试我们的演示部署,请查看我们的 Concur Labs 演示页面,该页面展示了我们的情感分类项目。

如果您有兴趣了解 TensorFlow Extended (TFX) 和 TensorFlow Transform 的内部工作原理,请深入研究 TFX 用户指南,并查看即将出版的 O’Reilly 出版物“构建机器学习管道,使用 TensorFlow 自动化模型生命周期”(在线提供预发布版本)。

要了解更多关于 TFX 的信息,请访问 TFX 网站,加入 TFX 讨论组,深入了解 TFX 博客 中的其他文章,观看我们 YouTube 上的 TFX 播放列表,并 订阅 TensorFlow 频道。

鸣谢

如果没有凯瑟琳·尼尔森、理查德·帕克特、杰西卡·帕克、罗伯特·里德以及Concur Labs 团队的大力支持,这个项目将无法实现。感谢罗比·尼尔、罗伯特·克劳、艾琳·吉安努米斯、特里·黄、佐哈尔·亚哈夫、康斯坦丁诺斯·卡齐亚皮斯、阿诺·艾根维利格以及 TensorFlow 团队的其他成员讨论实施细节并提供 TensorFlow 库的更新。还要特别感谢 Talenpair 的科尔·霍华德,他总是能就自然语言处理进行启发性的讨论。
下一篇文章
Part 1: Fast, scalable and accurate NLP: Why TFX is a perfect match for deploying BERT

作者:SAP Concur Labs 高级机器学习工程师汉尼斯·哈普克,由 TFX 团队的罗伯特·克劳编辑。

Transformer 模型,特别是BERT 模型,彻底改变了 NLP,并在情感分析、实体提取或问答等任务上取得了突破。BERT 模型让数据科学家能够站在巨人的肩膀上。当 th…