TFX 最新博文:如何使用 TensorFlow 生態系統實現快速高效的 BERT 部署?

Transformer 模型,特別是 BERT 模型,徹底改變了 NLP,並在諸如情感分析、實體抽取或問答等任務上開闢了新的天地。BERT 模型允許數據科學家站在巨人的肩膀上。當企業用這些模型在大型語料庫中進預訓練時,數據科學家可以將遷移學習應用到這些多用途的 transformer 模型中,並針對其領域特定的問題取得突破性的結果。

在 SAP 的 Concur 實驗室,研究人員希望使用 BERT 解決差旅費領域的新問題。他們想簡化 BERT 的推論。但不幸的是,他們一直沒找到完美的解決方案。

通過與 TensorFlow 團隊合作,並使用他們的最新成果,Concur 實驗室最終實現了一致、簡單、快速的 BERT 模型推斷,可以在幾毫秒內實現從原始文本的分類預測。

那麼,各種 TensorFlow 庫和組件如何幫助研究人員達到這個里程碑?作為 SAP Concur 實驗室的高級機器學習工程師,Hannes Hapke 寫了一篇博文分享了他們的做法。TFX 團隊的研究人員也參與了這篇博文的編輯。

這篇博客文章將向你概述如何使用 TensorFlow 生態系統來實現可伸縮、快速、高效的 BERT 部署。全文編譯如下。

本文討論的方法將允許開發人員使用 TensorFlow Extended(TFX)v0.21 或更高版本來訓練 TensorFlow 模型。但是,對 tf.text 操作的支持尚未包含在 TensorFlow Service(v2.1)的當前版本中,而是包含在nightly docker版本中,並將包含在 v2.2 版本中。

如果你想查看完整的示例,請查看 Colab notebook。它展示了整個 TensorFlow 擴展(TFX)管道以生成可部署的 BERT 模型,並將預處理步驟作為模型圖的一部分。

BERT 部署的現狀

transformer 模型的最新進展令人吃驚。但不幸的是,將這些模型用在生產中卻並不簡單或者完美。理想情況下,我們希望將原始文本發送到服務器,但是 BERT 模型需要對輸入文本進行預處理,然後才能從實際模型中獲得預測。

有一些解決方案通過在客戶端對文本進行預處理來解決這個問題,還有的解決方案是,在服務器端實現了一箇中間步驟來處理輸入數據。這兩個方法都不太正確,因為它們需要額外的部署協調,降低了推理的效率。

TFX 最新博文:如何使用 TensorFlow 生态系统实现快速高效的 BERT 部署?

圖 1:當前的 BERT 部署

什麼是最佳部署?

在部署模型時,方法越簡單越好。我們希望部署 transformer 模型,並將預處理作為模型圖的一部分。由於預處理被集成到模型圖中,我們可以簡單地將單個模型部署到模型服務器,刪除其他部署依賴項,並充分利用模型服務器的優點。例如,我們可以批處理預測請求,以優化推理硬件的使用。

利用 TensorFlow 生態系統部署 BERT

TensorFlow 對我們來說是一個非常高效的框架,因為它不僅是一個機器學習框架,而且還提供了一個具有廣泛的支持包和工具的生態系統。TensorFlow Serving 對我們來說非常有用。它提供了簡單、一致、可伸縮的模型部署。

我們密切關注的另一個系統項目是 TensorFlow Transform。它為我們提供了一個將模型預處理步驟構建為圖的機會,然後,我們可以將這些圖與實際的深度學習模型一起導出。TensorFlow Transform 要求所有預處理步驟都表示為 TensorFlow 操作。正因為如此,TensorFlow 文本的最新發展對我們來說也非常有幫助。RaggedTensors 的實現不僅開啟了新的應用,而且,其庫還提供了實現自然語言預處理步驟所需的功能。

在 TensorFlowWorld 2019 上展示了 TensorFlow Text 的一個新功能,那就是完全實現一個 BERT 標記器。因此,我們可以用幾行 TensorFlow 代碼來表示預處理步驟。我們還通過使用另一個 TensorFlow 工具:TensorFlow Extended(TFX),實現了模型管道和部署一致的目標。TFX 允許我們以可重複的方式表達整個 ML 管道,因此有助於我們部署一致的機器學習模型。

TFX 最新博文:如何使用 TensorFlow 生态系统实现快速高效的 BERT 部署?

圖 2:附 tf.Text 的 TFX 管道

用 TensorFlow ops 編寫預處理步驟

理想的模型部署接受原始文本作為模型的輸入,並提供模型預測作為結果。簡化 BERT 部署的關鍵是將預處理步驟表示為 TensorFlow ops。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)

TFX 最新博文:如何使用 TensorFlow 生态系统实现快速高效的 BERT 部署?

圖 3:BERT 標記器

利用 TensorFlow Transform 和上述代碼,可以將預處理圖與訓練好的 TensorFlow 模型一起導出。隨著 TensorFlow Serving 的最新更新,我們部署的 BERT 模型現在可以接受原始文本作為輸入。在這裡,沒有其他部署依賴項!

使用 TensorFlow Transform 為我們提供了一些實際的好處。一方面,我們可以在組織上劃分數據預處理和模型架構工作之間的職責。另一方面,我們可以方便地調試、測試和生成預處理輸出的統計信息。transform 組件輸出轉換後的訓練集,作為 TFRecords,這些訓練集易於檢查。

在 Transform 輸出的「調試」過程中,我們發現了一些小錯誤,這些錯誤不會導致模型的訓練失敗,但可能會影響其性能。例如,[SEP] 標記中的偏移量。從技術上來講,這裡不需要 TensorFlow Transform。由於每個示例的預處理獨立於整個語料庫進行,我們可以很容易地將其直接構建到模型圖中。但是,我們發現用這種方法構建和調試管道會更容易。

TFX 最新博文:如何使用 TensorFlow 生态系统实现快速高效的 BERT 部署?

圖 4:BERT 層

理想的部署?

簡化開發

通過使用各種 TensorFlow 工具,我們能夠以簡單而簡潔的方式部署 BERT 模型。將預處理步驟集成到模型圖中可以減少訓練數據和推理數據之間的傾斜風險。部署的模型不需要額外的客戶機或服務器依賴項,這進一步降低了模型錯誤的風險。我們可以將我們的 BERT 模型與 TensorFlow Serving 一致地部署,同時還可以利用模型優化——如批處理推斷。

推理性能

我們最初的性能測試看起來很有希望。在我們的演示 BERT 模型圖上的推論,包含預處理步驟和每個預測模型。這些模型平均約 15.5 ms,它們是在單個 V100 GPU、最多 128 個標記、gRPC 請求上測量的,由 GPU 的非優化 TensorFlow 服務構建的無基礎 BERT 模型。這和以前在客戶端使用 BERT 標記化的部署以及使用 TensorFlow Serving 託管的分類模型的平均推斷時間大致相同。當然,根據你的機器及其型號的不同,你可能會看到不同的結果。

如果你想深入瞭解代碼,請查看 Colab notebook,其中有一個使用預先訓練的 BERT 模型實現情感分類模型的示例。如果你想試用我們的演示部署,請查看 Concur 實驗室的演示頁面,上面展示了我們的情感分類項目。

如果你對 TensorFlow Extended(TFX)和 TensorFlow Transform 的內部工作感興趣,請進入 TFX 用戶指南並查看即將出版的 O'Reilly 出版物「Building Machine Learning Pipelines, Automating Model Life Cycles With TensorFlow」。

要了解有關 TFX 的更多信息,請訪問 TFX 網站,加入 TFX 討論組,瀏覽 TFX 博客中的其他文章,或者在 YouTube 上觀看我們的 TFX 播放列表,並訂閱 TensorFlow 頻道。

  • TFX 討論小組:https://groups.google.com/a/tensorflow.org/forum/#!forum/tfx

  • TFX 博客:https://blog.tensorflow.org/search?label=TFX

  • YouTube TFX 播放列表:https://www.youtube.com/playlist?list=PLQY2H8rRoyvxR15n04JiW0ezF5HQRs_8F

  • TensorFlow 頻道:https://goo.gle/2WtM7Ak

via:https://blog.tensorflow.org/2020/03/part-1-fast-scalable-and-accurate-nlp-tensorflow-deploying-bert.html

雷鋒網雷鋒網雷鋒網


分享到:


相關文章: