一文讀懂「Parameter Server」的分布式機器學習訓練原理

2021-02-08 王喆的機器學習筆記

這裡是 「王喆的機器學習筆記」 的第二十六篇文章。這篇文章我們繼續討論機器學習模型的分布式訓練問題。

上篇文章對Spark MLlib的並行訓練方法做了詳細的介紹(分布式機器學習之——Spark MLlib並行訓練原理),如文章所說,Spark採取了簡單直觀的數據並行的方法解決模型並行訓練的問題,但由於Spark的並行梯度下降方法是同步阻斷式的,且模型參數需通過全局廣播的形式發送到各節點,因此Spark的並行梯度下降是相對低效的。

為了解決相應的問題,2014年分布式可擴展的Parameter Server被 沐神 李沐 提出,幾乎完美的解決了機器模型的分布式訓練問題,時至今日,parameter server不僅被直接應用在各大公司的機器學習平臺上,而且也被集成在TensorFlow,MXNet等主流的深度框架中,作為機器學習分布式訓練最重要的解決方案。

第一部分我們首先聚焦PS進行分布式訓練的基本原理。這裡以通用的機器學習問題為例。

上式是一個通用的帶正則化項的損失函數,其中n是樣本總數,l(x,y,w)是計算單個樣本的損失函數,x是特徵向量,y是樣本label,w是模型參數。那麼模型的訓練目標就是使損失函數F(w)最小。為了求解arg (min F(w)),往往使用梯度下降的方法,那麼Parameter Server的主要目的就是分布式並行進行梯度下降的計算完成參數的更新與最終收斂。需要注意的是,由於公式中正則化項的存在需要匯總所有模型參數才能夠正確計算,因此較難進行模型參數的並行訓練,因此Parameter Server採取了和Spark MLlib一樣的數據並行訓練產生局部梯度,再匯總梯度更新參數權重的並行化訓練方案。

具體來講,圖1以偽碼方式列出了Parameter Server並行梯度下降的主要步驟:

可以看到Parameter Server由server節點和worker節點組成,其主要功能分別如下:

server節點的主要功能是保存模型參數、接受worker節點計算出的局部梯度、匯總計算全局梯度,並更新模型參數

worker節點的主要功能是各保存部分訓練數據,從server節點拉取最新的模型參數,根據訓練數據計算局部梯度,上傳給server節點。

在物理架構上,PS其實是和spark的master-worker的架構基本一致的,具體如圖2

可以看到,PS分為兩大部分:server group和多個worker group,另外resource manager負責總體的資源分配調度。

server group內部包含多個server node,每個server node負責維護一部分參數,server manager負責維護和分配server資源;

每個worker group對應一個application(即一個模型訓練任務),worker group之間,以及worker group內部的worker node互相之間並不通信,worker node只與server通信。

結合PS的物理架構,PS的並行訓練整體示意圖如圖3:

圖3結合圖2描述的並行梯度下降方法的偽碼以及圖2的PS物理架構,清晰的描述了PS的並行梯度下降流程,其中最關鍵的兩個操作就是push和pull:

push:worker節點利用本節點上的訓練數據,計算好局部梯度,上傳給server節點;

pull:為了進行下一輪的梯度計算,worker節點從server節點拉取最新的模型參數到本地。

1.每個worker載入一部分訓練數據

2.worker節點從server節點pull最新的全部模型參數

3.worker節點利用本節點數據計算梯度

4.worker節點將梯度push到server節點

5.server節點匯總梯度更新模型

6.goto step2 直到迭代次數上限或模型收斂

在上篇文章介紹spark的並行梯度下降原理時,曾經提到spark並行梯度下降效率較低的原因就是每個節點都需要等待其他所有節點的梯度都計算完後,master節點匯總梯度,計算好新的模型參數後,才能開始下一輪的梯度計算,我們稱這種方式為「同步阻斷式」的並行梯度下降過程。

同步阻斷式「的並行梯度下降雖然是嚴格意義上的一致性最強的梯度下降方法,因為其計算結果和串行計算的過程一直,但效率過低,各節點的waiting時間過長,有沒有辦法提高梯度下降的並行度呢?

PS採取的方法是用「異步非阻斷式」的梯度下降替代原來的同步式方法。圖4是一個worker節點多次迭代計算梯度的過程,可以看到節點在做第11次迭代(iter 11)計算時,第10次迭代後的push&pull過程並沒有結束,也就是說最新的模型權重參數還沒有被拉取到本地,該節點仍使用的是iter 10的權重參數計算的iter 11的梯度。這就是所謂的異步非阻斷式梯度下降方法,其他節點計算梯度的進度不會影響本節點的梯度計算。所有節點始終都在並行工作,不會被其他節點阻斷。

用下面轉載了兩個異步更新和同步更新的動畫,大家可以非常直觀的了解異步更新和同步更新的過程和區別。

當然,任何的技術方案都是取捨,異步梯度更新的方式雖然大幅加快了訓練速度,但帶來的是模型一致性的喪失,也就是說並行訓練的結果與原來的單點串行訓練的結果是不一致的,這樣的不一致會對模型收斂的速度造成一定影響。所以最終選取同步更新還是異步更新取決於不同模型對於一致性的敏感程度。這類似於一個模型超參數選取的問題,需要針對具體問題進行具體的驗證。

除此之外,在同步和異步之間,還可以通過一些「最大延遲」等參數來限制異步的程度。比如可以限定在三輪迭代之內,模型參數必須更新一次,那麼如果某worker節點計算了三輪梯度,該節點還未完成一次從server節點pull最新模型參數的過程,那麼該worker節點就必須停下等待pull操作的完成。這是同步和異步之間的折衷方法。


在PS論文的原文中也提供了異步和同步更新的效率對比,這裡可以作為參考(基於Sparse logistic regression模型訓練)。

SystemA和B都是同步更新梯度的系統,PS是異步更新的策略,可以看到PS的computing佔比遠高於同步更新策略

可以看到異步更新的PS的收斂速度也遠勝於同步更新的SystemA和B,這證明異步更新帶來的梯度不一致性的影響沒有想像中那麼大

導致Spark MLlib並行訓練效率低下的另一原因是每次迭代都需要master節點將模型權重參數的廣播發送到各worker節點。這導致兩個問題:


1.master節點作為一個瓶頸節點,受帶寬條件的制約,發送全部模型參數的效率不高;

2.同步地廣播發送所有權重參數,使系統整體的網絡負載非常大。

那麼PS是如何解決單點master效率低下的問題呢?從圖2的架構圖中可知,PS採用了server group內多server的架構,每個server主要負責一部分的模型參數。模型參數使用key value的形式,每個server負責一個key的range就可以了。

那麼另一個問題來了,每個server是如何決定自己負責哪部分key range呢?如果有新的server節點加入,又是如何在保證已有key range不發生大的變化的情況下加入新的節點呢?這兩個問題的答案涉及到一致性哈希(consistent hashing)的原理。

PS的server group中應用一致性哈希的原理大致有如下幾步:

1.將模型參數的key映射到一個環形的hash空間,比如有一個hash函數可以將任意key映射到0~(2^32)-1的hash空間內,我們只要讓(2^32)-1這個桶的下一個桶是0這個桶,那麼這個空間就變成了一個環形hash空間;

2.根據server節點的數量n,將環形hash空間等分成n*m個range,讓每個server間隔地分配m個hash range。這樣做的目的是保證一定的負載均衡性,避免hash值過於集中帶來的server負載不均;

3.在新加入一個server節點時,讓新加入的server節點找到hash環上的插入點,讓新的server負責插入點到下一個插入點之間的hash range,這樣做相當於把原來的某段hash range分成兩份,新的節點負責後半段,原來的節點負責前半段。這樣不會影響其他hash range的hash分配,自然不存在大量的rehash帶來的數據大混洗的問題。

4.刪除一個server節點時,移除該節點相關的插入點,讓臨近節點負責該節點的hash range。


PS server group中應用一致性哈希原理,其實非常有效的降低了原來單master節點帶來的瓶頸問題。比如現在某worker節點希望pull新的模型參數到本地,worker節點將發送不同的range pull到不同的server節點,server節點可以並行的發送自己負責的weight到worker節點。


此外,由於在處理梯度的過程中server節點之間也可以高效協同,某worker節點在計算好自己的梯度後,也只需要利用range push把梯度發送給一部分相關的server節點即可。當然,這一過程也與模型結構相關,需要跟模型本身的實現結合起來實現。總的來說,PS基於一致性哈希提供了range pull和range push的能力,讓模型並行訓練的實現更加靈活。

總結一下Parameter Server實現分布式機器學習模型訓練的要點:

1.用異步非阻斷式的分布式梯度下降策略替代同步阻斷式的梯度下降策略;

2.實現多server節點的架構,避免了單master節點帶來的帶寬瓶頸和內存瓶頸;

3.使用一致性哈希,range pull和range push等工程手段實現信息的最小傳遞,避免廣播操作帶來的全局性網絡阻塞和帶寬浪費。

但是大家要清楚的是,Parameter Server僅僅是一個管理並行訓練梯度的權重的平臺,並不涉及到具體的模型實現,因此PS往往是作為MXNet,TensorFlow的一個組件,要想具體實現一個機器學習模型,還需要依賴於通用的,綜合性的機器學習平臺。那麼下一篇文章,我們就來介紹一下以TensorFlow為代表的機器學習平臺的工作原理,特別是並行訓練的原理。

又到了大家能學到最多的問題時間,歡迎積極討論,分享業界經驗:

1.Parameter Server有哪些工程實現,大家在業界成功應用的Parameter Server的開源項目有哪些?

2.Parameter Server在離線訓練完成後,能否直接應用於線上inference,大家有沒有成功的經驗?

認為文章有價值的同學,歡迎關注我的 微信公眾號:王喆的機器學習筆記(wangzhenotes),跟蹤計算廣告、推薦系統等機器學習領域前沿。


想進一步交流的同學也可以通過公眾號加我的微信一同探討技術問題,謝謝

相關焦點

  • Hinton 新作「在線蒸餾」,提升深度學習分布式訓練表現的利器
    為此,「深度學習泰鬥」Geoffrey E.Hinton 近年來在知識蒸餾(或者「暗知識提取」)方面做了一系列工作,試圖通過這種從高計算能力要求、同時也具有高表現的模型中提取出一些隱含的知識,並且將其作為先驗,通過設計新的網絡結構和目標函數將這種知識「傳授」給規模較小的深度學習網絡,實現對網絡模型的壓縮,以顯著縮小的網絡規模和計算需求展現出儘量高的模型表現。
  • 橫向對比三大分布式機器學習平臺:Spark、PMLS、TensorFlow
    我與我的學生 Kuo Zhang 和 Salem Alqahtani 合作完成了這一工作。我們在 2016 年秋季完成了這篇論文,並且這篇論文還將出現在 ICCCN'17(溫哥華)會議上。機器學習(尤其是深度學習)最近已經在語音識別、圖像識別、自然語言處理和推薦/搜尋引擎等方面取得了變革性的成功。這些技術在自動駕駛汽車、數字醫療系統、CRM、廣告、物聯網等方面的應用非常有前途。
  • 業界 | 詳解Horovod:Uber開源的TensorFlow分布式深度學習框架
    參與:李澤南、路雪Horovod 是 Uber 開源的又一個深度學習工具,它的發展吸取了 Facebook「一小時訓練 ImageNet 論文」與百度 Ring Allreduce 的優點,可為用戶實現分布式訓練提供幫助。
  • 深度學習簡介,GPU計算的原理,分布式機器學習原理
    GPU並行計算的原理由於每臺伺服器有多個CPU,多個GPU,同時為了進一步提高並行機器學習效率,我們的目標是為了多臺伺服器(每臺伺服器包含多塊GPU卡)採取分布式計算的形式進行,那麼要完成目標,在硬體層面需要進行伺服器集群的構建,同時需要在深度學習框架層面也支持分布式
  • 每天應對千萬量級增長,掃一掃識物這樣快速迭代深度學習模型
    因此,如何能夠快速迭代優化深度學習模型,成為我們算法開發者亟須解決的問題。本文主要通過從分布式訓練方法的選擇、多機通信技術原理進行講解,基於Horovod的訓練框架在微信自研平臺Gemini上從無到有打通分布式訓練和實驗結果來介紹微信掃一掃識物中的深度學習模型分布式訓練。多機多卡相比較於單機多卡,使得模型訓練的上限進一步突破。
  • 一文讀懂元學習原理
    因此,很多研究者開始關注元學習(Meta-Learning)算法,它可以解決極少樣本情況下的模型訓練問題。這種新方法被認為是通向一般人工智慧的重要一步。本文是一篇元學習的原理掃盲博客,作者通過一個簡單的圖像分類案例,介紹了元學習背後的邏輯,感興趣的朋友可以通過這篇文章,從概念上理解元學習和傳統機器學習算法的不同。元學習是什麼?
  • 分布式深度學習最佳入門(踩坑)指南
    ParameterServerStrategy 在多臺機器上進行參數伺服器訓練,和MultiWorkerMirroredStrategy類似,可用於多機分布式訓練。改策略下,一些機器被指定作為工作節點,一些機器被指定為參數伺服器,模型的每個變量都會被放在參數伺服器上。
  • 淺顯易懂的分布式TensorFlow入門教程
    本文是一篇淺顯易懂的分布式TensorFlow入門教程,可以讓你對分布式TensorFlow的原理和使用有一定的了解。訓練操作在多個機器上被執行,這些機器被稱作worker。這些worker讀取不同的數據(data batches),計算梯度,並將更新操作發送給參數伺服器。
  • 新型分布式機器學習訓練加速方案RAT技術解讀
    作者:香港科技大學萬鑫晨、星雲Clustar策劃:infoQ 蔡芳芳本文將介紹一種在數據中心場景下的分布式機器學習訓練加速方案,該方案主要用於加速分布式訓練的參數交換過程。DNN 訓練任務可能需要數天或數周才能完成,為了縮短訓練時間,分布式機器學習系統被引入 DNN 訓練過程。因此,大量關於分布式機器學習(DML)系統加速訓練的研究和方法在學術界和工業界湧現。由於 DML 是計算密集型任務,之前大部分的研究主要集中在為集群計算資源設計高效的調度策略上。
  • 一圖勝千言: 解讀阿里的Deep Image CTR Model
    這等「小淺網絡」可以容納於單臺機器的內存中,不需要分布式存儲。 與每臺 worker 只需要與 server 同步本地所需要的部分 embedding 不同,MLP 是一個整體,每臺 worker 都需要與 server 同步完整 MLP 的全部參數,不會只同步局部模型。
  • 想入門機器學習?機器之心為你準備了一份中文資源合集
    如今 Python 如此流行的原因之一是其「原型設計速度」。在機器學習中,一種使用幾行代碼即可建模算法的語言絕對是必要的。微積分、線性代數、概率論在機器學習幾乎所有算法中不可或缺。如果你的數學背景很紮實,請跳過這一章節。如若不然,那麼重新溫習一下這些重要概念也不錯。考慮到理論的數量,我並不建議大家從大部頭開始。儘管一開始可以用它查詢具體概念,但是初學者先關注簡單的話題比較好。
  • 如何系統性地學習分布式系統?
    本文的緣起是回答知乎圓桌會議「分布式系統之美」的問題「如何系統性地學習分布式系統?」,後面稍微整理了一下,形成了這一篇文章(知乎 ID:kylin)。學習一個知識之前,我覺得比較好的方式是先理解它的來龍去脈:即這個知識產生的過程,它解決了什麼問題,它是怎麼樣解決的,還有它引入了哪些新的問題(沒有銀彈),這樣我們才能比較好的抓到它的脈絡和關鍵點,不會一開始就迷失在細節中。
  • 大腦也在用分布式強化學習?DeepMind新研究登上《Nature》
    這一發現驗證了分布式強化學習的潛力,同時也使得 DeepMind 的研究人員越發堅信,「現在的 AI 研究正走在正確的道路上」。多巴胺是人們所熟悉的大腦快樂信號。如果事情的進展好於預期,大腦釋放的多巴胺也會增多。在人腦中存在獎勵路徑,這些路徑控制我們對愉悅事件的反應,並通過釋放多巴胺的神經元進行介導。
  • 深度 | 生成對抗網絡初學入門:一文讀懂GAN的基本原理(附資源)
    在我第一次學習生成模型時,我就禁不住想:既然我們已經有如此多的真實訓練樣本了,為什麼還要麻煩地做這種事呢?答案很有說服力,這裡給出了幾個需要優秀生成模型的可能的應用:1. 模擬實驗的可能結果,降低成本,加速研究2. 使用預測出的未來狀態來規划行動——比如「知道」道路下一時刻狀況的 GAN3.
  • 聚焦快速機器學習訓練算法,UC伯克利尤洋189頁博士論文公布
    機器之心報導編輯:蛋醬、小舟這份 189 頁的博士學位論文,凝結了尤洋在快速機器學習訓練算法領域的研究心血。過去十年,深度學習應用領域的數據量迅速增長,使得深度神經網絡(DNN)的訓練時間拉長。而這已經成為機器學習開發者和研究者面臨的瓶頸問題。
  • TensorFlow分布式訓練MNIST分類器
    本節以分布式方式訓練完整的 MNIST 分類器。
  • 聯合廣場風投:分布式計算平臺優勢是「完整性 Integrity」,而非價格
    點擊播放 GIF 0.0M鏈聞在去年獲得授權刊發了聯合廣場風投Union Square Ventures的分析師 Dani Grant撰寫的「一文讀懂分布式計算現狀與未來」。她主要修正了去年一個判斷:她去年曾認為價格是分布式計算項目與中心化雲服務提供商競爭時最吸引人的賣點,但她現在認為,想要擊敗中心化的提供商,分布式計算平臺的核心競爭力應該是在為開發人員提供完整性Integrity方面。「提供完整性Integrity」確實是分布式系統不可替代的優勢。
  • 獨家 | 一文讀懂Adaboost
    本問集中在boosting的學習方式,通過具體的Adaboost算法向大家展示了集成學習的主要思想以及一些相關概念。Adaboost算法通過將分類能力比較弱的基礎分類器按照訓練出來的組合係數組合成強分類器,以實現良好的預測性能,在訓練的過程中不斷提高上次訓練錯誤分類樣本的權重,從而提升整體模型分類能力。在本文中我們利用簡單的例子編碼實現了Adaboost算法,說明了其實際工作的原理。
  • 分布式入門,怎樣用PyTorch實現多GPU分布式訓練
    這篇文章旨在闡述訓練大規模深度學習模型時的分布式計算思想。具體來講,本文首先介紹了分布式計算的基本概念,以及分布式計算如何用於深度學習。然後,列舉了配置處理分布式應用的環境的標準需求(硬體和軟體)。最後,為了提供親身實踐的經驗,本文從理論角度和實現的角度演示了一個用於訓練深度學習模型的分布式算法(同步隨機梯度下降,synchronous SGD)。
  • 這是一份「不正經」的深度學習簡述
    關於深度學習,我們能夠看到很多優秀的介紹、課程和博客,本文將列舉其中的精華部分,而且,你會發現這是一篇「不一樣」的文章。不一樣在哪兒呢?可能是本文沒有按照「正常」的深度學習博客結構:從數學講起,然後介紹論文、實現,最後講應用。我希望用講故事的方式來介紹深度學習,這可能要比只介紹信息和公式要更加平易近人一些。我為什麼要寫這篇深度學習簡介?