跳轉到主要內容
工程的博客

如何拓展Productionizes PyTorch-based擁抱NLP臉變形金剛嗎

分享這篇文章

這是一個客人從數據團隊的博客Outreach.io。我們感謝同事安德魯·布魯克斯,員工數據科學家(NLP) Yong-Gang曹,機器學習工程師,和劉勇,主要數據科學家,拓展。io為他們的貢獻。


在推廣,主要銷售參與平台,我們的數據科學團隊是我們創新的產品組合背後的推動力量主Beplay体育安卓版本要由深度學習和人工智能。我們最近宣布的增強拓展見解特性,這是由私有買家信心深度學習模型推廣數據科學團隊開發的。這個模型允許銷售團隊深化理解客戶情緒通過電子郵件回複內容的分析,從數的回複速度分類回答者的意圖。

我們使用四個主要分類電子郵件回複內容:積極的,反對,退訂推薦,以及細sub-classifications。例如,對於分類作為回答反對,我們可以打破多少回複是由於預算限製和采購時機的問題。這是一個改變遊戲規則的銷售團隊,為銷售經理提供可行的見解指導銷售代表來改善他們的策略和性能。

這個博客上描述了技術細節我們如何開發買家信心深度學習模型,這是一個銷售多類分類器參與電子郵件。特別是,我們將解釋離線模型開發/實驗,productionization和部署步驟。

概述的ML模型生命周期:開發和生產

如前所述在很多最近文章機器學習的發展(ML)模型需要三個主要構件:數據、模型和代碼。成功開發和船舶毫升模型在生產中,我們需要擁抱毫升的完整生命周期的開發項目。圖1是一個示意圖推廣的完整生命周期開發和生產路徑嗎,從數據注釋離線模型開發/試驗,模型productionization (model-preproduction)模型部署(登台和生產),最後,在線模型監控和反饋循環。用於模型dev / pre-prod和CI / CD管道執行服務器(例如,使用GPU集群在磚模型訓練)。

推廣的完整生命周期示意圖視圖毫升開發和生產的道路

圖1:完整的生命周期視圖的模型開發和生產推廣

在離線模型開發/實驗階段(即。,Model Dev step as labeled in Figure 1), we tried different types of ML models, such as SVM, FastText and Pytorch-based擁抱的臉變形金剛。根據我們的需求(分類f1得分最初的英語,與多種語言長期計劃),我們決定使用Pytorch-based擁抱臉變壓器(bert-uncased-small)因其高性能的分類結果1)。

然而,productizing原型所麵臨的仍然是最痛苦的經曆之一毫升從業者。你可以交易紀律的速度生產級標準從一開始執行。然而,這往往是過早優化,毫升模型需要多次迭代和非線性過程,和許多失敗或大幅主之前船。您還可以從一開始就貿易工程學科最大的靈活性。然而,這使得從原型到生產更痛苦一旦複雜性達到一個臨界點,邊際成本大於邊際收益每一個新的提高。

紀律和靈活性之間的平衡是在中間。對我們來說,這意味著我們不直接船原型代碼和實驗,但是我們執行所需的最少的結構1)登記結果從每個原型實驗,所以我們不需要重複它們,尤其是失敗的實驗;2)原型實驗結果鏈接到源代碼,所以我們知道邏輯產生它們並確保再現性;和3)使曆史原型模型加載離線分析。

與MLflow項目實驗、測試和部署

基於我們的完整的生命周期分析,我們使用MLflow項目模型之間的共同開發和部署實現這一平衡。MLflow項目是一個體重較輕的層,集中和標準化的入口點和環境定義自我記錄的框架。

為什麼我們使用MLflow項目:

MLflow項目幾乎沒有重量加到你的項目中,特別是如果你已經在使用MLflow跟蹤和MLflow模型,有內置集成。

  1. 順利執行選擇的IDE中開發的代碼。
    →支持運行磚筆記本是一流的,但它可以麻煩來運行腳本。MLflow項目提供了一個平滑CLI . py運行和. sh文件沒有不必要的開銷如創建Apache火花™或磚的工作。
  2. 強大的起源從源代碼跟蹤模型的結果。
    →從GitHub提交運行一個腳本的能力沒有向下拉代碼或失去出處本地未提交的代碼。
  3. 本地靈活性原型,然後擴展到遠程集群
    →MLflow項目API允許用戶從本地到遠程執行切換——後台參數,它指向一個磚或kubernetes JSON集群配置為一次性創建操作。依賴關係處理代碼(Conda)而不是狀態(手動配置集群),確保再現性。

模型開發反映CI / CD模式
→我們重構實驗代碼部署之前,CI / CD管道調用訓練,測試和部署管道從模型開發遵循相同的模式,所以最小的“額外”的努力必須從原型實驗到生產。毫升模型構件(二進製文件,結果等)和部署狀態都集中到一個係統,簡化了調試的平滑起源跟蹤從生產流量和事件。

如何使用:

  1. 在本地運行本地代碼(沒有出處)mlflow運行。/火車
  2. 在本地運行遠程代碼(出處,但受本地計算)56 a5aas mlflow運行https://github.com/your-GH/your-repo火車——版本
  3. 一個集群上運行遠程代碼(出處+大規模計算)火車——配置gpu_cluster_type mlflow運行https://github.com/your-GH/your-repo。json - 56 a5aas版本

三個逐步包裝模型工件

我們的一個關鍵因素在開發不僅僅是productionizable模型模型類型(調整Pytorch-based Huggingface transformer模型),而且前/後處理步驟和使用的內部開發的Python庫前/後處理步驟。我們用的是一種嚴格的方法將整個模型管道視為一個可序列化的工件在MLflow工件存儲在沒有外部依賴訪問一個GitHub回購在部署時。我們使用scikit-learn管道API管道模型的實現中,這是最廣泛使用的Python庫毫升管道建設。這將打開門集成其他前/後處理步驟也scikit-learn管道API兼容。額外使用這個管道方法的優點包括防止數據泄漏和維護再現性。

采取這種方法導致三個逐步包裝模型構件:調整PyTorch變壓器模型實現scikit-learn baseEstimator和ClassifierMixin apiscikit-learn管道API兼容模型管道,包括額外的前/後處理步驟(我們稱為pre-score過濾和post-score過濾器)和管道模型隻使用本地捆綁Python庫沒有訪問任何Github回購(圖2)。注意,在pre-score過濾器,我們可以添加額外的步驟,如緩存(同樣的郵件,我們可以提供相同的預測)和過濾某些類型的消息(例如,繞過那些外部消息)功能。同樣,在post-score過濾步驟中,我們可以返回預測和額外的起源跟蹤的信息和詳細的得分概率模型版本的端點消費者應用程序使用。

Outreach.io’s approach to propensity model pipeline approach utilizes three progressively wrapped model artifacts

圖2:三個逐步包裝模式部署

擁抱自動化、CI / CD和監控

像任何其他軟件係統,最無聊,痛苦和容易出錯的部分是重複的機器學習係統的維護工作。持續集成和持續部署/交付(CI / CD)的目的是將自動化和扶手帶入一個工作流,從建築到部署。我們設計了兩個流(圖3);提供一個快速檢查輪為每一個承諾,將在30分鍾。其他準備,檢查和部署整個模型,這需要幾個小時。(注意:你可以看這個視頻為利用MLflow和磚的更多細節):

Outreach.iodesigned two CI/CD flows. One serves as a quick sanity check round for each pushed commit; the other prepares, checks, and deploys the entire model.

圖3:CI / CD流動

集成工具

作為一個SaaS公司,推廣有一個廣泛的選擇利用SaaS和開放源碼工具。雖然我們大部分的內部服務使用Ruby或語言,數據科學團隊選擇使用Python,MLflow對於大規模的工作運行。因此,有必要創建管道和集成所有這些工具幾乎從零開始。我們動態地生成conda MLflow磚集群的配置文件,把每一步努力同步運行構建流程。我們甚至編織CircleCI,集合在一起,讓他們互相觸發(此句在CD CircleCI流重用整個模型建立與不同的行為)。

要做到這些,我們利用大多數api從服務提供者的能力——從供應商由於優秀的文檔,開源的代碼從磚和來自內部和外部的支持團隊。有幾個陷阱,包括版本問題。不過,需要提醒您的是,我們選擇的所有工具最初沒有設計或測試一起工作。這是我們克服這些初始缺陷和提供反饋給供應商讓他們一起工作。

版本控製

無論您使用的編程語言,一大頭痛是依賴的複雜性。任何版本的變化深度依賴圖可以是一個危險的生產係統。CI / CD,我們掃描和凍結所有版本和包依賴二進製文件和模型到碼頭工人形象我們用於部署生產環境的變化。一旦部署的圖像,它不再是受外部依賴。我們在Amazon S3版本數據,通過構建模型在不同階段模型注冊由MLflow提供。

謹慎和階段性模型版本

正如你所看到的從我們的CI / CD流,我們添加了幾個欄杆步驟一起舉行環境部署。除了常規的flake8的風格檢查,單元測試和活性檢查,我們自動化和驗證的整個生命周期,從培訓到端點部署後測試每個提交的圖片(在不到半個小時)。完整的模型檢查(舞台環境除外),我們創建了一個pre-prod刺激金絲雀測試環境相同的資源和階段性發布目的(β推出新車型)。除此之外,我們還添加了一個回歸測試步驟對大型數據集進行徹底檢查(大約一小時負載和質量測試),以確保所有的質量和吞吐量變化將被捕獲在我們繼續進行之前,β或產品版本。

作為最後的防禦,我們還增加了人類檢查點對回歸測試結果或預生產結果確認促進變化超過自動閾值檢查。協助對現實世界的理解的影響變化,除了生產總體指標和利用MLflow並排比較,我們做了一個拋光可視化的混淆矩陣(圖4)從邏輯回歸測試,如MLflow主持形象工件協助比較和判斷細節(真陽性、假陽性、假陰性號碼和利率在每個標簽和軸與顏色強調)因為整體指標不告訴各個類別的危險,但做的錯誤類型。人類的檢查後可以解除我們從多個升級/迭代積累了足夠的經驗,這些數據點可以用於以後的自動化。

傳授的現實世界的影響變化,拓展。io拋光可視化的混淆矩陣,整體指標不完全溝通各個類別的危險或揭示了錯誤類型。

圖4:拋光可視化混淆矩陣的預測

優化和監控服務

在CI / CD生產健康服務隻是一個開始,但最優運行行為和持續健康監測是必不可少。優化明顯的情況下,重複的情況下,我們添加快捷方式和緩存層API來加速服務。我們最初SageMaker用於舉辦我們的端點,但我們發現指標相關模型性能和結果是最小的,所以我們轉而使用Kubernetes和集成與Datadog更深入的監控。這給我們帶來了很多好處,包括與其他內部團隊的親密盟友,安全、控製和節約成本。下麵是我們的Datadog儀表板,監視所有類型的預測趨勢隨著時間的推移,以及延遲百分位數。也很容易做一個在線預測比較新模型和一個舊的模型隻是一個屏幕上(例如,當我們把每個流量50%,他們應該是統計上相同的模型都是相同的)。正如你所看到的從儀表板的例子(圖5),內置的緩存能力發揮積極作用(服務延遲可能成為近0第二不時因為緩存)。

Datadog儀表板監測模型的服務端點

圖5:Datadog儀表板監測模型的服務端點

接下來是什麼

這個博客都集中在端到端釋放毫升生命周期的一部分我們的產品發布使用磚,MLflow, CircleCI,廣場和其他工具,包括Datadog和Kubernetes。然而,迭代訓練和離線實驗流也可以受益於額外的自動化。例如,標準化和初始培訓運行新的訓練數據是如何添加基於動態觸發新注釋的數據或用戶提供的反饋可以提高整個係統的效率和縮短上市時間的表現模式。更完整的質量監控內置與預設閾值控製釋放每個階段可能會進一步提高效率。

我們部署門仍然是手工,因為雖然我們目標閾值的關鍵指標釋放模型,我們還沒有將每個約束和邊界情況可能給我們暫停發布一個新的模式。有時小離線執行誤差分析提供所需的人類理解和信心之前釋放。

另一個方麵,我們沒有涉及到很多細節是注釋和反饋流程。雖然注釋提供了帶安全標簽的數據時所需的培訓和評估模型之前釋放,釋放模型的前端可以捕獲直接從應用程序的用戶反饋。我們這種反饋機製集成到用戶體驗,這樣user-corrected預測生產數據資產,可以納入培訓過程。這些標簽是特別有效的模型改進,因為他們推動模型改變其行為,而不是重複的簡單模式已經學習和預測正確。

最後,鑒於當前靈活地部署到亞馬遜SageMaker或當地Kubernetes集群托管服務,我們也開放模型擴展到其他類型的托管等服務TorchServ在未來。

對於一個更詳細的看,查看峰會會議主題博客的作者。

免費試著磚
看到所有工程的博客的帖子
Baidu
map