[譯] 解密 Uber 的仿真平臺最佳實踐

概述

clipboard.png

在 Uber,咱們運用策略算法來鏈接司機和乘客。算法在全球上線以前, 爲了最優化用戶體驗, Uber 須要徹底測試和評估算法效果。git

使產品測試更安全、更容易,Uber 創建了一個仿真平臺,用來仿真司機和騎手在真實世界中的場景。利用一個基於離散事件的模擬器,該平臺容許工程師和數據科學家快速地構建原型,而且在無風險環境下,測試新的特徵和猜測。github

模擬器利用歷史數據來執行兩個重要的仿真組件:Marketplace 服務和用戶行爲模型。算法

  1. Marketplace 服務利用該平臺來進行調度決策。
  2. 用戶行爲模型使用仿真內容來決定騎手和司機的決定,好比 撤單和導航選擇。

爲了讓模型部署和訓練更容易和準確,Uber 仿真平臺團隊構建了用於無縫集成模型訓練、模型服務的機器學習框架。出於對準確性和真實性的要求,ML 在用戶行爲預測中扮演着關鍵先生的角色。 實際上,大多數用戶行爲的仿真都是基於模型匿名化訓練的歷史聚合結果。仿真也回過頭來反哺 ML 模型的開發和改進。這一切使得新模型在上線以前,能在仿真平臺快速迭代。數據庫

咱們團隊設計了一個 ML 模型訓練框架來幫助用戶在仿真平臺上快速構建和部署模型。segmentfault

仿真平臺機器學習框架

在仿真平臺中,機器學習處於一系列重要功能迭代的核心地位。在介紹ML框架以前,模型開發、訓練和部署一般面臨臨時、難以複用的問題。好比,ML開發者在模擬器中直接實現ML模型而且在模擬器運行時訓練模型。後端

一次性的快餐式方案隨着多模型多版本的部署立刻變得愈來愈複雜。模擬器很難爲不一樣模型訓練維護大量內存和CPU資源。在這些場景中,爲每一個模型從頭至尾自定義訓練和服務代碼是不現實的。安全

仿真團隊着手爲ML訓練和服務構建一個單1、高效、可複用框架。該框架提供一系列開源和自研組件。它分爲四個層次:微信

  • 包含 Python API 和模塊的ML庫
  • 自動化訓練的管道來訓練模型而且以二進制形式存儲
  • 管理模型元數據的後端服務
  • 在模擬器中能夠加載模型的中心化模塊

在仿真 ML 框架訓練的工做流中,引入 Python ML 庫,獲取並處理原始數據,基於歷史時間序列數據自動訓練模型。一旦管道完成訓練,它發送元數據到仿真數據庫而且記錄檢查點,而後保存二進制文件到本地。以後,仿真後端服務啓動模擬器,模擬器中的模型實例化過程會調用Python ML庫和本地的檢查點。框架

圖一和圖二 展現了一個機器學習框架的訓練和服務工做流:機器學習

clipboard.png

圖一 自動化訓練管道(中)使用Spark(上)從Hive獲取原始數據,同時仿真機器學習模型(左)保存數據到存儲服務(右)和仿真數據庫(下)中.

clipboard.png

圖二 建立一個仿真程序,首先要發起仿真服務請求 (左上).而後,它會取到後端服務的模型元信息做爲輸入到數據庫。數據庫接着從存儲服務中恢復檢查點到本地磁盤。這些檢查點包含了模擬器中的仿真機器學習模型(中上) 。

在這個框架中,咱們將訓練和服務工做流解耦。這個改變爲須要持續改進模型的模型開發者提供了靈活性。在這個系統中,若是開發者想要改變用戶行爲模式,惟一須要作的就是更新機器學習模型的實現。框架會自動觸發訓練的流程,而後在全部模擬器中分發最新的模型。

經過去掉在仿真中的模型訓練工做任務,咱們簡化了複雜的仿真器,顯著提高了內存和CPU的使用效率。這個改變也提高了模擬器的吞吐量。總之,一系列的簡化節省了硬件資源,提高了系統效率。

仿真平臺團隊使用這個框架以一個標準化的方式來集成許多用戶行爲和其餘機器學習模型到仿真平臺。

供給活動模型如何改善市場模擬

正如最近關於共享出行仿真的研究代表,司機活動是仿真精度和真實度的主要因素。在 Uber 的市場模擬平臺中,實驗性算法帶來與實際相左的匹配結果致使司機活動和真實的歷史數據的表現不一樣。好比,司機在仿真中可能匹配到他們在現實中差別很大的乘客。在這個狀況下,模擬器不能簡單地用歷史數據來模擬路徑,距離以及下車地點。爲了亡羊補牢,咱們知道須要創建一個可以精確刻畫司機活動行爲的模型。在合適的活動模型下,能夠改進乘客行爲模型(好比乘客取消訂單模型),減小匹配和訂價算法中的噪聲,爲市場規則保駕護航。

準確仿真每個司機活動是一個充滿挑戰的事情,由於仿真世界基於有限的歷史數據,也缺少影響用戶行爲的諸多因子,好比交通訊息,天氣,地理數據等。

幸運的是,對於市場仿真算法,單個司機活動不能顯著影響算法結果。這些算法主要受到聚合後的司機分佈而不是單個的司機動做的影響,尤爲是在司乘匹配和訂價算法上。處於這個緣由,與其作到完美的個體仿真,不如關注模型如何可以精確仿真司機行爲的分佈。

爲了在仿真世界中實現這一目標,咱們將線上司機行爲分爲兩階段,如圖三所示,在 Uber 市場中更好地預測了用戶需求:

clipboard.png

圖三 司機活動混合模型由司機請求仿真行動開始到一系列打"是/否"的分支選擇後到達終點,最後發送司機信息給路徑規劃引擎,預估行駛速度,模擬司機在路徑上的移動行爲。

咱們實現了一個基於規則模型的在線司機。當一個仿真司機接單,模型開始規劃路線並讓司機沿着路線到預約地點。

仿真離線司機分佈是更苦難的。像前面提到的,仿真世界很難精確復現歷史司機行爲。出於此,咱們使用機器學習模型配合歷史數據來預測聚合後的離線司機活動。使用線上算法,模型仿真的空閒司機分佈與歷史數據是儘量的接近了。咱們訓練了一個基於樹的隨機模型來完成離線司機分佈模擬。見圖4,5,6,以下展現了模型如何運轉:

clipboard.png

圖四 咱們的隨機模型是一個決策樹結構,以 "是否爲高峯期司機"做爲第一個判斷條件開始,通過一系列 ifelse 判斷到達葉子節點。

如圖四所示,當仿真想要預測離線司機分佈,系統經過待服務司機的信息(地點、時間等)獲取樹模型的相關葉子節點。葉子節點包含了用於預測司機將來行爲的轉移矩陣。在仿真平臺上,咱們用自研開源的六邊形分層空間索引 H3 將地球表面的空間劃分爲一致的地理單元。經過一致地理單元劃分,咱們定義了轉移矩陣,如圖五:

clipboard.png

圖五 機率表(三行三列,表示地球上不一樣網格之間的轉移機率)

轉移矩陣中的值描述了給定當前司機,從網格Y到網格X的轉移機率。

經過此類轉移矩陣,仿真能夠預測司機最可能移動到哪個網格。以後,仿真隨機選擇一個終點。圖六,展現了這個過程:

clipboard.png

圖六 流程圖從葉子節點開始,這裏用一個地圖來解釋仿真平臺如何經過轉移機率矩陣獲取精密地獲取司機的移動行動。 這就是用來預測司機終點的決策樹隨機模型。

一旦模擬器預測了司機的終點,它還會預估路線和速度,而後移動司機到終點。當司機去他們的目的地時,一個在在線和離線司機的關鍵區別就是司機是否改變他們的狀態(打樣或者被調配)。

使用司機行爲混合模型,仿真平臺精確地獲取了司機在真實世界中的近似分佈。咱們對比了算法實際的效果差別。圖七,顯示高峯期的分佈對比:

clipboard.png

圖七 左側高亮區域是Ground Truth, 右側未仿真結果。因爲精度很高,因此從地圖上看很是一致。

參考資料

原文做者: Haoyang Chen, Wei Wang 譯者: Harry Zhu 英文原文地址:
https://eng.uber.com/simulate...

做爲分享主義者(sharism),本人全部互聯網發佈的圖文均聽從CC版權,轉載請保留做者信息並註明做者 Harry Zhu 的 FinanceR專欄:https://segmentfault.com/blog...,若是涉及源代碼請註明GitHub地址:https://github.com/harryprince。微信號: harryzhustudio商業使用請聯繫做者。

相關文章
相關標籤/搜索