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

2020-12-11 雷鋒網

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 模型需要對輸入文本進行預處理,然後才能從實際模型中獲得預測。

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

圖 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 管道,因此有助於我們部署一致的機器學習模型。

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

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

圖 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/tfxTFX 博客:https://blog.tensorflow.org/search?label=TFXYouTube TFX 播放列表:https://www.youtube.com/playlist?list=PLQY2H8rRoyvxR15n04JiW0ezF5HQRs_8FTensorFlow 頻道:https://goo.gle/2WtM7Akvia:https://blog.tensorflow.org/2020/03/part-1-fast-scalable-and-accurate-nlp-tensorflow-deploying-bert.html

雷鋒網雷鋒網雷鋒網

相關焦點

  • 教程 | 維度、廣播操作與可視化:如何高效使用TensorFlow
    基礎、理解靜態維度和動態維度、廣播操作(Broadingcast 的好處和壞處)、使用 Python 操作的原型內核和先進的可視化等幾個方面詳細梳理如何高效使用TensorFlow。下面展示了這個方法在 TensorFlow 中是如何實現的:import numpy as npimport tensorflow as tf# 使用佔位符從python向TensorFlow運算符中傳遞參數值。我們在這裡定義了兩個佔位符,其中一個用來存放輸入特徵x,另一個用來存放輸出y.
  • 玩轉TensorFlow?你需要知道這30功能
    如果你關心如何使模型保持最新並監控它們,那麼你可以了解一下這個產品、看看它的論文。地址是:tensorflow.org/tfx/?hl=zh-cnhttps://www.tensorflow.org/tfx/data_validation/?hl=zh-cn
  • 使用Python+Tensorflow的CNN技術快速識別驗證碼
    Tensorflow 是由 Google 團隊開發的神經網絡模塊,短短幾年間, 就已經有很多次版本的更新。最近我也在自學Tensorflow,想通過卷積神經網絡快速識別整塊驗證碼(不分割字符)。期間也碰到許多問題,諸如軟體安裝,Tensorflow版本差異等。一開始學習tensorflow是盲目的,不知如何下手,網上的資料都比較單一,為了回報社會,讓大家少走彎路,我將詳細介紹整個過程。
  • TensorFlow圖像分類教程
    在這個由兩部分組成的系列中,我將講述如何快速的創建一個應用於圖像識別的卷積神經網絡。TensorFlow計算步驟是並行的,可對其配置進行逐幀視頻分析,也可對其擴展進行時間感知視頻分析。本系列文章直接切入關鍵的部分,只需要對命令行和Python有最基本的了解,就可以在家快速地創建一些令你激動不已的項目。
  • tensorflow極速入門
    首先是一些基礎概念,包括計算圖,graph 與 session,基礎數據結構,Variable,placeholder 與 feed_dict 以及使用它們時需要注意的點。最後給出了在 tensorflow 中建立一個機器學習模型步驟,並用一個手寫數字識別的例子進行演示。1、 tensorflow是什麼?
  • 模型秒變API只需一行代碼,支持TensorFlow等框架
    為了讓用戶更好地使用這一工具,項目作者同時還提供了一些使用案例。包括:基於 TensorFlow 和 BERT 進行情感分析:https://github.com/cortexlabs/cortex/tree/0.10/examples/tensorflow/sentiment-analysis基於 TensorFlow 和 Inception 模型進行圖像分類:https://github.com/cortexlabs/
  • 令人困惑的TensorFlow!
    我是在 2017 年夏天加入該項目的,儘管已經擁有了豐富的編程經驗,並且對機器學習的理解也很深刻,但此前我從未使用過 TensorFlow。當時我覺得憑我的能力應該很快就能上手。但讓我沒想到的是,學習曲線相當的陡峭,甚至在加入該項目幾個月後,我還偶爾對如何使用 TensorFlow 代碼來實現想法感到困惑。我把這篇博文當作瓶中信寫給過去的自己:一篇我希望在學習之初能被給予的入門介紹。
  • TensorFlow 資源大全中文版
    TensorFlow 是一個採用數據流圖(data flow graphs),用於數值計算的開源軟體庫。節點(Nodes)在圖中表示數學操作,圖中的線(edges)則表示在節點間相互聯繫的多維數據數組,即張量(tensor)。它靈活的架構讓你可以在多種平臺上展開計算,例如臺式計算機中的一個或多個CPU(或GPU)、伺服器、行動裝置等等。
  • OpenCV+Tensorflow實現實時人臉識別演示
    FaceNet網絡設計目標任務有如下1.驗證-驗證是否為同一張臉2.識別-識別是否為同一個人3.聚類-發現人臉具有相同之處的人關於什麼是神經網絡嵌入,這個解釋比較複雜,簡單的說神經網絡的嵌入學習可以幫助我們把離散變量表示為連續的向量,在低維空間找到最近鄰,tensorflow中的word2vec就是用了嵌入。
  • 教程 | 用TensorFlow Estimator實現文本分類
    通過本文你將學到如何使用 word2vec 詞嵌入和遷移學習技術,在有標籤數據稀缺時獲得更好的模型性能。本文主要內容如下:本文選自介紹 TensorFlow 的 Datasets 和 Estimators 模塊系列博文的第四部分。
  • 教程| 如何用TensorFlow在安卓設備上實現深度學習推斷
    她在 Insight 工作的時候,在安卓系統上用 TensorFlow 部署了一個 WaveNet 模型。本文詳細介紹了部署和實現過程。對於個人和公司來說,存在許多狀況是更希望在本地設備上做深度學習推斷的:想像一下當你在旅行途中沒有可靠的網際網路連結時,或是要處理傳輸數據到雲服務的隱私問題和延遲問題時。
  • 從系統和代碼實現角度解析TensorFlow的內部實現原理 | 深度
    摘要2015年11月9日,Google發布深度學習框架TensorFlow並宣布開源,並迅速得到廣泛關注,在圖形分類、音頻處理、推薦系統和自然語言處理等場景下都被大面積推廣。TensorFlow系統更新快速,官方文檔教程齊全,上手快速且簡單易用,支持Python和C++接口。
  • 從系統和代碼實現角度解析TensorFlow的內部實現原理|深度
    摘要2015年11月9日,Google發布深度學習框架TensorFlow並宣布開源,並迅速得到廣泛關注,在圖形分類、音頻處理、推薦系統和自然語言處理等場景下都被大面積推廣。TensorFlow系統更新快速,官方文檔教程齊全,上手快速且簡單易用,支持Python和C++接口。
  • 用TensorFlow構建一個中文分詞模型需要幾個步驟
    注意,所謂半監督學習(Semi-supervised learning),其實是一大類算法、方法的統稱,這裡使用的方法只是某種非常簡單的半監督學習方法的應用。模型在模型上,我們選擇使用Albert-small版本的模型,這個版本的模型大小不到30MB,適合比較輕量級的任務,我們可以先嘗試實現一個最簡單的序列標註模型。
  • Fast-SCNN的解釋以及使用Tensorflow 2.0的實現
    現在,讓我們首先實現這個模塊。首先,我們安裝Tensorflow 2.0。我們可以簡單地使用谷歌Colab並開始我們的實現。你可以簡單地使用以下命令安裝:!pip install tensorflow-gpu==2.0.0這裡,' -gpu '說明我的谷歌Colab筆記本使用GPU,而在你的情況下,如果你不喜歡使用它,你可以簡單地刪除' -gpu ',然後Tensorflow安裝將利用系統的cpu。
  • 基於 Tensorflow 輕鬆實現 XOR 運算!| CSDN 博文精選
    在計算機早期發展中,邏輯運算廣泛應用於電子管中,這一點如果大家學習過微機原理應該會比較熟悉,那麼在神經網絡中如何實現它呢,早先我們使用的是感知機,可理解為單層神經網絡,只有輸入層和輸出層(在吳恩達老師的系列教程中曾提到過這一點,關於神經網絡的層數,至今仍有異議,就是說神經網絡的層數到底包不包括輸入層,現今多數認定是不包括的,我們常說的N層神經網絡指的是隱藏層+輸出層),但是感知機是無法實現XOR運算的
  • 谷歌開放GNMT教程:如何使用TensorFlow構建自己的神經機器翻譯系統
    由於其可以使用深度神經網絡獲取句義,該模型成為谷歌翻譯等多數商業翻譯系統事實上的標準模型。但是,儘管有關 OpenNMT 或 tf-seq2seq 等 seq2seq 模型的資料已經非常豐富,但能夠指導人們快速構建高質量翻譯系統的知識和技能仍然略顯不足。
  • Windows上安裝Tensorflow踩的坑
    在Rstudio運用R實現Tensorflow的一般步驟    按照TensorFlow for R官網說明,運用R實現Tensorflow主要包含4步(如下),其中關鍵步驟在於安裝好Tensorflow以及tensorflow R 包與python的連接。從TensorFlow官網安裝TensorFlow.
  • 計算機圖形學遇上深度學習,針對3D圖像的TensorFlowGraphics面世
    GitHub 地址:https://github.com/tensorflow/graphics近幾年,一種可以插入神經網絡架構中的新型可微圖形層(differentiable graphics layer)開始興起。從空間變換器(spatial transformer)到可微圖形渲染器,這些新型網絡層利用多年的計算機視覺和圖形學研究知識來構建更高效的新網絡架構。
  • 【官方教程】TensorFlow在圖像識別中的應用
    人類在ImageNet挑戰賽上的表現如何呢?Andrej Karpathy寫了一篇博文來測試他自己的表現。他的top-5 錯誤率是5.1%。這篇教程將會教你如何使用Inception-v3。你將學會如何用Python或者C++把圖像分為1000個類別。我們也會討論如何從模型中提取高層次的特徵,在今後其它視覺任務中可能會用到。