亞洲資本網(wǎng) > 資訊 > 賽事 > 正文
「萬字干貨」深度對(duì)話Quentin Anthony:GPU不足,如何優(yōu)雅地訓(xùn)練大模型?
2023-08-19 23:40:16來源: 華爾街見聞

在初創(chuàng)公司甚至VC都在瘋狂囤積GPU的狂熱年代,干一件事比囤GPU更有價(jià)值——搞明白如何高效地使用它們。

在NLP模型訓(xùn)練中,存在著很多不透明的“隱性知識(shí)”,如果你沒在谷歌、微軟、Meta等頭部大廠干過,那你基本不大可能搞清楚其中的門道。

直到Eleuther AI的出現(xiàn)。


(相關(guān)資料圖)

四月,Eleuther AI團(tuán)隊(duì)發(fā)布博文《Transformers Math 101》,介紹如何運(yùn)用簡(jiǎn)單算式估計(jì)大模型的算力成本,大大消除了該領(lǐng)域的信息不對(duì)稱,在圈內(nèi)圈外廣泛傳播,成為該領(lǐng)域最具權(quán)威性的博文之一。公式如下:

C = τT?≈?6PD

其中:C表示Transformer需要的計(jì)算量,單位是FLOP;P表示Transformer模型包含的參數(shù)量;D表示訓(xùn)練數(shù)據(jù)規(guī)模,以Token數(shù)量為單位;τ表示吞吐量,單位為FLOP 表示訓(xùn)練時(shí)間;

該公式的原理如下:

C=Cforward+Cbackward:表示訓(xùn)練過程中的前后向傳播;?Cforward?≈?2PD:前向傳播計(jì)算成本約等于兩倍的參數(shù)量乘以數(shù)據(jù)規(guī)模;Cbackrward?≈?4PD:反向傳播計(jì)算成本約等于四倍的參數(shù)量乘以數(shù)據(jù)規(guī)模;

C是一個(gè)量化計(jì)算成本的單位,通常用FLOP表示,亦可用一些新的單位來表示,如FLOP/s-s:表示每秒浮點(diǎn)運(yùn)算數(shù)/秒;PetaFLOP/s-days:表示實(shí)際情況下每秒浮點(diǎn)運(yùn)算數(shù)/天。

8月17日,Eleuther AI首席工程師、《Transformers Math 101》的主要作者Quentin Anthony博士,同風(fēng)險(xiǎn)投資公司Decibel Partners 的合伙人兼首席技術(shù)官Alessio、Latent Space主理人Swyx進(jìn)行了一場(chǎng)深度交流,

雙方圍繞Transformer模型算力評(píng)估、混合精度訓(xùn)練、3D并行、INT8量化、分布式挑戰(zhàn)等NLP前沿話題展開了深度討論,文章干貨很足,相信對(duì)想了解Transformer成本、大模型優(yōu)化技術(shù)等方面的朋友一定大有裨益。

以下為全文內(nèi)容,大家enjoy~???

(由ChatGPT翻譯,經(jīng)略微修改)

目錄:

●?發(fā)文動(dòng)機(jī)

●?GPU并非越多越好

●?估計(jì)GPT-3訓(xùn)練的計(jì)算量

●?AMD GPU:可用,但效率不高

●?模型精度(FP32、FP16、BF16等)對(duì)內(nèi)存的影響

●?深度學(xué)習(xí)模型量化的好處

●?如何計(jì)算優(yōu)化器的內(nèi)存使用

●?訓(xùn)練內(nèi)存的各個(gè)組成部分

● 并行訓(xùn)練

●?高級(jí)3D并行技術(shù)

●?異構(gòu)集群分布的挑戰(zhàn)

01 發(fā)文動(dòng)機(jī)

Quentin:

聊到撰寫《Transformer Math 101》一文的動(dòng)機(jī),就不得不提到我經(jīng)常會(huì)在深度學(xué)習(xí)訓(xùn)練領(lǐng)域看到一些推特帖子,比如Hugging Face的Stas Bekman,他會(huì)發(fā)布一些推文,說什么他們剛剛發(fā)現(xiàn)了一個(gè)神奇數(shù)字,一切都變得快了20%等等。

他們非常興奮,但實(shí)際上并不真正了解發(fā)生了什么。對(duì)我們來說,我們經(jīng)常發(fā)現(xiàn)很多人可能了解AI訓(xùn)練或推理的理論或基本原理,但沒有人真正了解像在自己的機(jī)器上如何正確運(yùn)行分布在兩個(gè)GPU上的推理之類的細(xì)節(jié)。

而我們,在Eleuther內(nèi)部積累了很多筆記,并在工程師之間共享,我們認(rèn)為,這可能會(huì)幫助很多其他人。

這可能不適合寫論文,但對(duì)于博客文章或技術(shù)報(bào)告來說,這可能確實(shí)能夠從已有的硬件中擠出更多性能。

因此,我們?cè)贓leuther有很多經(jīng)驗(yàn),我們?cè)噲D以一種大公司們不會(huì)采取的方式將其與人們分享。

Swyx:

是的,這是很少有人會(huì)真正干的事情。首先,寫下來需要額外的工作。其次,這是一種商業(yè)機(jī)密,因此很少有人這樣做。

因此,通常了解這些內(nèi)容的唯一方法就是實(shí)際在大型模型實(shí)驗(yàn)室中工作。而你們,做了很多特別的事情。我唯一能想到的其他另一個(gè)情況是Facebook的OPT。還有什么類似的項(xiàng)目,可以共享交流經(jīng)驗(yàn),但不是正式的研究知識(shí)呢?

Quentin:

我會(huì)說是Bloom。比如Hugging Face的Bloom項(xiàng)目在大科學(xué)領(lǐng)域等方面,這種開放程度非常高。

我覺得,OPT和Bloom的級(jí)別相同,甚至更詳細(xì)。

除此之外,我想微軟有一個(gè)有關(guān)他們的Turing NLG的文檔。他們的文章讀起來非常輕松,也確實(shí)談到了工作中的一些挑戰(zhàn)。除了OPT, Bloom和我們,我想不出其他的了。這是一個(gè)新事物。

Swyx:

重要的是,你們正追求足夠好的經(jīng)驗(yàn)法則。我認(rèn)為,很多人試圖追求精確,但過于精確實(shí)際上并不有幫助。

Quentin:

是的,你會(huì)在博客文章中看到一些類似表述。你知道,我們不會(huì)進(jìn)一步詳細(xì)討論每個(gè)小的內(nèi)存部分,錙銖必較的話可能需要額外的一個(gè)月。但是,得到足夠好的結(jié)果對(duì)人們?nèi)匀挥袔椭?/p>

02 最少GPU數(shù)量,是最佳方案

Alessio:

聊回您在《Transformer Math 101》一文中給出的估計(jì)方程,這里的核心方程式不是計(jì)算成本,而是轉(zhuǎn)化Transformer模型所需的計(jì)算,大約等于τ乘以T,其中τ是吞吐量,單位為FLOPT表示訓(xùn)練時(shí)間,然后T是花費(fèi)的時(shí)間。

我認(rèn)為人們可以很容易地想象這一點(diǎn)。基本上是你有多少個(gè)GPU,你讓它們運(yùn)行多長(zhǎng)時(shí)間。

之前在Chinchilla論文和OpenAI的規(guī)模定律中,有類似的內(nèi)容,你在博文中也提到了這一點(diǎn)。

現(xiàn)在,人們?cè)跇?gòu)建模型時(shí)應(yīng)該如何考慮這個(gè)問題?當(dāng)他們開始考慮訓(xùn)練自己的基于Transformer 的模型時(shí),他們應(yīng)該從哪里找到這個(gè)方程?

Quentin:

人們通常從數(shù)據(jù)集開始,你有一些數(shù)據(jù)集,然后你想在基于此訓(xùn)練一個(gè)模型。

讓我們開始逐步思考,一開始,從6PD的角度來看,每個(gè)參數(shù)大約有6個(gè)令牌與之對(duì)應(yīng)。因此,這決定了我的模型大小,以此為Chinchilla Optimal。

從那時(shí)起,我們發(fā)現(xiàn)為了獲得良好的質(zhì)量模型,需要更多的令牌,可能會(huì)超過20個(gè)。

但從系統(tǒng)的角度來看,你們應(yīng)該考慮的下一個(gè)問題是,這個(gè)模型需要多長(zhǎng)時(shí)間來訓(xùn)練?我應(yīng)該有什么樣的預(yù)算?

假設(shè)我需要一些云實(shí)例,持續(xù)一段時(shí)間,每個(gè)實(shí)例都有一個(gè)附加的價(jià)格。這就是吞吐量的用武之地。

現(xiàn)在,你有了這個(gè)模型,這個(gè)參數(shù)數(shù)量,你應(yīng)該將它映射到一個(gè)Transformer架構(gòu),并在該模型類型的軟件棧上基準(zhǔn)測(cè)試你的吞吐量,接著你可以在單個(gè)GPU上實(shí)現(xiàn)每秒的FLOPS。

然后根據(jù)并行性方案(我相信我們會(huì)詳細(xì)討論的,例如數(shù)據(jù)并行性或張量并行性等),這個(gè)FLOPS數(shù)將如何擴(kuò)展到不同數(shù)量的GPU?

從這里,你將得到一個(gè)時(shí)間。進(jìn)而,得到了時(shí)間,就能算出成本。

這些都是你可以使用這個(gè)公式得到的商業(yè)答案。這就是為什么我們將其分成了T和吞吐量術(shù)語,以便你可以解出其中之一,通常是獲得吞吐量、時(shí)間,從時(shí)間算出成本。

簡(jiǎn)而言之,這就是答案。

Alessio:

我注意到另一件事,你提到一些這些定律,只在1個(gè)小時(shí)內(nèi)使用1000 GPU的成本與1個(gè)GPU運(yùn)行1000小時(shí)的成本相同才成立。

考慮目前我們?nèi)狈Υ罅縂PU的實(shí)際情況,在這方面,對(duì)于人們?nèi)绾蝺?yōu)先考慮這一點(diǎn),你有什么想法嗎?

Quentin:

我會(huì)說,首先應(yīng)該找出剛好能容納你的模型的最小GPU數(shù)量。

如果您在訓(xùn)練一個(gè)相當(dāng)大的模型,內(nèi)存瓶頸是你最大的問題。如果只在訓(xùn)練一個(gè)小模型,那沒人會(huì)在意。

大多數(shù)人關(guān)心的模型,都需要分配到多個(gè)GPU上。因此,找到適合你的模型的一個(gè)實(shí)例的最小gpu數(shù)量,然后計(jì)算需要多長(zhǎng)時(shí)間。如果是時(shí)間合理,那么你完成了。如果時(shí)間太長(zhǎng),那么你就需要開始考慮使用多個(gè)模型實(shí)例。

我總是覺得,人們應(yīng)該選擇最小數(shù)量的GPU。你擁有的GPU數(shù)量越多,出現(xiàn)問題的可能性就越大。

所以我會(huì)說,只要找出什么時(shí)間對(duì)你來說是合理的,然后將gpu的數(shù)量與之匹配,而不需更多。

人們往往會(huì)變得貪婪,他們會(huì)說,如果我有兩倍的GPU,我可以在半個(gè)時(shí)間內(nèi)完成這項(xiàng)工作。但事實(shí)上,最終可能花了三倍時(shí)間,因?yàn)槊刻於紩?huì)出現(xiàn)各種問題。那時(shí),可能需要痛苦地在午夜時(shí)分起床,加班加點(diǎn)搶修你的模型。

Swyx:

你們會(huì)不會(huì)有一個(gè)類似的開源框架,來幫助gpu線性擴(kuò)展?還是說,這么想過于簡(jiǎn)單化了?

Quentin:

Mosaic和我們都有一種可以理論上良好擴(kuò)展的軟件堆棧配置,一會(huì)我會(huì)詳細(xì)討論。

Mosaic完全基于優(yōu)化器分片。它基于ZeRO。因此,你完全將模型優(yōu)化器、參數(shù)和梯度分布在所有不同的GPU上。你的聚合內(nèi)存就是參數(shù)數(shù)目除以GPU數(shù)目。優(yōu)化器和其他內(nèi)容也是一樣。

而我們?cè)贓leuther使用了Megatron DeepSpeed的庫,會(huì)更加復(fù)雜。因此,效率可能會(huì)更高,但也更容易出現(xiàn)故障。

在這兩種情況下,回到實(shí)際情況,通過增加更多的GPU應(yīng)該能夠獲得線性加速。但問題是會(huì)出現(xiàn)硬件故障。

如果有太多的GPU,你可能會(huì)有問題,例如損失會(huì)溢出,或者一個(gè)GPU掛掉,你就可能碰到軟件問題、同步問題等。

這就是我為什么說,實(shí)際上你應(yīng)該選取你擁有的最小GPU數(shù)量,因?yàn)檫@些情況更容易調(diào)試。

Alessio:

另一件事情是,電腦就像在前向和后向傳遞,前向是2PD,后向是4PD。為什么兩者之間的比率是如此?你能解釋一下嗎?為什么是兩倍的數(shù)量?

Quentin:

簡(jiǎn)單來說,對(duì)于前向傳播,您只是在移動(dòng),您正在通過該層向前傳播輸入。

而在后向傳播中,你要做的事情比這更復(fù)雜一些。你正在做反向傳播。我認(rèn)為我無法足夠直觀地解釋它,需要數(shù)字上進(jìn)一步深入探討。

Swyx:

實(shí)際上,反向傳播的速度很低。老實(shí)說,這是我喜歡深度學(xué)習(xí)數(shù)學(xué)的最基本的原因之一,與大學(xué)微積分中遇到的其他數(shù)值方法相比,深度學(xué)習(xí)的數(shù)學(xué)令人驚訝地高效。

Alessio:

我認(rèn)為另一件事是,事情聽起來很簡(jiǎn)單,你知道,當(dāng)人們?cè)赥witter上說,哦,20是最優(yōu)的比率,然后就是,好吧,為什么是那個(gè)數(shù)字呢?

答案通常要困難得多,就像我們現(xiàn)在看到的。所以我認(rèn)為這是一個(gè)很好的提醒,數(shù)字聽起來簡(jiǎn)單,就像所有最好和最受歡迎的數(shù)學(xué)方程一樣,非常優(yōu)雅。不過,顯然,背后的證明并不那么容易。

02 估計(jì)GPT-3訓(xùn)練的計(jì)算量

Swyx:

我想稍微測(cè)試一下這個(gè)方程。我們可以從GPT-3的角度或GPT-NeoX的角度來做。你有實(shí)際浮點(diǎn)運(yùn)算和理論浮點(diǎn)運(yùn)算之間的區(qū)別。

很多時(shí)候,當(dāng)人們報(bào)告訓(xùn)練一個(gè)模型所需的浮點(diǎn)運(yùn)算量時(shí),就像我們剛剛在Lama 2中看到的那樣,估算的數(shù)值就是浮點(diǎn)運(yùn)算量。

比如,GPT-3需要3.14 x 10的23次浮點(diǎn)運(yùn)算。這是理論浮點(diǎn)運(yùn)算。我想弄清楚一個(gè)數(shù)值是否經(jīng)得起推敲。

我想知道如何做到這一點(diǎn),因?yàn)槲覒?yīng)該能夠?qū)⑦@個(gè)方程代入其中,對(duì)吧?我知道GPT-3是基于3000億tokens進(jìn)行訓(xùn)練的。

我知道模型的參數(shù)大小是175。是不是只要計(jì)算一下6 x 175 x 300就行了?

Quentin:

理論浮點(diǎn)運(yùn)算通常是根據(jù)給定的硬件配置得出的,這是你預(yù)計(jì)硬件可以實(shí)現(xiàn)的。

但問題在于,實(shí)際上,我們通常會(huì)有一些閑置時(shí)間,例如等待從GPU到CPU的數(shù)據(jù)傳輸,或者等待跨不同GPU之間的同步。所以訓(xùn)練時(shí)候你會(huì)花掉很多空閑時(shí)間。

Swyx:

聞起來怎么樣。(注:效果如何?)

Quentin:

我不確定我是否有一個(gè)自己的"聞起來怎么樣"的標(biāo)準(zhǔn),

坦白說,也許我會(huì)查看像在A100上期望的一些浮點(diǎn)運(yùn)算量。

事實(shí)上,在某種程度上,對(duì)于給定的GPU類型,每個(gè)人都知道可以期望多少浮點(diǎn)運(yùn)算量。

例如,對(duì)于A100來說,這個(gè)數(shù)值大約在100到180之間。對(duì)于較舊的GPU類型V100,這個(gè)數(shù)值可能在30到40之間。

人們通常會(huì)根據(jù)運(yùn)行深度學(xué)習(xí)的內(nèi)核來確定應(yīng)該期望的浮點(diǎn)運(yùn)算量。然后,將這個(gè)與人們報(bào)告的理論浮點(diǎn)運(yùn)算量進(jìn)行比較,看是否與你的預(yù)期相符。

03 A100 基線標(biāo)準(zhǔn):115+ TeraFLOPS/sec

Alessio:

在文章中,你提到對(duì)于A100來說,如果你的浮點(diǎn)運(yùn)算量低于115 TeraFLOPS/秒,那么你的模型或硬件有問題。

你是怎么得出這個(gè)115的?是不是根據(jù)實(shí)際觀察和經(jīng)驗(yàn),你在過去的幾個(gè)月里見到的平均水平?你是怎么得出這些數(shù)字的?

Quentin:

對(duì)于這個(gè)數(shù)字,基本上,我們比較了很多不同的框架。就像我之前提到的,Mosaic有他們自己的框架,我們也有自己的框架。它們都有自己的浮點(diǎn)運(yùn)算計(jì)數(shù)器。

我們看到,在許多不同的硬件配置上,如果你正確調(diào)整設(shè)置,你應(yīng)該在幾乎所有情況下都能得到超過115的浮點(diǎn)運(yùn)算量。

所以,如果某個(gè)數(shù)值低于115,那么你的軟件肯定有問題。但這實(shí)際上就是比較不同的軟件堆棧和硬件系統(tǒng)。

04 AMD GPU:可用,但效率不高

Alessio:

不同的GPU有什么不同嗎?

上周,我們邀請(qǐng)了George Hotz,他談到了AMD顯卡,以及理論上他們的浮點(diǎn)運(yùn)算要比一些Nvidia顯卡好得多,但實(shí)際上,CUDA運(yùn)行時(shí)會(huì)彌補(bǔ)這一差距。

人們應(yīng)該如何考慮這一點(diǎn)?你知道,像A100的浮點(diǎn)運(yùn)算量達(dá)到115 TeraFLOPS。我是否應(yīng)該堅(jiān)持使用它?

Quentin:

這涉及到開發(fā)者的時(shí)間,哪個(gè)更昂貴,歸根結(jié)底,AMD和Rockham的軟件堆棧還有很長(zhǎng)的路要走。

我會(huì)說,大多數(shù)東西都可以在那里運(yùn)行,但效率不高,而且你可能會(huì)遇到以前沒有遇到過的奇怪錯(cuò)誤。

選擇使用Nvidia和PyTorch的軟件堆棧的一個(gè)重要優(yōu)點(diǎn)是,有成千上萬個(gè)GitHub問題與你面臨的相同問題,而且,以開源方式快速解決這些問題,這可能是目前選擇Nvidia軟件堆棧的最大優(yōu)勢(shì)。

AMD的硬件與Nvidia相當(dāng),但軟件不太一樣,而且他們?cè)陂_源領(lǐng)域的勢(shì)頭還沒有完全發(fā)展起來。

例如,像Flash Attention這樣的功能在更多Nvidia GPU類型上的應(yīng)用要比在AMD上的應(yīng)用要多。等待這些最新的功能在AMD上實(shí)現(xiàn),對(duì)很多人來說是一個(gè)障礙,但它正在發(fā)展壯大。

我現(xiàn)在正在AMD上運(yùn)行很多實(shí)驗(yàn),因?yàn)樗呀?jīng)進(jìn)入了政府實(shí)驗(yàn)室的超級(jí)計(jì)算機(jī)。所以很多實(shí)驗(yàn)現(xiàn)在都在那里進(jìn)行,而且我預(yù)計(jì)它會(huì)在幾年內(nèi)趕上來。

05 模型精度(FP32、FP16、BF16等)對(duì)內(nèi)存的影響

(注:一般情況下,計(jì)算機(jī)在進(jìn)行浮點(diǎn)運(yùn)算時(shí)所采用的是FP32(單精度),其中8位用于存儲(chǔ)整數(shù)部分,23位存儲(chǔ)小數(shù)部分,因此其可以存儲(chǔ)高精度浮點(diǎn)數(shù)。

因此,在顯存優(yōu)化場(chǎng)景下,犧牲浮點(diǎn)運(yùn)算的精度可以降低存儲(chǔ)量。)

Alessio:

讓我們稍微談?wù)剝?nèi)存需求。所以你之前稍微提到過這個(gè)問題,在這之前,我們?cè)诓タ蜕弦舱劦搅薋lashAttention,內(nèi)存速度是我們的主要關(guān)注點(diǎn)之一,但這次我們受制于實(shí)際的內(nèi)存大小,就是VRAM本身,特別是在模型權(quán)重、參數(shù)、優(yōu)化器狀態(tài)等方面。

我們可以輪流討論一下,有很多內(nèi)容需要涵蓋,但或許我們可以從模型權(quán)重開始。

過去,我們?cè)谶^去的許多討論中經(jīng)常涉及的一個(gè)主題就是精度和量化,這顯然是內(nèi)存的主要因素之一。

你在文章中提到,大多數(shù)Transformer都是混合精度,如FP16加FP32或BF16 FP32,它們可以進(jìn)行轉(zhuǎn)換,而且可以進(jìn)行高達(dá)INT8的量化,而不會(huì)對(duì)性能造成太大的影響。也許,我們可以解釋一下一些數(shù)學(xué)和不同精度之間的字節(jié)參數(shù)比率?

Quentin:

當(dāng)我開始入行深度學(xué)習(xí)時(shí),一切都是FP32。每個(gè)參數(shù)需要32位,即4個(gè)字節(jié)。事情相當(dāng)簡(jiǎn)單。你不需要進(jìn)行任何損失縮放。

但問題是,一旦NVIDIA切換到了V100并引入了Tensor核心,F(xiàn)P32就不能提供太多的浮點(diǎn)運(yùn)算。Tensor核心在FP16精度下執(zhí)行所有計(jì)算。

因此,如果你在FP32下進(jìn)行操作,你實(shí)際上浪費(fèi)了所有這些。所以一旦硬件遷移到V100,軟件就會(huì)切換到混合精度,如APEX和AMP等?;旌暇鹊囊粋€(gè)讓人意想不到的部分是,實(shí)際上在訓(xùn)練時(shí)你需要更多的內(nèi)存,因?yàn)槟阈枰粋€(gè)FP16版本的權(quán)重副本和一個(gè)FP32版本的權(quán)重副本。

FP16是在Tensor核心上進(jìn)行實(shí)際計(jì)算的地方。因此,你可能得到的吞吐量可能是FP32的兩倍。然后在每個(gè)步驟中,使用FP16更新FP32的副本,兩者都需要存儲(chǔ)在內(nèi)存中。

問題在于,F(xiàn)P16非常精確,但動(dòng)態(tài)范圍不太大,

因此,如果從浮點(diǎn)的角度來看,你有一個(gè)非常大的尾數(shù),但沒有太多的指數(shù)。所以BF16將更多的位數(shù)從尾數(shù)移到指數(shù)中。也就是說,你有更大的范圍和較低的精度。

這消除了許多不穩(wěn)定性問題和損失縮放等問題,對(duì)于任何熟悉調(diào)試的人來說,都知道它有多么不穩(wěn)定,尤其是在大規(guī)模訓(xùn)練中。而BF16則減少了很多這種問題,但只在A100上受支持。所以你看到了硬件和軟件之間的來回變化。

每次NVIDIA引入一些新的Tensor核心或BF16支持之類的功能,軟件就會(huì)適應(yīng)并開始支持它,然后訓(xùn)練適應(yīng)。然后你現(xiàn)在提到了Ind8等。

現(xiàn)在,我們看到一些模型已經(jīng)在FP16、FP32或其他模式下訓(xùn)練,然后現(xiàn)在你想將該模型盡可能地量化為像Ind8這樣的更小的表示,同時(shí)又保持最小的損失和精度。

實(shí)際上,我們發(fā)現(xiàn),由于深度學(xué)習(xí)是一個(gè)如此具有隨機(jī)性的問題,許多這些最后的精度位實(shí)際上并不重要,我認(rèn)為這種情況將會(huì)持續(xù)下去。

06 深度學(xué)習(xí)模型量化的好處

Alessio:

具體一點(diǎn),當(dāng)你有一個(gè)FP32時(shí),在推理時(shí)每個(gè)參數(shù)需要四個(gè)字節(jié)的內(nèi)存來加載它。

如果你有一個(gè)量化成八位的模型,你只需要一個(gè)字節(jié)來表示每個(gè)參數(shù)。例如,在一個(gè)80GB VRAM的A100上,你可以放下700億個(gè)參數(shù)的八位模型,而你無法放下一個(gè)FP32模型,因?yàn)槟阈枰蠹s280GB的內(nèi)存。這會(huì)有多大影響?

你剛剛提到剛開始時(shí)都是FP32,如果有一個(gè)帶有1TB VRAM的GPU,人們會(huì)只將內(nèi)存加載為FP32權(quán)重嗎,還是他們?nèi)匀粫?huì)希望將它們量化以使其更加高效?是的。

Quentin:

我認(rèn)為,即使你有無限的VRAM,你仍然會(huì)想要一個(gè)量化模型,只是一個(gè)更大的經(jīng)過量化的模型。

因?yàn)檎缥覄倓偺岬降模谧詈?,深度學(xué)習(xí)是非常隨機(jī)的,很多時(shí)候,你可能擁有世界上所有的精度,但是當(dāng)你仍然非常依賴輸入時(shí),這些精度實(shí)際上是沒有意義的。你在很大程度上依賴于輸入的微小變化,也許更多的訓(xùn)練數(shù)據(jù)樣本會(huì)更加重要。

在深度學(xué)習(xí)中,總體上,這些微小的精度并不是很重要的,重要的是整體的畫面。那個(gè)神經(jīng)元實(shí)際上在說什么?而不是它可能在想什么微小的細(xì)節(jié)。我還想提到,即使你擁有A100,實(shí)際模型的大小要比你提到的要小得多。

這是因?yàn)镵V緩存。所以KV緩存在推理過程中,只在推理過程中起作用,想象一下,如果你在寫一段話,你想要在寫下一個(gè)詞之前記住之前寫過的每一個(gè)單詞。

所以什么是自回歸語言建模?它就是填充下一個(gè)詞、下一個(gè)標(biāo)記。如果我說"the dog went to the",然后我需要寫下一個(gè)詞,我可能會(huì)寫"park"之類的。在我寫下一個(gè)詞之前,我的記憶會(huì)被清除,然后我必須重新閱讀整個(gè)句子。

這就是沒有KV緩存的情況。KV緩存則是說,在推理過程中,記住我之前生成的所有內(nèi)容,以及我之前生成內(nèi)容的所有上下文。但是KV緩存的內(nèi)存開銷通常與模型的內(nèi)存開銷相當(dāng),或在某些情況下甚至更大,特別是在上下文很長(zhǎng)的情況下。

我認(rèn)為具體的計(jì)算公式大致是,哦,是類似于兩倍的層數(shù)乘以頭數(shù)乘以每個(gè)頭的維度,然后有兩個(gè)這樣的部分,一個(gè)是K,一個(gè)是V。簡(jiǎn)要來說,大概就是這樣。

Alessio:

我知道,這是Transformer中的數(shù)學(xué)概念,不過,關(guān)于RNNs,也有一些有趣的地方,比如遠(yuǎn)離隨著序列長(zhǎng)度增加而增加的KV緩存,而是使用固定的序列傳遞。

我知道,人們正在研究這些方面的內(nèi)容。

Quentin:

我參與過的一篇論文叫做RWKV,我建議人們閱讀。它回答了這個(gè)確切的問題。

那么,如何在不增加Transformer所需的二次注意力開銷的情況下獲得Transformer質(zhì)量?這是有趣的,我建議人們閱讀這篇論文原文。

Swyx:

我們實(shí)際上已經(jīng)和RWKV的核心成員進(jìn)行了一次未發(fā)布的訪談,他們稱之為軟注意力或輕量級(jí)注意力。我忘記他們具體叫什么了,但是可以近似地表示,使其線性化而不是二次方的方法。這很棒。

Quentin:

RWKV的人員經(jīng)常出現(xiàn)在Eleuther。

他們與我們密切合作。我的貢獻(xiàn)是,我們所有這些關(guān)于RNNs的實(shí)驗(yàn)是由不同的人完成的,這些實(shí)驗(yàn)與Transformer的關(guān)系以及我們?nèi)绾螌⑵滢D(zhuǎn)化為一篇論文,以便人們不必閱讀一年前的Discord日志就能理解發(fā)生了什么。

07 如何計(jì)算優(yōu)化器的內(nèi)存使用

Swyx:

很棒,現(xiàn)在,我想我們可能要花更多時(shí)間在優(yōu)化器狀態(tài)和Atom優(yōu)化器上。當(dāng)你處理這些優(yōu)化器時(shí),你的想法是什么?在處理這些優(yōu)化器時(shí),人們應(yīng)該記住什么?

Quentin:

我認(rèn)為,Atom優(yōu)化器在其領(lǐng)域內(nèi)是出色的。這是一個(gè)比較寬泛的問題,所以讓我想一想。你有權(quán)重的副本,然后你有你的動(dòng)量和方差。

用直觀的預(yù)言來解釋一下動(dòng)量:比如說,你在一個(gè)峽谷,你想要到達(dá)底部。

如果你只是進(jìn)行基本的隨機(jī)梯度下降,那么每一步都會(huì)是相同大小的。而如果你使用帶有動(dòng)量項(xiàng)的Atom,那么你的步幅應(yīng)該會(huì)逐漸變大,因?yàn)槟憧梢钥吹?,一般的趨?shì)是我們正在迅速地向下前進(jìn)。但是,由于Atom中有所有這些額外的項(xiàng),你需要更多的內(nèi)存來存儲(chǔ)它。

例如,與SGD相比,通常需要三倍的內(nèi)存。如果你在你的優(yōu)化器狀態(tài)中花費(fèi)了所有這些內(nèi)存,那么,你如何將它分布到GPU上?

你會(huì)發(fā)現(xiàn),在給定的GPU上,實(shí)際上比起裸計(jì)算、原始的計(jì)算能力,你更多地受限于并行性。這歸結(jié)為在將模型分割成需要在許多GPU上分割之前,你能夠?qū)⒍嗌倌P头旁趩蝹€(gè)GPU上。

然后,你會(huì)發(fā)現(xiàn)花費(fèi)的時(shí)間更多地用于它們相互通信,而不是實(shí)際取得進(jìn)展。所以,我們?cè)诓┪闹谢ㄙM(fèi)了很多時(shí)間來討論如何分布你的模型?所有這些不同的分布策略是什么樣的?哪些策略更有效?考慮到很多內(nèi)存都花費(fèi)在了優(yōu)化器上,你如何有效地分布這個(gè)優(yōu)化器?

很多人在談?wù)摬⑿行詴r(shí),他們談?wù)摰氖悄P筒⑿行?,即參?shù)本身。實(shí)際上,在訓(xùn)練時(shí),相當(dāng)大一部分的內(nèi)存實(shí)際上是花費(fèi)在優(yōu)化器狀態(tài)上的。所以你想要深入探討其中的哪個(gè)部分嗎?你想要深入探討零、分片優(yōu)化器之類的嗎?

Alessio:

Quentin,你在博文中提到"Atom是神奇的",實(shí)際上,即使對(duì)于像你這樣與底層很接近的人,有多少內(nèi)容是實(shí)際上的"神奇",有一些東西對(duì)你來說只是教義?有一些事情是你實(shí)際上在考慮在日常工作中進(jìn)行改進(jìn)的嗎?

Quentin:

所以我是一個(gè)系統(tǒng)工程師,很多這些事情對(duì)我來說是神奇的,Atom對(duì)我來說是神奇的。

我認(rèn)為,這就是一個(gè)深度學(xué)習(xí)模型的訓(xùn)練方式。這就是下一步的計(jì)算方式。然后我說,好的,如何使其變得更快?

我會(huì)說我會(huì)看看如何通過使用第二階優(yōu)化器來改進(jìn)它。因?yàn)橛泻芏嚓P(guān)于這方面的研究,因?yàn)樗鼈兒茈y分布。

但是對(duì)我來說,核心的貢獻(xiàn)總是來自于其他人已經(jīng)進(jìn)行了一些深度學(xué)習(xí)的優(yōu)化,我需要使其運(yùn)行得更快。所以我實(shí)際上無法談?wù)摓槭裁碅tom產(chǎn)生了,除非像我剛剛提到的,使用動(dòng)量的一些簡(jiǎn)單直觀的東西。

對(duì)我來說,Atom所占用的內(nèi)存比SGD要多三倍,這一點(diǎn)很重要。所有這些內(nèi)存都需要找個(gè)地方存放,它需要有效地分布。

Alessio:

所以,當(dāng)你把所有這些加在一起時(shí),使用普通的Adam優(yōu)化器,每個(gè)參數(shù)需要12字節(jié)。

然后,你仍然需要在內(nèi)存中保存模型參數(shù),就像你提到的那樣,需要同時(shí)保存FB32、FB16混合量化的兩份副本,因此有不同的精度級(jí)別。所以每個(gè)參數(shù)需要6字節(jié),對(duì)吧?

Quentin:

再回顧一下,大多數(shù)人認(rèn)為模型會(huì)變得很大,所以需要純粹的模型并行處理,比如張量并行處理。

但實(shí)際上,如果我們使用FB16,模型每個(gè)參數(shù)只需要2字節(jié)。而優(yōu)化器本身需要每個(gè)參數(shù)4字節(jié)的模型狀態(tài)、4字節(jié)的動(dòng)量、4字節(jié)的方差。所以更重要的是如何高效地分割優(yōu)化器以及如何高效地存儲(chǔ)它。

像"bits and bytes"中的8位Adam優(yōu)化器,每個(gè)參數(shù)的優(yōu)化器狀態(tài)只需要1字節(jié),而不是4字節(jié)之類的。這會(huì)比將純FB16模型權(quán)重量化到int8之類的方式,更有效地降低模型訓(xùn)練所需的內(nèi)存開銷。

因此,對(duì)于訓(xùn)練來說,優(yōu)化器內(nèi)存占用非常重要,在大多數(shù)情況下最為重要。

Alessio:

在我們深入討論Zero之前,讓我們先總結(jié)一下稍后會(huì)對(duì)參數(shù)、優(yōu)化器狀態(tài)和梯度進(jìn)行分片處理??梢院?jiǎn)要談一下這個(gè)問題,然后我們可以討論如何在GPU上高效地加載它們。

Quentin:

所謂的參數(shù),是參數(shù)的FP32副本。

我們?cè)趦?yōu)化器討論中將它們包括在內(nèi)。有些人不這樣做,但只是為了清楚起見,優(yōu)化器狀態(tài)每個(gè)參數(shù)需要12字節(jié),其中有四個(gè)字節(jié)是用于FP32的權(quán)重副本。

四個(gè)字節(jié)是用于動(dòng)量。我已經(jīng)解釋過為什么存儲(chǔ)動(dòng)量很重要,但這也是每個(gè)參數(shù)。你需要存儲(chǔ)該參數(shù)未來的前進(jìn)方向以及它在過去的前進(jìn)方向。

你還需要知道,我們知道它往哪走,但是在這個(gè)峽谷上會(huì)有凹陷。

所以我們需要存儲(chǔ)它的方差。這些凹陷的頻率是多少?我們應(yīng)該更關(guān)注動(dòng)量嗎?還是這個(gè)參數(shù)在到處跳來跳去?這些都是優(yōu)化器需要存儲(chǔ)的重要答案,它是每個(gè)參數(shù)的。

所以這三個(gè)術(shù)語都是針對(duì)每個(gè)參數(shù)的。我們還包括了一些競(jìng)爭(zhēng)性的位和字節(jié),例如SGD,以顯示根據(jù)優(yōu)化器的不同,你可以存儲(chǔ)所有或不存儲(chǔ)這些,并以不同的表示方式存儲(chǔ)。

08 訓(xùn)練內(nèi)存的各個(gè)組成部分(模型內(nèi)存、優(yōu)化器內(nèi)存、梯度內(nèi)存、激活內(nèi)存)

Alessio:

我正在查看總訓(xùn)練內(nèi)存。您實(shí)際上有模型內(nèi)存、優(yōu)化器內(nèi)存、梯度內(nèi)存和激活內(nèi)存。我認(rèn)為,這是我們討論的最后一個(gè)問題。

所以也許簡(jiǎn)要地向人們介紹一下,,比方說活動(dòng)內(nèi)存再計(jì)算、檢查點(diǎn)等。

Quentin:

在激活檢查點(diǎn)之前,可能會(huì)變得復(fù)雜,你有模型參數(shù),就像我之前提到的一樣,它們?cè)?jīng)是FP32?,F(xiàn)在可能是BF16,或者如果是較舊的GPU,則可能是FP16。然后有優(yōu)化器。那是許多內(nèi)存所在的地方。

通常情況下,這是權(quán)重的高精度副本,通常是FP32。所以每個(gè)參數(shù)需要4字節(jié),然后你還有一些可選項(xiàng),就像我們剛剛討論過的,比如動(dòng)量或方差,或者根據(jù)你的優(yōu)化器而定的其他內(nèi)容。

接著是梯度,梯度是在模型前向傳遞后得到的梯度更新。這將是你低精度權(quán)重的副本,如果你使用FP16或BF16,每個(gè)參數(shù)需要兩個(gè)字節(jié)。

所有這些都是固定的。這個(gè)開銷在訓(xùn)練期間不會(huì)消失。在反向傳播梯度后,梯度可能會(huì)被清除,但優(yōu)化器狀態(tài)和模型狀態(tài)不會(huì)消失。

內(nèi)存開銷將一直存在。動(dòng)態(tài)的是激活再計(jì)算和激活內(nèi)存。因此,有些人會(huì)遇到這樣的問題,模型在訓(xùn)練時(shí)加載得很好。但當(dāng)你實(shí)際運(yùn)行第一次迭代,或者運(yùn)行某個(gè)未來的迭代之類的時(shí)候,你會(huì)突然發(fā)現(xiàn)內(nèi)存不足。這是因?yàn)槟銓?shí)時(shí)計(jì)算的這些激活。

Alessio:

再計(jì)算是在什么時(shí)候發(fā)生的?它是如何在重新計(jì)算和存儲(chǔ)之間做出決策的?

Quentin:

有很多不同的方法,但我會(huì)說有幾種主要的方法。

首先,是一個(gè)非常簡(jiǎn)單的方案。你重新計(jì)算所有的東西。你計(jì)算出的每一個(gè)激活都會(huì)被使用或拋棄,直到結(jié)束。所以在這種情況下,你非常關(guān)心內(nèi)存,但對(duì)計(jì)算關(guān)心不大。也許這會(huì)是一種情況,你必須在許多不同的GPU上分布,而且你的通信速度非常低。

然后可能是選擇性再計(jì)算。在選擇性再計(jì)算中,Megatron有一篇很好的論文,我認(rèn)為我們博客文章中的圖表也是從那里來的。在這種情況下,你為每個(gè)激活做出加權(quán)決策。

對(duì)于非常大的激活張量,你決定,從內(nèi)存角度來看,是將其保存更昂貴,還是從計(jì)算角度來看,重新計(jì)算更昂貴?這是Megatron實(shí)施的智能方案。

他們使用了許多不同的啟發(fā)式方法。在這里可能沒有必要提到超長(zhǎng)的方程式,但如果你對(duì)選擇性再計(jì)算感興趣,你應(yīng)該去閱讀那篇論文。然后大多數(shù)人使用的是一個(gè)相當(dāng)愚蠢的方案,包括NeoX,就是不使用所有這些啟發(fā)式方法,而是只是說,如果我的張量大于X,我就拋棄它。然后將X設(shè)置為某個(gè)固定的數(shù)字,就是這樣。

對(duì)于許多情況來說,這足夠了。

Swyx:

為什么足夠呢?

Quentin:

你不希望存儲(chǔ)超過X大小的張量。有些超過了這個(gè)限制,有些沒有。你不想擠壓。

你更關(guān)心的是讓某些張量盡可能地接近實(shí)際啟發(fā)式方法,而不是實(shí)際計(jì)算啟發(fā)式代碼,因?yàn)槟悴幌牖〞r(shí)間編寫那些啟發(fā)式代碼。

Swyx:

好的。我想這確實(shí)為我們帶來了內(nèi)存數(shù)學(xué)的一次大觀。在我們進(jìn)入分布式處理、Zero等細(xì)節(jié)之前,還有什么高層次的要點(diǎn)嗎?

Quentin:

我想大概就是這樣了。

我要說的是,對(duì)于訓(xùn)練和推斷來說,情況會(huì)大不相同。人們常常說,BF16是最好的。然而,更正確的看法是,在訓(xùn)練期間,精度會(huì)更加重要。

因此,在訓(xùn)練中,BF16會(huì)比在推斷中使用更久一些,因?yàn)樵谕茢嘀?,模型已?jīng)基本成型,它絕對(duì)不需要一些精度的最后幾位,因此,對(duì)于推斷來說,更容易將精度降至int8,而不是訓(xùn)練。

所以,你在訓(xùn)練中學(xué)到的所有東西都必須在推斷中重新學(xué)習(xí),反之亦然。

Swyx:

還有第三類情況。你談到了訓(xùn)練與推斷之間的區(qū)別。這第三類情況與微調(diào)和可能的參數(shù)高效微調(diào)方法有關(guān)。

實(shí)現(xiàn)微調(diào)的樸素方法只是進(jìn)行更多的訓(xùn)練。但我不知道你是否對(duì)微調(diào)有什么直覺,是否值得在這里插入。有什么直覺嗎?如果你要編寫微調(diào)的數(shù)學(xué)公式,會(huì)包含什么內(nèi)容?

Quentin:

我認(rèn)為,關(guān)于微調(diào)還有很多問題沒有得到解答。

例如,我們知道訓(xùn)練的縮放規(guī)律。有些人已經(jīng)做了關(guān)于微調(diào)的縮放規(guī)律。但已經(jīng)在一個(gè)領(lǐng)域訓(xùn)練過的模型如何轉(zhuǎn)移到另一個(gè)領(lǐng)域進(jìn)行微調(diào),就微調(diào)大小而言,我們不清楚。

對(duì)于微調(diào)數(shù)據(jù)集,每個(gè)參數(shù)應(yīng)該有多少個(gè)標(biāo)記?也許我是無知的,但我覺得關(guān)于模型如何在原始訓(xùn)練數(shù)據(jù)集中沒有的新能力進(jìn)行微調(diào)或理解的問題,肯定會(huì)包含在未來關(guān)于微調(diào)的博客文章中。

此外,數(shù)據(jù)集轉(zhuǎn)移、學(xué)習(xí)率轉(zhuǎn)移也是我們博客感興趣的內(nèi)容之一。

09 并行訓(xùn)練

Alessio:

您在這里首先提到的是ZeRO,它專注于分片優(yōu)化器。也許可以給人們解釋一下如何理解它。

Quentin:

ZeRO圍繞兩個(gè)通信操作展開。第一個(gè)是scatter。人們應(yīng)該看一下我們有的ZeRO圖表。

在我談?wù)撨@個(gè)問題時(shí),論文中有一個(gè)包含參數(shù)、梯度和優(yōu)化器狀態(tài)的圖表。每個(gè)GPU將獲得自己等量的切片。

如果我們進(jìn)行...有ZeRO的不同階段,但讓我們首先假設(shè)它是優(yōu)化器狀態(tài)、梯度和參數(shù)的等量切片。

在這種情況下,那將是零三,第三階段。我們通過scatter實(shí)現(xiàn)這一點(diǎn)。scatter的計(jì)算是,每個(gè)GPU分配1/結(jié)束的GPU數(shù)量,加上切片的偏移量,切片被分配給該GPU?,F(xiàn)在,所有的GPU都有一個(gè)相等的切片,按照其排名順序。

在每個(gè)訓(xùn)練步驟中,該GPU將等待所有其他切片進(jìn)行通信,以便我們現(xiàn)在在該GPU上擁有整個(gè)數(shù)據(jù)。一旦我們有了整個(gè)數(shù)據(jù),我們對(duì)其進(jìn)行正向傳遞。

然后,我們使用gather將該正向傳遞分發(fā)給所有其他GPU。所以,它是scatter,具體來說是減少scatter,然后是對(duì)所有其他GPU的gather。并且您每一步都這樣做。因此,它的要點(diǎn)是您正在將這些狀態(tài)分片到不同的GPU上。

通過不同的階段,您將在圖表中看到,優(yōu)化器狀態(tài)占據(jù)了最大的比例,這是因?yàn)槲抑疤岬降?。我們包括FP32副本并進(jìn)行原子操作。所以我們需要每個(gè)參數(shù)的4個(gè)字節(jié),用于動(dòng)量和方差。然后,零階段一,這是最常見的一個(gè),僅為優(yōu)化器。

零階段二是優(yōu)化器加梯度。零階段三是優(yōu)化器梯度和模型參數(shù)。但歸根結(jié)底,所有這些都是圍繞著分片和來回聚合展開的。所以您從ZeRO中得到了很多通信開銷。但其中的正面部分是您可以將其中大部分的移動(dòng)與計(jì)算重疊。

Alessio:

如何確定使用多少個(gè)GPU進(jìn)行這種分布是最佳的?分片過多是否會(huì)造成太多的開銷?

Quentin:

這更多地取決于您的互連是什么。放慢一步,所有這些GPU之間都需要同步,而且這些同步往往是累積的。

因此,如果您在速度較慢的互連上使用過多的GPU,那么您最終會(huì)花更多的時(shí)間在同步上。在哪個(gè)GPU上花費(fèi)更多時(shí)間同步的這個(gè)魔法數(shù)字會(huì)因您的互連和GPU內(nèi)存的情況而異。每個(gè)GPU獲得多小的切片呢?

例如,對(duì)于Summit,我不能給出確切數(shù)字,但大約在200億參數(shù)左右?,F(xiàn)在您有200億個(gè)參數(shù),那么對(duì)于那個(gè)數(shù)量的GPU,大約需要100到200個(gè)規(guī)模。

超過這個(gè)數(shù)量,您最終只會(huì)花費(fèi)更多的時(shí)間在通信上。實(shí)際的FLOPS跌破您預(yù)先設(shè)定的某個(gè)數(shù)值,將取決于您最終確定的最佳選擇。

10 高級(jí)3D并行技術(shù)(數(shù)據(jù)、張量、流水線)

Alessio:

那么,對(duì)我來說,這部分內(nèi)容比較難理解,所以我很高興您能解釋一下3D并行。

Quentin:

好的,首先,讓我們來看一個(gè)非常基本的維度,即數(shù)據(jù)并行。

數(shù)據(jù)并行是您有一個(gè)模型的副本。為簡(jiǎn)單起見,假設(shè)一個(gè)副本恰好適合一個(gè)GPU。數(shù)據(jù)并行是,現(xiàn)在您有兩個(gè)GPU,所以GPU一上有一個(gè)副本,GPU二上有一個(gè)副本。兩者都執(zhí)行正向和反向傳遞,然后進(jìn)行同步和平均梯度。然后這就是一個(gè)步驟。對(duì)于3D并行來說,數(shù)據(jù)并行實(shí)際上是零。所以,您正在將優(yōu)化器狀態(tài)分片到所有不同的GPU上。

接下來,是張量并行。張量并行是將模型分割。例如,如果您有兩個(gè)GPU,將模型在中間分開,每個(gè)GPU上的張量將在其上進(jìn)行前向或后向操作。然后,僅在必要時(shí),它會(huì)將該張量操作與另一個(gè)GPU同步。這比一些像流水線并行這樣的維度要復(fù)雜一些。

而在流水線并行中,假設(shè)您的模型有四個(gè)層次,有四個(gè)GPU。您將一層放在每個(gè)GPU上,然后GPU一執(zhí)行前向傳遞,然后將其激活的輸出發(fā)送到GPU二。它執(zhí)行前向傳遞,將激活發(fā)送到三,您只是在沿著一條線移動(dòng)。那是一個(gè)樸素的方案,所有其他GPU在單個(gè)GPU執(zhí)行其前向或后向傳遞時(shí)都處于空閑狀態(tài)。所以它被稱為流水線并行,因?yàn)槟鷮⑿∨畏殖闪宋⑿∨巍?/p>

因此,GPU一將在微小批次一上執(zhí)行前向傳遞,然后發(fā)送到GPU二。然后,在GPU二在第一個(gè)微小批次上運(yùn)行時(shí),GPU一正在下一個(gè)微小批次上工作。因此,您在每個(gè)微小批次的移動(dòng)和計(jì)算之間形成了流水線。

但問題在于,您需要一個(gè)非常大的批次大小,以將其分成小批次和微小批次。因此,將這三者結(jié)合起來,您將得到一個(gè)3D網(wǎng)格,其中每個(gè)參數(shù)、優(yōu)化器狀態(tài)等都映射到每個(gè)GPU上。這就是3D并行。

Alessio:

進(jìn)行此操作時(shí)是否需要所有GPU都相同?還是也可以使用不匹配的GPU?

Quentin:

有兩件事情很重要。如果兩種不同類型的GPU之間的VRAM有差異,那么您將受到VRAM較少的GPU的限制,因?yàn)樗鼤?huì)耗盡內(nèi)存。然后您不能使用較大的GPU上剩余的部分。

據(jù)我所知,沒有像GPU單個(gè)GPU感知的內(nèi)存開銷方案來解決這個(gè)問題。第二個(gè)問題是,假設(shè)所有GPU的VRAM都相同,但其中一半速度很慢。

問題在于,我之前提到的同步操作會(huì)讓您受限。因此,在這種情況下,您的移動(dòng)速度將與您最慢或最小的GPU相同。

在這兩種情況下,您最終都會(huì)回歸到最慢或最小的GPU。因此,最好使用相同的GPU。同樣適用于CPU和互連?;氐紼leuther訓(xùn)練的200億參數(shù)模型,那是在COVID期間,由于網(wǎng)絡(luò)交換機(jī)等供應(yīng)短缺,他們構(gòu)建的一個(gè)Frankenstein式的集群。

因此,每個(gè)節(jié)點(diǎn)都有一個(gè)不同的網(wǎng)絡(luò)交換機(jī)。所以,您最終會(huì)以最慢交換機(jī)的速度運(yùn)行,并且調(diào)整一切,使其不比最慢交換機(jī)差,這是一個(gè)現(xiàn)實(shí)世界中可能會(huì)遇到的問題。

11 異構(gòu)集群分布的挑戰(zhàn)

Alessio:

這項(xiàng)工作是否被廣泛接受?在為這一集進(jìn)行研究之前,我還不知道這一點(diǎn)。這是否仍然是人們正在嘗試和研究的領(lǐng)域?還是每個(gè)人都對(duì)此有所了解,并在實(shí)際中運(yùn)行?

就是分片優(yōu)化器和3D并行,將兩者結(jié)合在一起,采用這種網(wǎng)格策略。

Quentin:

我會(huì)說,很多主要的基于GPT的模型都使用了這種方案?,F(xiàn)在很多人更傾向于純粹的ZeRO方案。所以就是純粹的分片。

您只需對(duì)所有內(nèi)容進(jìn)行分片。因?yàn)檫@樣非常容易,每個(gè)人都可以得到相等的切片。不再有流水線階段的問題。不再有哪個(gè)張量應(yīng)該放在哪個(gè)GPU上的問題。

相反,我們平均分片,平等對(duì)待一切。這個(gè)問題比使用3D并行方案更容易調(diào)試、檢查點(diǎn),以及進(jìn)行訓(xùn)練。

我認(rèn)為,3D并行給您最多的控制權(quán),也是犯錯(cuò)的最多方式。具體是選擇哪種取決于您是擁有更多工程師還是更多GPU。

Swyx:

這也不算太難,對(duì)吧?

您基本上已經(jīng)概述了需要記住的五六個(gè)不同的數(shù)字。如果需要達(dá)到這種控制水平,您已經(jīng)為每個(gè)人提供了主要的控制杠桿。這很好。絕對(duì)的。

Quentin:

問題在于,比如說,好吧,GPT-4發(fā)布了?,F(xiàn)在我們有了VLLMs。

Swyx:

Virtual LLMs,就像Metro of Expert的東西嗎?不,是視覺的。

Quentin:

所以現(xiàn)在我們有了多模態(tài)模型之類的東西。我們?nèi)绾芜M(jìn)行分布?我們將其分配到流水線階段嗎?我們只是將其分片嗎?將張量分割并進(jìn)行張量并行嗎?

當(dāng)您具有這種3D并行方案時(shí),要更改模型并添加新功能變得有點(diǎn)困難。我說困難,我的意思是將其調(diào)整和修改為適應(yīng)新功能會(huì)變得困難。

Alessio:

您還在這個(gè)領(lǐng)域進(jìn)行著其他研究嗎?您想要提一下嗎?我知道通常我們會(huì)問的問題是,AI領(lǐng)域最有趣的未解決問題是什么?

我很好奇,您是否仍然認(rèn)為這些問題集中在訓(xùn)練、推理、數(shù)學(xué)優(yōu)化上,還是還有其他領(lǐng)域需要大家關(guān)注?

Quentin:

我認(rèn)為在我研究的領(lǐng)域里,有兩個(gè)問題是我認(rèn)為人們應(yīng)該非常關(guān)心的。

首先是多模態(tài)并行和RLHF。我們?cè)絹碓蕉嗟乜吹綇?qiáng)化學(xué)習(xí)融入到訓(xùn)練循環(huán)中。

因此,如何將某些模型或某些GPU用于推理,而某些GPU用于訓(xùn)練?就像我之前提到的,你需要重新學(xué)習(xí)所有內(nèi)容,而且它們具有非常獨(dú)特的挑戰(zhàn)。

例如,在訓(xùn)練期間如何分割一個(gè)KV緩存?這些都是尚未得到充分研究的挑戰(zhàn)。

在多模態(tài)方面,你可能有一個(gè)視覺變換器和一個(gè)文本變換器。如何分割它們?你是否平均分配?將它們放在不同的GPU上,還是只是將一些視覺、一些文本參數(shù)放在一個(gè)GPU上?

然后,第二個(gè)問題是通信往往是一個(gè)瓶頸。所以我們談?wù)摿?D并行,但很多情況下,比如張量并行,你不能跨節(jié)點(diǎn)使用。你會(huì)在通信中受到限制。

我要說的是,在通信發(fā)生之前,你應(yīng)該如何對(duì)通信進(jìn)行壓縮?所以在傳遞時(shí)壓縮,你有一些需要傳遞的緩沖區(qū)。你可以用GPU內(nèi)核進(jìn)行壓縮,然后將其發(fā)送到網(wǎng)絡(luò),再進(jìn)行解壓縮,類似于這樣。

讓人們?cè)谕ㄐ呕A(chǔ)設(shè)施上花費(fèi)更少的金錢,而更多地用于GPU,這也是人們需要探索的領(lǐng)域。

本文來源:硬AI
風(fēng)險(xiǎn)提示及免責(zé)條款 市場(chǎng)有風(fēng)險(xiǎn),投資需謹(jǐn)慎。本文不構(gòu)成個(gè)人投資建議,也未考慮到個(gè)別用戶特殊的投資目標(biāo)、財(cái)務(wù)狀況或需要。用戶應(yīng)考慮本文中的任何意見、觀點(diǎn)或結(jié)論是否符合其特定狀況。據(jù)此投資,責(zé)任自負(fù)。

關(guān)鍵詞:

專題新聞
  • 榮耀與華為哪個(gè)質(zhì)量好(華為和榮耀質(zhì)量一樣嗎)
  • “國(guó)球進(jìn)社區(qū) 國(guó)手武威行”活動(dòng)舉行
  • 中鐵物總再掛牌內(nèi)蒙古呼鐵瑞鑫物流24%股權(quán) 底價(jià)降至180.6萬元
  • 直播電商2023半年報(bào):交個(gè)朋友賺4000萬,遙望虧1.8億
  • 侵華日軍南京大屠殺遇難同胞紀(jì)念館舉行南京大屠殺歷史記憶傳承主題活動(dòng)
  • 一加Ace 2 Pro體驗(yàn):幾乎用了行業(yè)內(nèi)能選到的最強(qiáng)配置
最近更新

京ICP備2021034106號(hào)-51

Copyright © 2011-2020  亞洲資本網(wǎng)   All Rights Reserved. 聯(lián)系網(wǎng)站:55 16 53 8 @qq.com