天天看點

如何解決大規模機器學習的三大痛點?

如何解決大規模機器學習的三大痛點?

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團隊

繼續閱讀