0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Google GPipe為代表的流水線并行范式

jf_pmFSk4VX ? 來源:GiantPandaCV ? 2023-05-26 14:40 ? 次閱讀

在上一篇的介紹中,我們介紹了以Google GPipe為代表的流水線并行范式。當(dāng)模型太大,一塊GPU放不下時,流水線并行將模型的不同層放到不同的GPU上,通過切割mini-batch實(shí)現(xiàn)對訓(xùn)練數(shù)據(jù)的流水線處理,提升GPU計算通訊比。同時通過re-materialization機(jī)制降低顯存消耗。

但在實(shí)際應(yīng)用中,流水線并行并不特別流行,主要原因是模型能否均勻切割,影響了整體計算效率,這就需要算法工程師做手調(diào)。因此,今天我們來介紹一種應(yīng)用最廣泛,最易于理解的并行范式:數(shù)據(jù)并行。

數(shù)據(jù)并行的核心思想是:在各個GPU上都拷貝一份完整模型,各自吃一份數(shù)據(jù),算一份梯度,最后對梯度進(jìn)行累加來更新整體模型。理念不復(fù)雜,但到了大模型場景,巨大的存儲和GPU間的通訊量,就是系統(tǒng)設(shè)計要考慮的重點(diǎn)了。在本文中,我們將遞進(jìn)介紹三種主流數(shù)據(jù)并行的實(shí)現(xiàn)方式:

DP(Data Parallelism):最早的數(shù)據(jù)并行模式,一般采用參數(shù)服務(wù)器(Parameters Server)這一編程框架。實(shí)際中多用于單機(jī)多卡

DDP(Distributed Data Parallelism):分布式數(shù)據(jù)并行,采用Ring AllReduce的通訊方式,實(shí)際中多用于多機(jī)場景

ZeRO:零冗余優(yōu)化器。由微軟推出并應(yīng)用于其DeepSpeed框架中。嚴(yán)格來講ZeRO采用數(shù)據(jù)并行+張量并行的方式,旨在降低存儲。

本文將首先介紹DP和DDP,在下一篇文章里,介紹ZeRO。全文內(nèi)容如下:

1、數(shù)據(jù)并行(DP)

1.1 整體架構(gòu)

1.2 通訊瓶頸與梯度異步更

2、分布式數(shù)據(jù)并行(DDP)

2.1 圖解Ring-AllReduce

2.2 DP與DDP通訊分析

推薦閱讀: 圖解大模型訓(xùn)練之:流水線并行,以GPipe為例

一、數(shù)據(jù)并行(DP)

1.1 整體架構(gòu)

8c209392-fb83-11ed-90ce-dac502259ad0.png

一個經(jīng)典數(shù)據(jù)并行的過程如下:

若干塊計算GPU,如圖中GPU0~GPU2;1塊梯度收集GPU,如圖中AllReduce操作所在GPU。

在每塊計算GPU上都拷貝一份完整的模型參數(shù)。

把一份數(shù)據(jù)X(例如一個batch)均勻分給不同的計算GPU。

每塊計算GPU做一輪FWD和BWD后,算得一份梯度G。

每塊計算GPU將自己的梯度push給梯度收集GPU,做聚合操作。這里的聚合操作一般指梯度累加。當(dāng)然也支持用戶自定義。

梯度收集GPU聚合完畢后,計算GPU從它那pull下完整的梯度結(jié)果,用于更新模型參數(shù)W。更新完畢后,計算GPU上的模型參數(shù)依然保持一致。

聚合再下發(fā)梯度的操作,稱為AllReduce。

前文說過,實(shí)現(xiàn)DP的一種經(jīng)典編程框架叫“參數(shù)服務(wù)器”,在這個框架里,計算GPU稱為Worker,梯度聚合GPU稱為Server。在實(shí)際應(yīng)用中,為了盡量減少通訊量,一般可選擇一個Worker同時作為Server。比如可把梯度全發(fā)到GPU0上做聚合。需要再額外說明幾點(diǎn):

1個Worker或者Server下可以不止1塊GPU。

Server可以只做梯度聚合,也可以梯度聚合+全量參數(shù)更新一起做在參數(shù)服務(wù)器的語言體系下,DP的過程又可以被描述下圖:

8c2f5558-fb83-11ed-90ce-dac502259ad0.png

1.2 通訊瓶頸與梯度異步更新

DP的框架理解起來不難,但實(shí)戰(zhàn)中確有兩個主要問題:

存儲開銷大。每塊GPU上都存了一份完整的模型,造成冗余。關(guān)于這一點(diǎn)的優(yōu)化,我們將在后文ZeRO部分做講解。

通訊開銷大。Server需要和每一個Worker進(jìn)行梯度傳輸。當(dāng)Server和Worker不在一臺機(jī)器上時,Server的帶寬將會成為整個系統(tǒng)的計算效率瓶頸。

我們對通訊開銷再做詳細(xì)說明。如果將傳輸比作一條馬路,帶寬就是馬路的寬度,它決定每次并排行駛的數(shù)據(jù)量。例如帶寬是100G/s,但每秒?yún)s推給Server 1000G的數(shù)據(jù),消化肯定需要時間。那么當(dāng)Server在搬運(yùn)數(shù)據(jù),計算梯度的時候,Worker們在干嘛呢?當(dāng)然是在:

8c3a625e-fb83-11ed-90ce-dac502259ad0.png

人類老板不愿意了:“打工系統(tǒng)里不允許有串行存在的任務(wù)!”,于是梯度異步更新這一管理層略誕生了。

8c4dc95c-fb83-11ed-90ce-dac502259ad0.png

上圖刻畫了在梯度異步更新的場景下,某個Worker的計算順序?yàn)椋?/p>

在第10輪計算中,該Worker正常計算梯度,并向Server發(fā)送push&pull梯度請求。

但是,該Worker并不會實(shí)際等到把聚合梯度拿回來,更新完參數(shù)W后再做計算。而是直接拿舊的W,吃新的數(shù)據(jù),繼續(xù)第11輪的計算。這樣就保證在通訊的時間里,Worker也在馬不停蹄做計算,提升計算通訊比

當(dāng)然,異步也不能太過份。只計算梯度,不更新權(quán)重,那模型就無法收斂。圖中刻畫的是延遲為1的異步更新,也就是在開始第12輪對的計算時,必須保證W已經(jīng)用第10、11輪的梯度做完2次更新了。

參數(shù)服務(wù)器的框架下,延遲的步數(shù)也可以由用戶自己決定,下圖分別刻劃了幾種延遲情況:

8c542a9a-fb83-11ed-90ce-dac502259ad0.png

(a) 無延遲

(b) 延遲但不指定延遲步數(shù)。也即在迭代2時,用的可能是老權(quán)重,也可能是新權(quán)重,聽天由命。

(c) 延遲且指定延遲步數(shù)為1。例如做迭代3時,可以不拿回迭代2的梯度,但必須保證迭代0、1的梯度都已拿回且用于參數(shù)更新。

總結(jié)一下,異步很香,但對一個Worker來說,只是等于W不變,batch的數(shù)量增加了而已,在SGD下,會減慢模型的整體收斂速度。異步的整體思想是,比起讓W(xué)orker閑著,倒不如讓它多吃點(diǎn)數(shù)據(jù),雖然反饋延遲了,但只要它在干活在學(xué)習(xí)就行。

batch就像活,異步就像畫出去的餅,且往往不指定延遲步數(shù),每個Worker干越來越多的活,但模型卻沒收斂取效。讀懂分布式訓(xùn)練系統(tǒng)其實(shí)也不難。

二、分布式數(shù)據(jù)并行(DDP)

受通訊負(fù)載不均的影響,DP一般用于單機(jī)多卡場景。因此,DDP作為一種更通用的解決方案出現(xiàn)了,既能多機(jī),也能單機(jī)。DDP首先要解決的就是通訊問題:將Server上的通訊壓力均衡轉(zhuǎn)到各個Worker上。實(shí)現(xiàn)這一點(diǎn)后,可以進(jìn)一步去Server,留Worker。

前文我們說過,聚合梯度 + 下發(fā)梯度這一輪操作,稱為AllReduce。接下來我們介紹目前最通用的AllReduce方法:Ring-AllReduce。它由百度最先提出,非常有效地解決了數(shù)據(jù)并行中通訊負(fù)載不均的問題,使得DDP得以實(shí)現(xiàn)。

2.1 Ring-AllReduce

如下圖,假設(shè)有4塊GPU,每塊GPU上的數(shù)據(jù)也對應(yīng)被切成4份。AllReduce的最終目標(biāo),就是讓每塊GPU上的數(shù)據(jù)都變成箭頭右邊匯總的樣子。

8c5d6b00-fb83-11ed-90ce-dac502259ad0.png

Ring-ALLReduce則分兩大步驟實(shí)現(xiàn)該目標(biāo):Reduce-Scatter和All-Gather。

Reduce-Scatter

定義網(wǎng)絡(luò)拓?fù)潢P(guān)系,使得每個GPU只和其相鄰的兩塊GPU通訊。每次發(fā)送對應(yīng)位置的數(shù)據(jù)進(jìn)行累加。每一次累加更新都形成一個拓?fù)洵h(huán),因此被稱為Ring??吹竭@覺得困惑不要緊,我們用圖例把詳細(xì)步驟畫出來。

8c67afe8-fb83-11ed-90ce-dac502259ad0.png8c76b006-fb83-11ed-90ce-dac502259ad0.png

一次累加完畢后,藍(lán)色位置的數(shù)據(jù)塊被更新,被更新的數(shù)據(jù)塊將成為下一次更新的起點(diǎn),繼續(xù)做累加操作。

8c7dbb1c-fb83-11ed-90ce-dac502259ad0.png8c87a64a-fb83-11ed-90ce-dac502259ad0.png

3次更新之后,每塊GPU上都有一塊數(shù)據(jù)擁有了對應(yīng)位置完整的聚合(圖中紅色)。此時,Reduce-Scatter階段結(jié)束。進(jìn)入All-Gather階段。目標(biāo)是把紅色塊的數(shù)據(jù)廣播到其余GPU對應(yīng)的位置上。

All-Gather

如名字里Gather所述的一樣,這操作里依然按照“相鄰GPU對應(yīng)位置進(jìn)行通訊”的原則,但對應(yīng)位置數(shù)據(jù)不再做相加,而是直接替換。All-Gather以紅色塊作為起點(diǎn)。

8c918dc2-fb83-11ed-90ce-dac502259ad0.png8ca045ce-fb83-11ed-90ce-dac502259ad0.png

以此類推,同樣經(jīng)過3輪迭代后,使得每塊GPU上都匯總到了完整的數(shù)據(jù),變成如下形式:

8cac4126-fb83-11ed-90ce-dac502259ad0.png

建議讀者們手動推一次,加深理解(注:最后一圖箭頭畫錯,公眾號不許修改

2.2 Ring-AllReduce通訊量分析

假設(shè)模型參數(shù)W的大小為,GPU個數(shù)為。則梯度大小也為,每個梯度塊的大小為。

對單卡GPU來說:

Reduce-Scatter階段,通訊量為

All-Gather階段,通訊量為

總通訊量為,隨著N的增大,可以近似

而對前文的DP來說,它的Server承載的總通訊量也是。雖然通訊量相同,但搬運(yùn)相同數(shù)據(jù)量的時間卻不一定相同。DDP把通訊量均衡負(fù)載到了每一時刻的每個Worker上,而DP僅讓Server做勤勞的搬運(yùn)工。當(dāng)越來越多的GPU分布在距離較遠(yuǎn)的機(jī)器上時,DP的通訊時間是會增加的。

但這并不說明參數(shù)服務(wù)器不能打(有很多文章將參數(shù)服務(wù)器當(dāng)作old dinosaur來看)。事實(shí)上,參數(shù)服務(wù)器也提供了多Server方法,如下圖:

8cb45aaa-fb83-11ed-90ce-dac502259ad0.png

在多Server的模式下,進(jìn)一步,每個Server可以只負(fù)責(zé)維護(hù)和更新某一塊梯度(也可以某塊梯度+參數(shù)一起維護(hù)),此時雖然每個Server仍然需要和所有Worker通訊,但它的帶寬壓力會小非常多。經(jīng)過調(diào)整設(shè)計后,依然可以用來做DDP。雖然這篇文章是用遞進(jìn)式的方式來介紹兩者,但不代表兩者間一定要決出優(yōu)劣。我想表達(dá)的觀點(diǎn)是,方法是多樣性的。對參數(shù)服務(wù)器有興趣的朋友,可以閱讀參考的第1個鏈接。

最后,請大家記住Ring-AllReduce的方法,因?yàn)樵谥蟮腪eRO,Megatron-LM中,它將頻繁地出現(xiàn),是分布式訓(xùn)練系統(tǒng)中重要的算子。

三、總結(jié)

1、在DP中,每個GPU上都拷貝一份完整的模型,每個GPU上處理batch的一部分?jǐn)?shù)據(jù),所有GPU算出來的梯度進(jìn)行累加后,再傳回各GPU用于更新參數(shù)。

2、DP多采用參數(shù)服務(wù)器這一編程框架,一般由若個計算Worker和1個梯度聚合Server組成。Server與每個Worker通訊,Worker間并不通訊。因此Server承擔(dān)了系統(tǒng)所有的通訊壓力?;诖薉P常用于單機(jī)多卡場景。

3、異步梯度更新是提升計算通訊比的一種方法,延遲更新的步數(shù)大小決定了模型的收斂速度。

4、Ring-AllReduce通過定義網(wǎng)絡(luò)環(huán)拓?fù)涞姆绞?,將通訊壓力均衡地分到每個GPU上,使得跨機(jī)器的數(shù)據(jù)并行(DDP)得以高效實(shí)現(xiàn)。

5、DP和DDP的總通訊量相同,但因負(fù)載不均的原因,DP需要耗費(fèi)更多的時間搬運(yùn)數(shù)據(jù)。

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Google
    +關(guān)注

    關(guān)注

    5

    文章

    1754

    瀏覽量

    57374
  • gpu
    gpu
    +關(guān)注

    關(guān)注

    28

    文章

    4673

    瀏覽量

    128592
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3112

    瀏覽量

    48658

原文標(biāo)題:圖解大模型訓(xùn)練之:數(shù)據(jù)并行上篇(DP, DDP與ZeRO)

文章出處:【微信號:GiantPandaCV,微信公眾號:GiantPandaCV】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    FPGA中的流水線設(shè)計

    組合邏輯,假定每級延遲相同為 Tpd,1.無流水線的總延遲就是 2Tpd,可以在一個時鐘周期完成,但是時鐘周期受限制在 2Tpd;2.流水線:每一級加入寄存器(延遲 Tco)后,單級的延遲
    發(fā)表于 10-26 14:38

    基于流水線技術(shù)的并行高效FIR濾波器設(shè)計

    基于流水線技術(shù)的并行高效FIR濾波器設(shè)計 基于流水線技術(shù),利用FPGA進(jìn)行并行可重復(fù)配置高精度的FIR濾波器設(shè)計。使用VHDL可以很方便地改變?yōu)V波器的系數(shù)和階數(shù)。在DSP中采用
    發(fā)表于 03-28 15:12 ?804次閱讀
    基于<b class='flag-5'>流水線</b>技術(shù)的<b class='flag-5'>并行</b>高效FIR濾波器設(shè)計

    什么是流水線技術(shù)

    什么是流水線技術(shù) 流水線技術(shù)
    發(fā)表于 02-04 10:21 ?3911次閱讀

    CPU流水線的定義

    cpu流水線技術(shù)是一種將指令分解多步,并讓不同指令的各步操作重疊,從而實(shí)現(xiàn)幾條指令并行處理,以加速程序運(yùn)行過程的技術(shù)。
    發(fā)表于 12-14 15:29 ?4666次閱讀

    電鍍流水線的PLC控制

    電鍍流水線的PLC控制電鍍流水線的PLC控制電鍍流水線的PLC控制
    發(fā)表于 02-17 17:13 ?36次下載

    一種針對可重構(gòu)處理器流水線簡化編程的設(shè)計范式

    一種針對可重構(gòu)處理器流水線簡化編程的設(shè)計范式_周君宇
    發(fā)表于 01-07 21:39 ?0次下載

    Verilog基本功之:流水線設(shè)計Pipeline Design

    ,并暫存中間數(shù)據(jù)的方法。 目的是將一個大操作分解成若干的小操作,每一步小操作的時間較小,所以能提高頻率,各小操作能并行 執(zhí)行,所以能提高數(shù)據(jù)吞吐率(提高處理速度)。 二. 什么時候用流水線設(shè)計 使用流水線一般是時序比較緊張
    發(fā)表于 09-25 17:12 ?6059次閱讀

    FPGA之為什么要進(jìn)行流水線的設(shè)計

    流水線又稱為裝配線,一種工業(yè)上的生產(chǎn)方式,指每一個生產(chǎn)單位只專注處理某一個片段的工作。以提高工作效率及產(chǎn)量;按照流水線的輸送方式大體可以分為:皮帶流水裝配線、板鏈線、倍速鏈、插件線、網(wǎng)帶線、懸掛線及滾筒
    的頭像 發(fā)表于 11-28 07:04 ?3569次閱讀

    EE-383:基于MDMA的雙SHARC+并行流水線音頻直通

    EE-383:基于MDMA的雙SHARC+并行流水線音頻直通
    發(fā)表于 04-29 17:30 ?0次下載
    EE-383:基于MDMA的雙SHARC+<b class='flag-5'>并行</b><b class='flag-5'>流水線</b>音頻直通

    各種流水線特點(diǎn)及常見流水線設(shè)計方式

    按照流水線的輸送方式大體可以分為:皮帶流水裝配線、板鏈線、倍速鏈、插件線、網(wǎng)帶線、懸掛線及滾筒流水線這七類流水線
    的頭像 發(fā)表于 07-05 11:12 ?7197次閱讀
    各種<b class='flag-5'>流水線</b>特點(diǎn)及常見<b class='flag-5'>流水線</b>設(shè)計方式

    如何選擇合適的LED生產(chǎn)流水線輸送方式

    LED生產(chǎn)流水線輸送形式分為平面直線傳輸流水線、各種角度平面轉(zhuǎn)彎傳輸流水線、斜面上傳流水線、斜面下傳流水線這四種輸送方式,企業(yè)也是可以根據(jù)L
    發(fā)表于 08-06 11:53 ?996次閱讀

    嵌入式_流水線

    流水線一、定義流水線是指在程序執(zhí)行時多條指令重疊進(jìn)行操作的一種準(zhǔn)并行處理實(shí)現(xiàn)技術(shù)。各種部件同時處理是針對不同指令而言的,他們可同時多條指令的不同部分進(jìn)行工作。? 把一個重復(fù)的過程分解
    發(fā)表于 10-20 20:51 ?6次下載
    嵌入式_<b class='flag-5'>流水線</b>

    GTC 2023:深度學(xué)習(xí)之張星并行流水線并行

    張星并行流水線并行技術(shù)通常被描述模型并行,在開源社區(qū)中,最著名的兩個系統(tǒng)是NVIDIA的Megatron- M和Microsoft的De
    的頭像 發(fā)表于 03-23 17:21 ?1783次閱讀
    GTC 2023:深度學(xué)習(xí)之張星<b class='flag-5'>并行</b>和<b class='flag-5'>流水線</b><b class='flag-5'>并行</b>

    什么是流水線 Jenkins的流水線詳解

    jenkins 有 2 種流水線分為聲明式流水線與腳本化流水線,腳本化流水線是 jenkins 舊版本使用的流水線腳本,新版本 Jenkin
    發(fā)表于 05-17 16:57 ?1027次閱讀

    Gpipe作為流水線并行的范例進(jìn)行介紹

    和充沛優(yōu)質(zhì)的硬件資源 算法的迭代創(chuàng)新 在大模型訓(xùn)練這個系列里,我們將一起探索學(xué)習(xí)幾種經(jīng)典的分布式并行范式,包括 流水線并行(Pipeline Parallelism),數(shù)據(jù)
    的頭像 發(fā)表于 05-25 11:41 ?1036次閱讀
    以<b class='flag-5'>Gpipe</b>作為<b class='flag-5'>流水線</b><b class='flag-5'>并行</b>的范例進(jìn)行介紹