當前位置:
首頁 > 最新 > 阿里媽媽基於TensorFlow做了哪些深度優化?TensorFlowRS架構解析

阿里媽媽基於TensorFlow做了哪些深度優化?TensorFlowRS架構解析

一. 綜述

深度學習比傳統的邏輯回歸有著更強的模型刻畫能力,同時也帶來了計算力百倍提升的需求。相比圖像、語音、視頻等領域,搜索、廣告、推薦等場景有著獨特的場景特點: 樣本規模和特徵空間通常非常巨大,千億樣本、百億特徵並不罕見,同時存在大量的稀疏特徵作為Embedding輸入。這就要求我們針對此場景下的計算特點對深度學習框架進行設計和優化。

本文所闡述的工作由阿里媽媽基礎平台團隊與PAI團隊合作完成,我們基於TensorFlow在搜索、廣告、推薦場景下進行了深度的優化與增強,內部項目名稱為TensorFlowRS,主要的成果如下:

(1) 解決了原生TF水平擴展能力不足的問題。在我們的測試中,絕大多數搜索廣告模型的訓練性能提升在十倍以上,某些模型的極限性能最高可提升百倍。

(2) 支持完備的在線學習語義,模型變更實時寫出;稀疏特徵無需做連續ID化,可以直接使用原始特徵表徵進行訓練,大幅簡化了特徵工程的複雜度。

(3) 非同步訓練的梯度修正優化器(grad-compensation optimizer),有效減少了非同步大規模並發引起的訓練效果損失。

(4) 集成了高效的Graph Embedding、Memory Network、Cross Media等多種高級訓練模式。

(5) 模型可視化系統DeepInSight提供深度模型訓練的多維度可視化分析。

二. TensorFlowRS分散式架構

在使用TensorFlow的過程中我們發現TF作為一個分散式訓練系統有兩個主要的問題:

1. 水平擴展能力差:在大部分模型的性能測試中,我們發現隨著數據並行度的增加,單個worker的樣本處理QPS急劇下降。當worker數量增大到一定規模的時候,系統整體QPS不再有增長甚至有所下降。

2. 缺乏完備的分散式Failover機制:TF基於靜態拓撲配置來構建cluster,不支持動態組網,這就意味著當某個ps或者worker掛掉重啟之後,如果ip或者埠發生變化(例如機器crash),訓練將無法繼續。另外TF的checkpoint只包含server存儲的參數信息,不包含worker端的狀態,不是全局一致性的checkpoint,無法實現Exactly-Once等基本的Failover語義。

針對上述問題,TensorFlowRS採取的解決方案包括:

通過對接獨立參數伺服器提升水平擴展能力

在對TF做過細緻的profiling之後,我們發現TF原生的PS由於設計和實現方面的多種原因(grpc,lock,graph-engine),很難達良好的水平擴展能力。於是我們決定丟掉TF-PS的包袱,重新實現一個高性能的參數伺服器:PS-Plus。此外我們提供了完整的TF on PS-Plus方案,可以支持用戶在Native-PS和PS-Plus之間自由切換,並且完全兼容TensorFlow的Graph語義和所有API。用戶可以在深度網路代碼一行不改的情況下,將參數分布和運行在PS-Plus上,享受高性能的參數交換和良好的水平擴展能力。

重新設計Failover機制,支持動態組網和Exactly-Once的Failover

TensorFlowRS引入了worker state,在checkpoint中存儲了worker的狀態信息,worker重啟後,會從接著上次的進度繼續訓練。此外TensorFlowRS通過zk生成cluster配置,支持了動態組網的Failover。新的Failover機制可以保證任意角色掛掉的情況下,系統都能在分鐘級完成Failover,並且不多算和漏算數據

TensorFlowRS的整體架構如圖所示:

三. PS-Plus

PS-Plus相對於傳統的ParameterServer有如下特點:

(1)高性能:PS-Plus通過智能參數分配,零拷貝,seastar等多項技術,進一步提升了單台server的服務能力和系統整體的水平擴展能力。在實測中,在64core的機器上單個server能輕鬆用滿55+的核心,在dense場景下io能打滿雙25G網卡,系統整體在 1~4000 worker 的範圍內都具有近似線性的水平擴展能力

(2)高度靈活:PS-Plus擁有完善的UDF介面,用戶可使用SDK開發定製化的UDF插件,並且可以通過簡單的C++以及Python介面進行調用。

(3)完備的在線學習支持:PS-Plus支持非ID化特徵訓練,特徵動態增刪,以及模型增量實時導出等支撐在線學習的重要特性。

下面從中選取幾點做比較詳細的介紹:

1. 智能參數分配

參數分配策略(variable placement),決定了如何將一個參數切分並放置到不同的server上。placement策略的好壞在高並發的情況下對PS的整體性能有著重大的影響。傳統ParameterServer的placement方案是由系統預先實現幾種常見的placement演算法(比如平均切分+roundrobin),或者由用戶在創建參數的時候手工劃分,往往沒有綜合考慮全局的參數規模、Server的負載等。

PS-Plus實現了基於模擬退火演算法的啟發式參數分配策略,後續也在考慮實現基於運行時負載,動態rebalance的placement策略。PS-Plus的placement設計有如下優點:

綜合考慮了全局參數的shape信息,在cpu,內存,網路帶寬等限制條件下給出了近似最優的placement方案,避免了手工分配造成的不均勻、熱點等問題。

整個參數分配過程由系統內部自動完成,用戶無需配置即可獲得接近最優的性能,用戶無需了解PS底層實現的具體細節。

Partition由框架自動完成,在上層演算法代碼,如TF代碼中,不需要額外使用PartitionedVariable等機制,使用簡單方便。

2. 去ID化特徵支持

目前主流的深度學習框架都是以連續的內存來存儲訓練參數,通過偏移量(ID值)來定址到具體的權重。為了避免內存的浪費,需要對特徵做從0開始的連續ID化編碼,這一過程我們稱之為特徵ID化。特徵ID化是一個非常複雜的過程,尤其是當樣本和特徵數量非常龐大的時候,特徵ID化會佔用大量的時間和機器資源,給樣本構建帶來了很大的複雜度。

PS-Plus內部實現了一個定製化的hashmap,針對參數交換場景做了專門的優化,在支持特徵動態增刪的同時提供了超高的性能。通過hashmap,PS-Plus直接實現了對非ID特徵的支持,極大的簡化了樣本構建的複雜度。

對於Parameter Server架構,延遲是影響整體性能的重要原因。尤其是在模型複雜度不高的情況下,模型計算部分往往在10~100ms量級,那麼總體通信的延遲就成為一個關鍵因素。

在傳統的pipeline線程模型,高並發情況下中斷和線程上下文切換會導致很大的開銷,同時會引起大量的cache-line miss。此外,高頻的鎖競爭是帶來延遲的最主要原因之一,即便是各類SpinLock、讀寫鎖等優化也並不能有效消除這個問題。我們認為polling + run to completion是一個正確的選擇,並且設計了我們的整體通信層架構。在新的通信層中,我們使用了Seastar作為底層的框架。對於Server、Worker上的connection,都嚴格保證connection綁定到固定的線程,同時線程與CPU核心綁定。Request、response直接採用run to completion的方式在當前線程處理。整體架構如下圖所示:

在Seastar的基礎上,我們做了很多功能、性能的改進和優化,這裡做一些簡要的介紹。

外部線程交互隊列。我們借鑒Seastar核心之間的交互機制,提供了一個 M:N 無鎖生產者消費者隊列,用於外部線程與Seastar內部線程進行交互。相比傳統隊列性能有極大的提升。

寫請求順序調度。從外部線程poll到的寫請求,如果直接調用Seastar的寫介面,會導致寫buffer無法保證有序。我們通過隊列機制的改造,自動保證了寫順序,同時基本不損失多connection的並發寫的性能。

靈活的編解碼層。我們提供了一套編解碼層的抽象介面,方便用戶使用,從而不需要藉助protobuf等傳統的序列化、反序列化的第三方庫,同時也避免了protobuf的一些性能問題。

四.性能測試

我們測試了TensorFlowRS在Dense以及WDE(Wide-Deep-Embedding)兩種經典模型的性能指標:

1. 模型說明:

Dense

WDE

2. 測試結果:

3. WDE模型下Native-TF與TFRS水平擴展能力比較

五. 在線學習

以Ftrl為代表,在線學習近年來在工業界開始被大規模應用,它是工程與演算法的深入結合,賦予模型實時捕捉線上流量變化的能力,在一些對時效性要求很高的場景,有十分大的價值。

深度模型和LR模型一樣,對在線學習有著同樣強烈的需求,然而目前主流的深度學習框架都缺乏對在線學習的支持。TensorFlowRS通過對接PS-Plus,給出了一套完整的端到端的在線學習解決方案,賦予了TF支持千億規模非ID化特徵在線訓練的能力。

TFRS針對在線學習的場景做了專門設計和優化,具體包括:

1. 非ID化特徵支持

在在線學習的場景下做特徵實時ID化是比較複雜的,需要一個超高性能的全局的ID生成器,這給樣本生成帶來了很大的複雜度。TensorFlowRS利用PS-Plus直接實現了對非ID特徵的支持,極大的簡化了實時樣本構建的複雜度。

2. 特徵動態增刪

在在線訓練的場景下,訓練任務會以service的形式長期運行,在訓練過程中,不斷會有新特徵加入到模型中,為了保證訓練可以長期進行而不會因為新特徵的不斷加入導致OOM,PS-Plus在支持特徵動態添加的同時,還提供了默認的特徵刪除策略,可以將低頻或者低權重的特徵刪除掉,用戶還可以通過UDF定製符合自身業務需求的刪除策略

3. 模型增量實時導出

在線學習模型更新的常見方式有全量和增量兩種。在模型參數較多的情況下,全量更新的方式會對在線系統的帶寬頻來巨大的壓力,而降低更新頻率又會使模型的實效性降低。PS-Plus支持以任意頻率將模型增量部分實時寫出到消息隊列,在大幅減少網路IO的同時實現了真正意義上的模型實時更新。

4. AUC Decay

在在線學習的場景下,我們希望在訓練的過程中就可以儘快的發現模型本身的異常,而不是等模型更新到線上之後。因此我們需要有一些方法來評估模型在訓練過程中的 AUC等指標。TF里默認的streaming auc的實現在歷史數據累積了一定量的時候,無法及時反應當前模型的狀態,反饋有很大的滯後性。因此我們引入了新的AUC計算機制:AUC Decay。AUC Decay本質上是一種特殊的Moving Average,通過基於時間的減益方式,弱化歷史樣本和模型在當前AUC計算中的比重,以達到更快反應模型變化的目的

六. 大規模訓練場景下的收斂效果優化

1. 問題闡述

大數據模型引入了分散式並行訓練,同步並行訓練受長尾worker的制約,並發數容易受限。非同步並行是快速訓練的主流。非同步並行訓練打破了普通SGD訓練的串列性,計算的梯度與更新的模型不是嚴格一致,引入了梯度delay的問題。

具體來說,在基於ParameterServer的訓練框架里,系統分為兩個角色:worker和ps。ps的職責是模型的切塊存儲與更新;worker的職責是載入從ps端獲得最新的模型,讀取數據進行模型訓練,最後把學到梯度發送給ps,由ps更新模型。非同步並發訓練打破了普通SGD訓練的串列性,引入了梯度delay的問題。如圖所示,

拿到了模型,計算得到了梯度,可是最後回傳給ps時,卻是用在了ps上的模型上。因為在

計算梯度的同時,有另外r個worker向ps提交了梯度更新,ps上的模型已經向前走了r步。用模型計算得到的梯度,用在了模型上。雖然梯度更新的大方向可能偏差不大,但與模型期望的梯度相比,梯度是存在細微偏差的,因為梯度有些過時了。這是非同步訓練里梯度delay的由來。

2. 梯度補償

微軟在ICML2017提出過DC-ASGD optimizer,使用泰勒展開來近似梯度補償。我們測試在50並發以內收益良好。可是在上百並發訓練里,泰勒展開超過了近似收斂半徑,導致的誤差增大,效果下降。

應對上百並發的訓練,我們引入了與g的相關因子來boost主流的sgd-based optimizer。用與g的相關性來衡量梯度delay的嚴重程度。在每一維度上,如果與-g是正相關,說明大部分worker都在往同方向更新,模型w在這個方向上走的挺遠了,繼續前進需要謹慎,所以我們保持g的方向不變,但減少g的絕對值。與之相反,如果與-g是負相關,說明大部分worker都在往反方向更新,此時g是一個比較強烈的轉折信號,揭示了模型w的更新方向要發生變化,我們需要重視這個信號,所以我們保持g的方向不變,但增大了g的絕對值。

引入相關因子是依據如下分析前提的:

(1)非同步訓練時,存在隱式的梯度動量加速情況參見《Asynchrony begets Momentum, with an Application to Deep Learning》,並發越大,隱式動量越大,造成梯度往一個方向過度前進的情況。

(2)如果不是很老的w,相關因子是轉折信號,暗示模型在多個worker的動量累積推動下前進的有些過度了。

(3)存在著tradeoff,太老的w,信號準確率會下降,這時要控制(調小)係數lambda。

因為與g的相關性具備普適性,所以可以和主流的sgd-based optimizer結合,適應不同場景的不同優化器並發訓練需求。

3. 實驗結果

我們用相關性因子boost了SGD、Momentum、AdaGrad三種演算法,並在生產環境和公開數據集上做了實驗,實驗結果如下

WDE模型

Cifar10 Alexnet模型

八.高級訓練模式

TFRS中集成了多種高階訓練模式,例如Graph Embedding,Memory Network,Cross Media Training等。在本文我們會簡要的介紹一下,在以後的文章中做詳細的闡述。

Graph Embedding圖是一種表徵能力極強的數據結構,但是無法直接作為神經網路的輸入。TFRS支持樣本以圖的形式進行輸入,並支持多種隨機遊走演算法動態生成正負樣本。目前Graph Embedding已經應用在了搜索直通車的向量化召回等多個項目里,通過在User-Query-Item三種節點的異構有向圖中隨機遊走,生成深度神經網路能夠處理的稀疏特徵。最終學習出User,Query和Item三者的高維向量化的表示,用於線上廣告的向量化召回。值得一提的是,除了Graph Embedding,我們同樣支持對圖的結構進行學習,例如在訓練過程中反饋調整圖中的邊的權重等。

Memory Network記憶網路最早由Facebook在2015年提出,用於QA系統中。在本模型出現之前,機器學習的模型都缺乏可以讀取和寫入外部知識的組件。對很多任務來說,這是一個很強的限制。比如,給定一系列事實或故事,然後要求回答關於該主題的問題,雖然原則上這可以用RNN等模型進行處理,然而它們的記憶(隱藏狀態和權重編碼)通常太小,並且不能精確地記住過去的事實。在阿里媽媽搜索廣告場景下,我們使用記憶網路對用戶行為進行建模。

相比一般的在樣本組織階段進行記憶體生成的方式,TFRS通過在訓練過程中引入動態記憶存儲模塊,支持長短期記憶,大幅提高了序列化類行為數據的訓練效率。

九. 可視化模型分析系統DeepInsight

DeepInsight是一個深度學習可視化質量評估系統,支持訓練階段模型內部數據的全面透出與可視化分析,用以解決模型評估、分析、調試等一系列問題,提高深度模型的可解釋性。

下面我們通過一個過擬合的例子來說明DeepInsight在模型質量分析和問題定位方面發揮的作用:

上圖是通過DeepInsight生成的特徵權重分布,從圖中我們可以看到右側過擬合模型的邊權重大小分布很不均勻,出現了大量權重極大的邊,且集中在一條帶狀區域內,其為某一組特徵輸入所連接的所有邊,這表明模型過度擬合了該組特徵的信息。在使用正則項和dropout之後,過擬合的問題仍然沒解決,因此我們最終定位到問題出現在該組特徵的輸入上。

你可能還喜歡


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 阿里技術 的精彩文章:

阿里全面進軍IoT,語音將是人與IoT最自然的交互方式

TAG:阿里技術 |