如何解決大規模機器學習的三大痛點?
摘要: 阿里巴巴電商平台有上億的用戶和產品,每天產生百億規模的用戶反饋數據。比如淘寶首頁的猜你喜歡場景,每天就有100億規模的用戶行為數據。如此超大規模的訓練數據,給分散式機器學習帶來了巨大的挑戰,也引入了有趣的研究問題。
2017年,阿里巴巴推薦演算法團隊和計算平台PAI團隊合作打造了eXtreme Parameter Sever (XPS) 機器學習平台,其中eXtreme寓意為「追求極致」, 體現我們希望設計具有極致性能和效果的機器學習平台的願景。XPS平台已經廣泛全流量運行在手機淘寶的猜你喜歡、生活研究所、飛豬旅行和天貓推薦等大數據場景。
2017年雙11購物狂歡節當天,小時級XNN模型在猜你喜歡和天貓推薦場景上線,穩定和快速地使用了用戶雙11的實時行為信息,顯著提升了雙11當天的收入和用戶價值。在性能上,XPS平台上的例行演算法,現在每天能輕鬆處理100億規模樣本1000億規模的特徵,演算法運行速度快,容錯能力強,資源利用率高。本文將對XPS平台的整體結構進行介紹,希望通過這些分享和大家交流我們在分散式演算法設計和框架優化上的經驗。
近年來,阿里巴巴個性化推薦和個性化搜索給用戶帶來了很好的體驗,用戶行為數量也隨之大幅增長。特別是移動終端的業務飛速發展,用戶和商品兩個維度都呈現爆髮式增長,用戶和產品狀態也隨時間持續動態變化。在這種動態的超大規模的數據體量下,打造高效的分散式機器學習平台,精準預測用戶對產品的點擊率和轉化率是非常有價值的,也是很有挑戰的。
規模龐大且高頻變化的特徵和樣本,給分散式機器學習平台的設計帶來的挑戰具體可以歸結為樣本、特徵和分散式規模三個方面:
- 在樣本方面,我們每天面對的是百億規模的訓練數據,累計六個月的歷史訓練數據就超過了萬億規模。顯然,傳統的全量多輪迭代的機器學習演算法已經不太適合這樣規模的訓練樣本,因為這類演算法需要消耗的計算資源極多,也無法很好地引入數據的時序性。
- 在特徵方面,大規模樣本下特徵總量輕易超過千億量級,傳統的特徵編號方法需要消耗極多的機器資源和耗費很長的計算時間來完成特徵編號,而且對新出現的特徵也難以及時進行編號。從資源消耗和時間消耗上看,特徵序列化編號方法已經是不可承受的步驟。此外,採用類似TensorFlow里通過string_to_hash_bucket的方法將特徵映射到固定範圍的做法,雖然保證固定了tensor的shape,減少了參數總量,但是在特徵總數巨大的時候則又引入了大量的哈希衝突,影響了演算法效果。
- 在分散式規模方面,大規模特徵下給Server的存儲和分散式計算性能帶來巨大壓力。舉例來說,1萬億個32位float浮點數就需要3.63TB的存儲空間,再加上需要保留的歷史梯度等,往往需要300到600台server才能使各個進程的內存佔用控制在一個合理範圍。Server數成倍增長,導致並行請求數也線性增長,給通信也帶來較大壓力。同時,存儲量以及單任務進程數的增長,也給集群調度、容錯、網路、IO帶來較大的壓力。
面對這些挑戰,XPS平台提出了很多創新的技術來應對,向「極限參數伺服器」的目標前進了一步:
- 在樣本處理問題上,我們採用流式學習演算法為主的演算法選型來解決大規模樣本問題。在流式學習下,對每一批新數據,直接在當前模型上進行增量訓練,併產出下一個模型,無需載入全量數據進行多輪全量學習。流式學習演算法選型,平衡了數據規模和資源消耗問題,更輕量級地應對了大規模樣本的問題;
- 在特徵處理問題上,採用了將特徵哈希映射為哈希值的方法替代特徵編號機制。在節省內存、提升性能的同時,支持了特徵的動態稀疏化正則機制和表示向量維度的動態擴張機制,解決了特徵總量過大的問題;
- 在分散式規模方面,通過非同步Checkpoint和Exactly Once Failover以及高性能的ArrayHashMap等機制,加上動態稀疏化正則機制等特徵處理技術,保證了分散式訓練的性能,提高了Server的存儲效率。
面對這些大規模下的機器學習問題,eXtreme Parameter Server在阿里巴巴內部應運而生,針對性地解決了大規模樣本和大規模特徵的挑戰,並得到了廣泛的應用。
XPS在阿里巴巴內部的猜你喜歡、天貓、購物鏈路、飛豬、生活研究所、阿里媽媽等業務場景廣泛應用,對用戶點擊率、線上收入提升、線上用戶價值提升效果顯著。
下面我們對XPS平台的系統結構和數據流程、分散式優化、核心演算法和運算元體系進行介紹。
一、系統結構和數據流程
1.1 系統結構
XPS平台整體結構如下圖所示。在數據源上,底層支持OSS File、MaxCompute離線存儲、流式數據源Streaming DataHub和Kafka等數據源。用戶在MaxCompute上同時完成離線數據處理和XPS演算法調用。集群調度使用了阿里集團的飛天集群調度,能夠有效避免資源搶佔,高效利用計算資源;在演算法層,XPS提供了XNN/XFTRL/XSVD/XGBOOST/FM等演算法;在業務層,我們支持了推薦、廣告和搜索等業務場景。
業務方通過MaxCompute中的SQL進行XPS平台的演算法調用,配置選擇需要的演算法和優化運算元,能夠快速地完成訓練任務的搭建。預估服務會來抓取XPS產出的模型,提供給線上做預估服務。XPS提供了完善的容錯機制,用戶任務失敗會自動被重新拉起訓練。
1.2 數據流程
目前,XPS平台在阿里巴巴內部建立了完善的數據流解決方案,我們與阿里集團各個團隊合作,形成了從訓練數據生產、特徵工程、模型訓練、模型評估、模型部署、模型打分的數據流程,XPS整體數據處理流程如下圖所示。
數據生產、特徵工程、模型訓練和模型評估階段,我們採用了阿里的MaxCompute離線存儲系統。平台上單個任務能夠輕鬆應對每天百億規模的訓練數據,千億特徵規模的特徵學習。通過支持大規模的特徵,能充分挖掘了數據中蘊含的數據規律。模型訓練採用流式調度,在流式調度學習下,每次學習只需要載入之前存儲的模型,輸入新樣本進行訓練產出新模型,部署到線上進行預估。整體上,相比全量計算,流式學習節約了大量計算資源。
在預估服務端,我們採用阿里內部的rtp-xps服務,我們將模型轉化為tf格式,採用tf-serving來做預估服務。在模型評估方面,我們基於rtp-xps和MaxCompute研發了自己的一致性測試方案和工具,結合tf-serving可以實現快速的特徵和模型一致性測試。在特徵工程上,我們在開發XPS的過程中,開發了一套高性能的SessionServer服務,SessionServer提取了用戶一段時間的前文行為數據,這些數據更好地幫助我們理解用戶,也捕捉了用戶的實時行為特性。
二、分散式優化
為了能夠支持千億規模特徵、萬億規模樣本,我們針對分散式機器學習場景下的非同步通信做了專門優化。XPS框架自主研發了高性能的通信框架,在分散式機器學習場景下的非同步通信場景下較傳統的MPI通信性能提升1~2倍。通過這些優化手段,XPS的Server數能夠橫向擴展至800個,完成千億特徵萬億參數規模的機器學習任務。分散式優化技術具體包括下面幾個方面:
2.1 特徵哈希化
XPS框架支持直接輸入哈希散列計算後的特徵ID,或者對輸入的字元串特徵自動計算哈希值。這樣整個計算過程和輸出模型均只保存哈希值。我們與在線inference服務打通,輸入樣本、輸出模型以及訓練迭代、通信都能直接哈希散列特徵ID,在實際線上的模型訓練中,節省了一半的內存,並且性能也提升了1倍。
2.2 動態特徵擴縮容
在流式學習場景,一個顯著的特點是快速變化的動態特徵。每時每刻都有新的特徵加入,也有老的特徵被刪除,在引入實時的自動化會話特徵之後,在較短時間內會有千億量級的特徵插入和刪除。在這種情形下,需要底層框架能夠支持高頻、動態的特徵增刪和通信。XPS框架針對高頻增刪特徵場景做了專門的優化,重新設計實現了XPS-ArrayHashMap,採用realloc/mremap方式手工管理內存,插入、刪除KV的性能顯著高於std::unordered_map、google::DenseMap等哈希表實現;更為重要的是,XPS-ArrayHashMap支持直接零拷貝通信,消除了序列化、反序列化步驟。
2.3 全局Checkpoint和Exactly Once Failover
萬億參數的總存儲空間可以達到10TB級別。在這個量級的存儲空間需求下,使用400-800個server是很常見的需求。而大量的server進程和worker進程給分散式參數伺服器帶來很高的穩定性和擴展性壓力。針對這種場景,XPS框架支持了多Worker並行載入、輸出模型,非同步Checkpoint和非同步Failover等機制,對節點失效能夠零感知自動化恢復。
不同於獨立的HPC集群,阿里集團的飛天集群在並行節點數量很大時,遇到個別節點故障的概率是比較高的。XPS框架支持完善的Failover功能,在各類流式數據源和離線數據源上,都支持Exactly Once的Failover,能夠將數據流和模型都恢復到節點失敗的前一刻,從而做到節點重啟後不丟數據和不重複計算。
2.4 高並發通信
XPS框架自主研發了高性能的通信框架,在分散式機器學習場景下的非同步通信場景下較傳統的MPI通信性能提升1~2倍。針對大規模的特徵場景,XPS的通信層對稀疏矩陣能夠支持零拷貝收發,並通過稀疏層、稠密層分別合併通信,減少通信包數量並降低了通信延遲。通過這些優化手段,使得XPS的Server數能夠橫向擴展至800個,從而能夠支持在訓練過程中存儲千億特徵,萬億參數的規模。
2.5 表示學習優化
學習稀疏特徵的表示向量對稀疏特徵的計算和通信優化是最重要的,我們對稀疏哈希特徵下的Embedding矩陣計算進行了深度優化,極致地優化表示向量學習中的性能。具體地,通過Pull通信操作得到的表示向量組雖然表示一個稀疏矩陣,但全部表示向量在一個連續的緩衝區中,用這段通信buffer數據可直接構造ArrayHashMap,不需要內存拷貝。通過這樣的哈希表實現的稀疏特徵索引介面,計算時能夠以O(1)時間複雜度訪問到通信傳過來的各稀疏特徵的表示向量,這樣,稀疏表示向量組無須轉換成稠密格式也能被高效地使用,消除了創建中間稠密矩陣的開銷,大幅加快了minibatch的Embedding矩陣計算。
三、核心演算法
大規模的訓練樣本,全量多輪迭代演算法即使優化得再高效,也無法避免每天需要重新訓練全量數據的問題,顯然這已經不適合大數據的發展。流式學習演算法選型,能夠平衡了數據規模和資源消耗問題,輕鬆應對了大規模樣本的學習問題。以流式學習演算法為核心的分散式機器學習平台,在演算法調參、演算法評估、演算法監控等各方面都有很多有趣的優化內容。
XPS旨在設計超大規模數據場景下高效的流式學習演算法平台,我們當前主要設計了線性演算法XFTRL、雙線性演算法XSVD和深度學習演算法XNN。
3.1 XFTRL演算法
XFTRL演算法是對經典線性演算法FTRL的擴展,是為了解決大規模數據下FTRL的一些缺點而提出的。我們在使用FTRL演算法的時候,遇到了很多數值問題和穩定性問題,為了解決這些問題,我們設計了幾個優化點:
第一,引入正則防止奇異權重。在實踐中,我們發現FTRL演算法在運行中容易發生權重突然陡增的現象,通過在FTRL中引入變數z的二正則,可以有效抑制權重突然過大的現象;
第二,引入權重版本控制和梯度平均讓更新更平滑。我們在更新梯度時,引入了Pull權重和Push梯度時的權重版本差打折機制,來減輕分散式下的梯度更新時worker和server的權重不一致的問題。我們進一步對minibatch下Server端的梯度和做平均,讓模型權重更新過程更加平滑;
第三, 引入流式學習下的參數衰減機制。我們對FTRL演算法中的w, z和n等變數在每次更新完之後,乘以一個衰減係數,讓整個模型權重偏向最新數據,更好地捕獲數據的時效性。
3.2 XSVD演算法
XSVD演算法是針對電商系統中「用戶」、「產品」和「歷史行為產品」三個核心元素,通過改進SVD++提出的演算法。SVD++是推薦領域經典的演算法,但我們很少看到大規模數據場景下的解決方案。我們的核心動機是解決SVD++演算法在萬億樣本下的可學習性問題。在流式學習的演算法設計基調下,我們需要將SVD演算法改造為流式場景下可學習的模式。很容易想到,對SVD++中的反饋產品隱向量累加項,只取當前行為的前K次行為作為反饋項,就可以實現流式學習。其次,為了讓XSVD演算法也具有LR演算法的表達能力,我們也將用戶,產品和會話特徵也作為普通的特徵,和隱向量一起做聯合學習。此外,為了豐富XSVD的表達能力,我們還在XSVD中引入阿里內部的SLRM演算法的「模型特徵化」的轉化思想,通過將SLIM演算法中需要學習的產品序對關係映射為學習產品序對的特徵權重的方式在XSVD中引入了SLIM思想。
3.3 XNN演算法
XNN演算法是我們提出的深度學習演算法,其結構圖如下圖所示。XNN主要包含了輸入層(InputLayer)、轉化層(TransformLayer)、乘積激活層(MultiActiveLayer)和輸出層(OutputLayer)。
XNN網路的InputLayer對輸入的離散特徵、組合特徵和連續特徵進行處理,每個one-hot編碼的特徵會進行short和long編碼,然後按照特徵組進行累加(reduce_sum)操作。TransformLayer對輸入層InputLayer進行各種歸一化變化然後推送給MultiActiveLayer,MultiActiveLayer進行逐層的矩陣連乘和激活操作,最後頂層被Sigmoid激活運算元作用後輸出。XNN的輸入數據按照特徵組來組織,以降低在做reduce_sum時cache miss的代價。矩陣操作混合使用Eigen矩陣庫和CBlas矩陣庫,平衡數據介面的簡潔性和計算的高效性。
相比經典的深度學習演算法,它主要有以下優點:
- 動態特徵稀疏化正則。我們根據每個特徵f的動態效用值Utlity(f)實現特徵的動態增加和動態刪除, 當Utility(f)大於一定閾值時創建特徵並學習特徵權重,小於一定閾值時擦除特徵並刪除特徵權重。動態特徵的設計思想有效控制了可學習的特徵總量;
- 動態表達維度擴張。我們根據每個特徵f的動態信息量Infomation(f),給不同特徵賦予不同的隱向量維度,對重要特徵進行高維壓縮,不重要的特徵進行低維壓縮,提高特徵價值,提升內存使用效率。
- 自動化會話特徵建模。我們在模型中自動統計長期、中期和短期的會話特徵,把會話特徵加入神經網路進行特徵統計值和隱表達的聯合學習,自動化會話特徵思想將在運算元設計中詳細介紹。
- 分頻次正則。我們對不同頻次的特徵採用不同的正則係數,以避免局部過擬合,最大化測試準度。在性能方面,猜你喜歡場景累計的全量數據,包含了千億規模的特徵和萬億規模的樣本,單個樣本平均一百個特徵,在5600核16TB內存的資源開銷下(和MR任務混部的普通CPU集群),XNN演算法可以在7小時內完成每天增量的百億規模的流式樣本的學習。
XFTRL、XSVD和XNN演算法是XPS平台比較獨特的新演算法,XPS平台還支持以下經典演算法: XGBOOST、Factorization Machine、OWL-QN、Word2Vector等。未來,我們會不斷擴展XPS的演算法集,提出更多的創新演算法。我們還將進一步研究流式學習下更多的工程特性,比如去中心化設計、慢機的智能化處理和通信層機制優化,建立更加完善的流式學習機器學習平台機制。
四、運算元體系
在開發XPS的過程中,我們抽象了一些通用的演算法思想,逐步形成了XPS的運算元體系。使用XPS平台的演算法用戶設計一個新演算法的時候,設計完演算法之後,只需要選擇系統中的運算元進行搭配,就可以完成演算法開發。運算元體系的設計,不僅加速了演算法構建過程,提升了演算法開發、調試的效率,同時還增強演算法的表達能力。我們主要設計了下面的運算元:
4.1 流式評估運算元
針對XPS的流式訓練數據,我們設計了流式評估框架,極大地加速了我們的調參工作,有效地幫助我們進行模型正確性效驗。流式測試運算元具體思想也十分簡單,每經過M個Batch的訓練,我們就對未來的N個Batch的數據做一次評估,並觀察預估數據上的AUC, MAE, RMSE, 最大權值和最小權重等指標,同時密切關注預估準度PCOPC(Predict Click Over Post Click)。這樣的評估機制,極大地提升了參數調試的效率。同時,在訓練結束時,這些指標也反應出模型的質量,訓練框架會檢查這些參數,只有它們達到一定的正確性標準,才產出模型給預估服務模塊進行模型部署。
4.2 自動化會話特徵運算元
在點擊率預估和轉化率預估場景,用戶在最近一段時間內的會話特徵的重要性是很高的。一般的系統中,用於提供會話特徵的SessionServer能提供的只是一定維度的統計。我們提出了Automatic Session這種「特徵模型化」的設計思想。具體而言,模型一邊進行數據訓練,一邊統計每個特徵在一定的時間內的曝光和點擊,然後計算每個特徵在不同周期的點擊率,加入到訓練特徵中其他特徵一起訓練。Automatic Session的加入,極大地豐富了我們的特徵體系。我們提供了長中短三個衰減係數項,用戶可以在任何XPS演算法中通過配置這三個衰減係數引入自動化會話特徵運算元,增強模型本身的表達能力。
4.3 梯度平均運算元
頻率過低的特徵的學習容易造成模型權重過度分散而引入過擬合,頻率過高的特徵因為局部過度更新也容易過擬合。Server端每次更新權重的時候,會根據特徵頻次對梯度做不同方式的打折。
4.4 非同步更新控制運算元
非同步更新控制運算元根據Pull模型權重和Push梯度時模型權重的版本差做梯度打折,防止了非同步更新的效率損失。版本差低的梯度更新值置信度更高,版本差高的梯度更新值置信度更低。
除了以上運算元而外,XPS裡面還有激活函數選擇運算元,正則選擇運算元,變數衰減運算元和安全性檢查運算元。
對於XPS的演算法開發用戶,我們在提供高效的分散式擴展性的基礎上,還抽象了一套面向演算法開發者的SDK,對用戶屏蔽了複雜的分散式調度、通信和同步、非同步等底層細節。演算法開發用戶只需要考慮演算法總體流程、Worker上計算梯度的邏輯以及Server上更新模型的邏輯,選擇演算法運算元體現中的運算元,就可以開發出千億特徵的演算法。一個XPS新演算法的構建過程,一般會包含下面9個步驟:
- 完成新演算法Worker端梯度計算代碼;
- 選擇加入自動化會話特徵,以豐富特徵體系;
- 加入流式測試運算元,方便快速調參和模型監控;
- 選擇梯度平均函數保持更新的平滑性;
- 選擇非同步更新控制運算元的版本差控制函數類型;
- 通過激活函數選擇運算元來選擇激活函數;
- 通過正則選擇運算元來選擇正則方法;
- 選擇變數衰減值,激活變數衰減運算元,進行變數的流式衰減;
- 選擇安全性檢查運算元對梯度值、更新值和模型最大最小值進行安全性檢查和安全性控制。
通過XPS的運算元抽象設計,演算法開發用戶對演算法的優化運算元有了更多靈活性的選擇。在這種方式下,用戶可以集中精力進行演算法創新性研究,而忽略不必關心的技術細節。在阿里集團中,XPS平台已經幫助用戶研發了SLRM新演算法,其他新演算法也在研究之中。
經過大量的實踐,eXtreme Parameter Server平台已經成為阿里集團解決超大規模樣本和特徵學習問題的新一代分散式機器學習系統。2017年,XPS被廣泛應用到阿里集團的搜索,廣告和推薦等場景,演算法開發用戶數量也在快速增長。2018年,我們將在XPS中建設圖像和NLP演算法;我們也正在完善TensorFlow編程模式,將支持用戶使用python編程接入TensorFlow,方便用戶能快速地編寫自己的模型,並且調用高效的XPS的Sever功能;我們還在整合強化學習演算法框架和引入阿里基礎特徵服務系統AliBasicFeatureServer。
高速發展的阿里集團,未來將會遇到更多的大數據研究問題,這些問題很挑戰,也很迷人。XPS將會在極限化參數伺服器的設計理念下堅定前行。XPS演算法負責人范朝盛和工程負責人陳緒表示: eXtreme Parameter Sever的目標是設計追求極致性能和效果的分散式參數伺服器,我們走出了一步,未來還有很長的路要走,我們將努力用AI技術改變我們的生活。
原文發布時間為:2017-12-14
本文作者:阿里XPS團隊
本文來自雲棲社區合作夥伴「阿里技術」
原文
更多技術乾貨敬請關注云棲社區知乎機構號:阿里云云棲社區 - 知乎
推薦閱讀: