基礎設施設計實時機器學習推理
這是一個客戶撰寫文章,陳昱,高級軟件工程師,頂部空間。
頂部空間的核心產品iOS、Android和基於web的應用程序集中在改善其用戶的健康和幸福通過念力、冥想、睡眠、鍛煉和重點內容。機器學習(ML)模型是我們用戶體驗的核心,提供建議,用戶參與新的相關,個性化內容,建立一致的習慣在他們一生的旅程。
數據喂毫升模型往往是最有價值的時候可以立即用於做出決定的時刻,但是,傳統上,消費者數據攝入,改變,堅持和坐長時間休眠的時間機器學習和數據分析團隊利用它。
找到一個方法來利用用戶數據來生成實時的洞察力和決策意味著麵向消費者的產品頂部空間的應用可以大大縮短的端到端用戶反饋循環:操作用戶執行時刻之前可以被納入產品產生更多相關,個性化和特定於上下文的內容為用戶推薦。
這意味著我們毫升模型可以將動態特性,更新用戶的天,甚至一個會話。這些功能的示例包括:
- 當前會話反彈率對睡眠的內容
- 最近的語義映射進行用戶搜索詞。例如,如果一個用戶最近搜索“準備大考”,毫升模型可以將更多的重量分配給Focus-themed冥想符合這一目標。
- 用戶的生物特征數據(例如,如果一步計數和心率增加在過去10分鍾,我們可以推薦或鍛煉內容)
考慮到用戶體驗,頂部空間機器學習團隊架構解決方案,將基礎設施係統分解為多個模塊化的出版、接收器,編製和服務層。該方法利用Apache火花™、結構化流在磚上,AWS SQS,λ和Sagemaker為我們的ML模型交付實時推理能力。
在這篇文章中,我們提供一個技術深入地了解我們的架構。描述我們的實時推理的要求後,我們討論挑戰適應傳統的離線毫升工作流來滿足我們的需求。然後我們在討論細節之前給一個架構概述關鍵的建築組件。
實時推理需求
為了方便實時推理來使用戶的個性化內容推薦,我們需要
- 攝取、處理和轉發在相關事件(操作),我們的用戶對我們的客戶執行應用程序(iOS、Android、web)
- 快速的計算、存儲和獲取在線功能(毫秒延遲),使用的豐富功能集實時推理模型
- 服務和重載的實時推理模型的方式同步服務模型與功能網店同時最小化和理想情況下避免任何停機時間。
我們大概的端到端延時的目標(從用戶事件轉發到運動流實時推理預測可用)30秒。
挑戰傳統ML模式適應工作流
上麵的需求問題,往往不是解決(不需要解決)與離線模型服務日常批處理的預測。毫升模型中得出推論記錄和轉換從一個英語教學/ ETL數據管道通常交貨期的多個小時原始事件數據。傳統上,一個毫升模型的訓練和服務流程將涉及以下步驟,通過周期性的執行工作,每隔幾小時或每天運行:
- 把相關原始數據從上遊數據存儲:頂部空間,這涉及到使用火花SQL查詢從上遊數據湖由我們的數據維護工程團隊。
- 實時推理:我們經曆了成千上萬的預測每秒請求,所以使用SQL查詢從後端數據庫介紹不可接受的延遲。在模型訓練需要完整的數據集,實時推理往往涉及小,個人用戶子集片相同的數據。因此,我們使用AWS Sagemaker在線功能組,它能夠抓取和寫作個人用戶特性以個位數的毫秒響應時間(步驟3在圖)。
- 執行數據預處理(工程特性、特征提取等)使用的SQL和Python。
- 實時推理:益智火花結構化流micro-batches生事件數據的實時特性從Sagemaker特性存儲組。
- 火車模型和對數相關實驗指標:MLflow,我們注冊模型,然後記錄他們的表現在不同的實驗從磚內筆記本接口。
- 模型保存到磁盤:當MLflow日誌模式,它序列化模型使用毫升庫的原生格式。例如,scikit-learn模型序列化使用泡菜圖書館。
- 作出預測的相關推論數據集:在本例中,我們使用我們的新培訓的推薦模型來生成新內容的建議為我們的用戶基礎。
- 持續的預測為用戶服務。這取決於生產的訪問模式向最終用戶交付毫升預測。
- 實時推理:我們可以注冊預測預報服務,這樣最終用戶導航到ML-powered標簽可以下拉的預測。或者,我們可以預測到另一個SQS隊列,將通過推動iOS和Android通知發送內容的建議。
- 編製:傳統batch-inference模型利用氣流等工具來安排和協調不同階段/步驟。
- 實時推理:我們使用輕量級Lambda函數解包/包適當的消息格式的數據,調用實際Sagemaker端點和執行任何所需的後處理和持久性。
內部用戶生成事件通過執行動作的頂部空間應用程序——這些都是最終轉發到我們的運動流被火花加工結構化流。用戶應用程序獲取實時預測通過RESTful HTTP請求我們的後端服務,傳遞他們的用戶id和功能標記顯示哪種類型的ML發回的建議。架構的其他組件將在後麵將更詳細地描述。
出版和服務層:模型訓練和部署生命周期
毫升模型開發的磚筆記本和評估通過MLflow核心離線實驗指標等記得在k推薦係統。頂部空間毫升團隊寫了包裝類,擴展了基本的Python函數模型MLflow風味類:
#這個MLflow上下文管理器允許實驗運行(參數和指標)進行跟蹤和容易可查詢與MLModel.mlflow.start_run ()作為運行:#數據轉換和特性預處理代碼省略(樣板式代碼)…#模型建設lr = ElasticNet(α=α,l1_ratio = l1_ratio random_state =42)#培訓lr。fit (train_x train_y)#評估模型的性能predicted_qualities = lr.predict (test_x)(rmse,梅,r2) = eval_metrics (test_y predicted_qualities)#包裝我們自定義包裝器類的模型模型= ScikitLearnModel (lr)model.log_params (…)model.log_metrics (…)#記錄的結果在ML跟蹤服務器運行#選擇保存模型構件對象存儲和寄存器模型(給它一個語義版本)#所以可以內置Sagemaker-servable碼頭工人的形象model.save(注冊=真正的)
頂部空間毫升團隊的模型包裝類調用MLflow的save_model方法執行的實現邏輯,創建一個目錄在我們毫升模型包含元數據,S3 bucket依賴關係和模型工件需要構建一個MLflow模型碼頭工人形象:
我們可以創建一個正式的Github釋放指向模型我們隻是保存在S3。這可以由CI / CD CircleCI等工具,測試和構建MLflow模型最終推到AWS ECR的圖像,他們在哪裏部署到端點Sagemaker模型。
實時更新和重新加載模型
我們經常重新培訓我們的模型,但是更新實時推理模型在生產是很棘手的。AWS有多種部署模式(逐步推出,金絲雀,等等),我們可以利用更新的實際服役Sagemaker模型。然而,實時模型也需要同步特性網店,,鑒於頂部空間的用戶規模,需要30分鍾完全更新。鑒於我們不希望停機時間每次我們更新我們的模型圖片,我們需要小心,以確保同步特性存儲與我們的模型圖像。
舉個例子,一個模型,將頂部空間的用戶ID映射到一個用戶ID序列作為協同過濾模型的一部分——我們的特色商店必須包含最更新的用戶ID映射序列ID。除非用戶群保持完全靜態的,如果我們隻更新模beplay娱乐ios型中,我們的用戶ID將被映射到失效序列ID在推理時,導致模型為一個隨機生成一個預測用戶而不是目標用戶。
藍綠色的架構
為了解決這個問題,我們可以采用一種藍綠色架構,遵循從藍綠色的DevOps實踐部署。工作流如下說明:
- 保持兩個平行的基礎設施(兩份特色商店,在這種情況下)。
- 指定一個作為生產環境(我們稱之為“綠色”環境,開始)和路由請求的特性和預測朝它通過我們λ。
- 每次我們想更新我們的模型,我們使用一個批處理/腳本更新配套基礎設施(“藍色”環境)的最新功能。這次更新完成後,開關指向藍色生產環境的λ特性/預測。
- 重複這個每次我們想更新模型(及其相應的功能存儲)。
接收者層:事件流攝入與Apache火花結構化流媒體調度工作
頂部空間用戶事件動作(登錄到應用程序,扮演一個特定的內容,更新訂閱,尋找內容,等等)是聚合和轉發到運動數據流(步驟1的圖)。我們利用火花結構化流框架上的磚從這些運動消耗的流。有幾個好處結構化流,包括:
- 利用相同的統一的語言(Python / Scala)和框架(Apache火花)共享數據科學家,工程師和分析師的數據,允許多個頂部空間團隊推斷用戶數據使用熟悉的數據集/ DataFrame api和抽象。
- 讓我們的團隊實現自定義micro-batching邏輯以滿足業務需求。例如,我們可能會引發和定義micro-batches基於自定義事件時間窗口和會話水印邏輯在每個用戶的基礎上。
- 現有的磚基礎設施的工具顯著降低基礎設施政府負擔毫升工程師。這些工具包括預定工作,自動重試、高效DBU信用定價,郵件通知過程失敗事件,內置火花流儀表板和快速自動擴展的能力以滿足用戶應用程序事件活動的高峰。
結構化流使用micro-batching連續的事件流分解成離散塊,處理傳入的事件在小micro-batch dataframes。
流數據管道必須區分事件時間(在事件實際發生時在客戶端設備)和處理時間(當被服務器)的數據。網絡分區、客戶端緩衝和一大堆其他問題可以引入非平凡的差異這兩個時間戳。結構化流API允許簡單的定製的邏輯來處理這些差異:
df.withWatermark (“eventTime”,“十分鍾”)\.groupBy (“標識”,窗口(“eventTime”,“十分鍾”,“5分鍾”))
我們配置結構化流工作以下參數:
- 1最大並發運行
- 無限的重試
- 新的計劃工作集群(而不是一個通用的集群)
使用安排工作的集群顯著減少計算DBU成本同時也減輕相關基礎設施故障的可能性。工作運行在一個錯誤的集群——也許與失蹤/不正確的依賴關係,實例配置文件或重載的可用性區域————失敗直到底層集群問題是固定的,但分離工作跨集群防止幹擾。
然後我們點流查詢閱讀來自亞馬遜專門配置的運動流聚合用戶客戶端事件(步驟2的圖)。流的查詢可以使用以下配置邏輯:
處理器=RealTimeInferenceProcessor ()查詢=df。writeStream \.option (“checkpointLocation”、“dbfs: / / pathToYourCheckpoint”) \.foreachBatch processor.process_batch \.outputMode \(“追加”)。開始()
在這裏,outputMode定義了數據是如何的政策寫入到流水槽和可以承擔三個值:附加,完成和更新。因為我們的結構化流工作涉及處理傳入的事件,我們隻選擇附加過程“新”行。
是一個好主意來配置一個檢查點位置優雅地重啟流查詢失敗,允許“回放”前回升處理失敗。
根據不同的業務用例,我們也可以選擇減少延遲通過設置參數processingTime = " 0秒”,每個micro-batch盡快:
查詢=df。writeStream \.option (“checkpointLocation”、“dbfs: / / pathToYourCheckpoint”) \.foreachBatch process_batch \.outputMode \(“追加”)。觸發(processingTime=“0秒”)\。開始()
此外,我們的火花結構化流媒體集群假定一個特殊的工作EC2實例配置文件與適當的我政策與AWS Sagemaker功能組SQS隊列和消息放置到我們預測工作。
最終,由於每個結構化流工作包含了不同的業務邏輯,我們需要實現不同micro-batch每micro-batch處理函數將被調用一次。
在我們的例子中,我們實現了一個process_batch方法首先計算/在線更新功能AWS Sagemaker特色商店,然後將用戶事件轉發到工作隊列(步驟3):
從pyspark.sql.dataframe進口DataFrame作為SparkFrame類RealTimeInferenceProcessor(處理器):def__init__(自我):自我。feature_store = initialize_feature_store ()defprocess_batch(自我,df: SparkFrame epochID:str)- - - >沒有一個:”“”具體實現的查詢的微流批處理邏輯。參數:df (SparkFrame): micro-batch火花DataFrame過程。epochID (str):批處理一個標識符。”“”self.feature_store compute_online_features (df)
forward_micro_batch_to_job_queue (df)
編排層:解耦變壓器事件隊列和λ為特征
頂部空間下遊用戶生成的事件實時推理模型使用新鮮的建議。然而,用戶事件活動體積不是均勻分布的。有各種各樣的高峰和低穀,我們的用戶往往在一天中的特定時間內最活躍的。
消息放入到SQS預測作業隊列處理通過AWS Lambda函數(步驟4的圖),執行以下步驟:
- 打開消息並獲取相應的在線和離線功能的用戶我們想要推薦(步驟5的圖)。例如,我們可能會增加事件的時間/基於會話的功能與屬性,如用戶終身職位級別,性別和語言環境。
- 最終預處理執行任何業務邏輯。一個例子是頂部空間的用戶id映射到用戶id序列可用的協同過濾模型。beplay娱乐ios
- 選擇適當的服務Sagemaker模型和調用它的輸入特性(步驟6的圖)。
- 沿著建議轉發給下遊目的地(步驟7在圖)。實際位置取決於我們是否希望用戶下拉內容建議或推動建議用戶:
拉:這種方法涉及堅持最後的推薦內容我們內部預測服務,負責最終為用戶提供更新的個性化內容的頂部空間應用的許多選項卡在客戶機應用程序請求。下麵是一個示例實驗使用實時推理基礎設施,允許用戶獲取個性化的推薦應用的今天選項卡:
推動:該方法包括將推薦到另一個SQS隊列推送通知或應用內模態內容建議。看到下麵的圖片(上圖)的例子,應用內模態推動建議引發睡眠最近從用戶搜索內容和iOS(下圖)推送式通知從最近用戶內容完成:
在幾分鍾內完成一個特定的冥想或執行一個搜索,這些推送通知可以提供一個相關的內容在上下文仍為用戶的思想。
此外,利用這個事件隊列允許預測工作請求重試——一個小窗口可見性超時值(10 - 15秒)SQS隊列可以設置,如果預測工作不是時間窗口內完成,另一個Lambda函數調用重試。
總結
從基礎設施和體係結構的角度來看,學習的關鍵優先設計靈活的傳球給隊友分不同服務——在我們的例子中,出版,接收器,協調器,服務層。例如,
- 格式應該我們的結構化流工作的消息有效負載發送到預測SQS隊列使用?
- 什麼是模型中的簽名和HTTP POST載荷,每個Sagemaker模型預計?
- 我們如何同步模型圖像和特征網店,這樣我們可以安全可靠地更新重新訓練模型一旦在生產嗎?
積極解決這些問題將幫助分離各種組件的複雜毫升建築成更小的、模塊化的基礎設施。
頂部空間毫升團隊仍在推出生產用例的基礎設施,但最初的A / B測試和實驗內容看到強大的電梯開始利率,內容完成率和直接/總推開率相對於其他頂部空間計劃和行業基準。
通過利用模型能夠實時推理,頂部空間大大降低了用戶操作之間的端到端前置時間和個性化內容推薦。最近的事件流——搜索、內容/退出/暫停,開始應用內導航操作,甚至生物特征數據——在當前會話都可以利用不斷更新的建議我們向用戶提供服務的同時他們仍與頂部空間交互的應用程序。
學習更多的關於磚機的學習,聽數據+人工智能峰會2021主題演講優秀的概述,和找到更多的資源磚毫升的主頁。
了解更多關於頂部空間www.headspace.com。