大模型也是有大有小的,它們的大小靠參數(shù)數(shù)量來(lái)度量。GPT-3就有1750億個(gè)參數(shù),而Grok-1更是不得了,有3140億個(gè)參數(shù)。當(dāng)然,也有像Llama這樣身材苗條一點(diǎn)的,參數(shù)數(shù)量在70億到700億之間。
這里說(shuō)的70B可不是指訓(xùn)練數(shù)據(jù)的數(shù)量,而是指模型中那些密密麻麻的參數(shù)。這些參數(shù)就像是一個(gè)個(gè)小小的“腦細(xì)胞”,越多就能讓模型更聰明,更能理解數(shù)據(jù)中那些錯(cuò)綜復(fù)雜的關(guān)系。有了這些“腦細(xì)胞”,模型在處理任務(wù)時(shí)可能就會(huì)表現(xiàn)得更好。
大模型的這些參數(shù)就像是模型內(nèi)部的“建筑師”,通過(guò)復(fù)雜的算法和訓(xùn)練過(guò)程,一點(diǎn)一滴地搭建起這個(gè)龐大的語(yǔ)言世界。每個(gè)參數(shù)都有它的作用,它們共同協(xié)作,讓模型能夠更準(zhǔn)確地理解我們的語(yǔ)言,并給出更合適的回答。
那么,大模型中的參數(shù)是怎樣構(gòu)成的呢?
1. 大模型中的參數(shù)
大模型參數(shù)是其“內(nèi)部零件”,這些零件各有各的用途,通常包括但不限于以下幾類:
- 權(quán)重(Weights):權(quán)重就像神經(jīng)網(wǎng)絡(luò)里的“電線”,連接著各個(gè)神經(jīng)元。它們負(fù)責(zé)調(diào)整信號(hào)傳遞時(shí)的“音量”,讓重要的信息傳得更遠(yuǎn),不那么重要的信息就小聲點(diǎn)。比如在全連接層里,權(quán)重矩陣W就是一張“地圖”,告訴我們哪些輸入特征和輸出特征關(guān)系最密切。
- 偏置(Biases):偏置就像是神經(jīng)元的“小助手”,負(fù)責(zé)給神經(jīng)元的響應(yīng)定個(gè)基準(zhǔn)。有了它,神經(jīng)元就知道自己該在什么水平上活躍了。
- 注意力機(jī)制的參數(shù)(Attention Parameters):在基于Transformer的模型中,這些參數(shù)就像是“指南針”,告訴模型哪些信息最值得關(guān)注。它們包括查詢矩陣、鍵矩陣和值矩陣等,就像是在一大堆信息中找出最關(guān)鍵的“線索”。
- 嵌入矩陣(Embedding Matrices):在處理文本數(shù)據(jù)時(shí),嵌入矩陣就是模型的“字典”。每一列都代表一個(gè)詞匯,用一個(gè)數(shù)來(lái)表示這個(gè)詞。這樣,模型就能理解文本的意思了。
- 隱藏狀態(tài)初始化參數(shù)(Initial Hidden State Parameters):這些參數(shù)就是用來(lái)設(shè)置模型最初的隱藏狀態(tài)的,就像是給模型定個(gè)基調(diào),讓它知道從哪里開(kāi)始“思考”。
- ......
這些參數(shù)一般會(huì)使用4種表達(dá)和存儲(chǔ)的格式:
- Float: 32比特的浮點(diǎn)數(shù),即4字節(jié)
- Half/BF16: 16比特的浮點(diǎn)數(shù),即2字節(jié)
- Int8: 8比特的整數(shù),即1字節(jié)
- Int4: 4比特的整數(shù),即0.5字節(jié)
一般來(lái)說(shuō),參數(shù)的數(shù)量是影響大模型性能的主要因素。例如,13B-int8模型通常優(yōu)于同一體系結(jié)構(gòu)的7B-BF16模型。
2. 大模型參數(shù)對(duì)內(nèi)存的需求
對(duì)于工程師而言,面對(duì)的是大模型訓(xùn)練或推理時(shí)會(huì)使用多少的內(nèi)存資源。盡管 V100(有32 GB 的 GPU 內(nèi)存)或 A100(有40 GB 的 GPU 內(nèi)存)很強(qiáng)大,然而,大模型卻并不能使用 Tensorflow 或 PyTorch 的單個(gè) GPU 上進(jìn)行訓(xùn)練。
2.1 訓(xùn)練階段的內(nèi)存需求
在模型訓(xùn)練期間,主要體現(xiàn)為模型狀態(tài)和激活過(guò)程對(duì)內(nèi)存的存儲(chǔ)需求。模型狀態(tài)包括由優(yōu)化器狀態(tài)、梯度和參數(shù)組成的張量。激活過(guò)程中包括在正向通道中創(chuàng)建的任何張量,這些張量是在反向通道中梯度計(jì)算所必需的。
在訓(xùn)練的任何時(shí)候,對(duì)于每個(gè)模型參數(shù),總是需要有足夠的 GPU 內(nèi)存來(lái)存儲(chǔ):
- 模型參數(shù)復(fù)制的字節(jié)數(shù)x
- 梯度復(fù)制的字節(jié)數(shù)y
- 優(yōu)化器狀態(tài)一般為12個(gè)字節(jié),主要是參數(shù)、方差等的拷貝,會(huì)將所有優(yōu)化器狀態(tài)保存在 FP32中,以保持穩(wěn)定訓(xùn)練并避免數(shù)值異常。
這意味著,訓(xùn)練時(shí)需要如下內(nèi)存來(lái)存儲(chǔ)所有的模型狀態(tài)和過(guò)程數(shù)據(jù):(x+y+12 ) * model_size
2.2 推理階段的內(nèi)存需求
推理階段利用預(yù)先訓(xùn)練好的 LLM 完成文本生成或翻譯等任務(wù)。在這里,內(nèi)存需求通常較低,主要的影響因素:
- 有限的上下文: 推理通常處理較短的輸入序列,需要較少的內(nèi)存來(lái)存儲(chǔ)與較小的文本塊相關(guān)的激活。
- 無(wú)反向傳播: 在推理過(guò)程中,LLM 不需要保留反向傳播的中間值,這是一種用于訓(xùn)練調(diào)整參數(shù)的技術(shù)。這消除了大量的內(nèi)存開(kāi)銷。
推理階段所需的內(nèi)存不會(huì)高于相同參數(shù)計(jì)數(shù)和類型的訓(xùn)練階段所需內(nèi)存的四分之一。例如,對(duì)于一個(gè)7B的模型而言,大體上,使用浮點(diǎn)精度需要28GB內(nèi)存,使用BF16精度需要14GB內(nèi)存,使用int8精度需要7GB內(nèi)存。這個(gè)粗略的估計(jì)方式可以相應(yīng)地應(yīng)用到其他版本的模型。
另外,當(dāng)根據(jù)特定任務(wù)調(diào)整 LLM 時(shí),微調(diào)需要更高的內(nèi)存占用。微調(diào)通常包括更長(zhǎng)的訓(xùn)練序列來(lái)捕捉目標(biāo)任務(wù)的細(xì)微差別。當(dāng) LLM 處理更多的文本數(shù)據(jù)時(shí),這將導(dǎo)致更大的激活。反向傳播過(guò)程需要存儲(chǔ)用于梯度計(jì)算的中間值,這些中間值用于在訓(xùn)練期間更新模型的權(quán)重。與推理相比,這增加了大量的內(nèi)存負(fù)擔(dān)。
2.3 基于Transformer的大模型的內(nèi)存估算
具體而言, 對(duì)應(yīng)基于Transformer的大模型,嘗試計(jì)算一下訓(xùn)練時(shí)所需的內(nèi)存,其中設(shè):
- l :transformer的層數(shù)
- a:attention 的head 數(shù)量
- b:批次大小
- s:序列長(zhǎng)度
- h:隱藏層的維度大小
- p:精度
這里, bshp = b * s * h * p 代表了輸入數(shù)據(jù)量的大小。在transformer 的線性層部分,大概需要9bshp+bsh 的空間來(lái)用于后面的激活。在attention 部分,self-attention 可以表達(dá)為:softmax((XQ)(XK)^T)XV
那么,XQ,XK,XV均需bshp大小的空間。在標(biāo)準(zhǔn)self-attention中,乘法(XQ) * (XK) ^ T 的結(jié)果只是一個(gè)包含 logit 的 b * s * s 矩陣。然而在實(shí)踐中,由于使用了多頭注意力機(jī)制,需要為每個(gè)頭都要建立一個(gè)單獨(dú)的 s * s 存儲(chǔ)空間。這意味著需要 abssp 字節(jié)的空間,而存儲(chǔ) softmax 的輸出也同樣需要 abssp 字節(jié)。在 softmax 之后還一般需要額外的 abss 字節(jié)來(lái)存儲(chǔ)掩碼,所以 attention部分需要2abssp+abss的存儲(chǔ)空間。
此外,transformer中還有兩個(gè)Norm layer,每個(gè)仍需bshp的存儲(chǔ)空間,共2個(gè)bshp。
所以,基于Transformer 的大模型訓(xùn)練所需內(nèi)存大約為:L(9bshp+bsh+2abssp+abss +2bshp) = Lbshp[16+2/p+(as/h)(2+1/p)]
解釋一下,訓(xùn)練基于Transformer 的大模型所需內(nèi)存大約是:模型的層數(shù) x 訓(xùn)練批次的大小 x 序列長(zhǎng)度 x 隱藏層的維度 x 精度 x 大于16的整數(shù)
這或許就是基于Transfromer的大模型參數(shù)對(duì)訓(xùn)練時(shí)內(nèi)存需求的一個(gè)理論下界。
3. 大模型參數(shù)對(duì)GPU 的需求
有了大模型參數(shù)對(duì)內(nèi)存的要求, 可以進(jìn)一步估算大模型在訓(xùn)練和推理中所需的GPU數(shù)量。但由于GPU數(shù)量估算依賴的參數(shù)稍多,有人(Dr. Walid Soula,https://medium.com/u/e41a20d646a8)給出了一個(gè)粗略估算的簡(jiǎn)單公式, 在工程上同樣有一定的參考意義。
圖片
其中,
- Model’s parameters in billions 是以B為單位的模型參數(shù)數(shù)量;
- 18是訓(xùn)練期間不同組件的內(nèi)存占用因子;
- 1.25 代表了激活過(guò)程所需的內(nèi)存數(shù)量因子,激活是隨著模型處理輸入數(shù)據(jù)而變化的動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)。
- GPU Size in GB是可用的 GPU 內(nèi)存總量
舉個(gè)實(shí)際的例子,假設(shè)使用的是 NVIDIA RTX 4090 GPU,它有24GB 的 VRAM,計(jì)算一下訓(xùn)練‘ Llama3 7B’模型所需的 GPU 數(shù)量,大約為 :
GPU 的總數(shù)≈(7 * 18 * 1.25)/24,大約等于7
對(duì)于推理而言, 可以簡(jiǎn)化為訓(xùn)練階段的1/8~1/9 , 當(dāng)然,這些只是一般意義的粗略估計(jì)。
4. 由大模型參數(shù)到分布式訓(xùn)練
理解大模型參數(shù)的組成及其對(duì)內(nèi)存和GPU的需求,有助于深入掌握分布式訓(xùn)練在工程實(shí)踐中所面臨的挑戰(zhàn)。
采用專為分布式訓(xùn)練設(shè)計(jì)的框架,例如TensorFlow或PyTorch,可以顯著簡(jiǎn)化分布式訓(xùn)練策略的實(shí)施過(guò)程,這些框架提供了豐富的工具和API。通過(guò)運(yùn)用梯度累積等技術(shù)在更新模型前,或利用梯度壓縮等技術(shù)減少節(jié)點(diǎn)間的數(shù)據(jù)交換量,可以有效降低通信成本。確定分布式訓(xùn)練的最佳批次大?。辞拔奶岬降膮?shù)b)至關(guān)重要;b值過(guò)小可能增加通信開(kāi)銷,而過(guò)大則可能導(dǎo)致內(nèi)存不足。
LLMOps的重要性日益凸顯。定期監(jiān)控為分布式訓(xùn)練配置的性能指標(biāo),調(diào)整超參數(shù)、分區(qū)策略和通信設(shè)置以優(yōu)化性能,是提升訓(xùn)練效率的關(guān)鍵。實(shí)施模型的檢查點(diǎn)機(jī)制并在發(fā)生故障時(shí)進(jìn)行有效的恢復(fù),可以確保訓(xùn)練過(guò)程在無(wú)需從頭開(kāi)始的情況下繼續(xù)進(jìn)行。
換句話說(shuō),大模型的訓(xùn)練/推理本質(zhì)上是一個(gè)復(fù)雜的分布式系統(tǒng)架構(gòu)工程挑戰(zhàn),例如:
- 通信開(kāi)銷:在執(zhí)行梯度計(jì)算和數(shù)據(jù)更新時(shí),通信所需時(shí)間可能會(huì)影響整體的加速效果。
- 同步復(fù)雜性:多臺(tái)機(jī)器并行訓(xùn)練時(shí),同步的復(fù)雜性需要謹(jǐn)慎設(shè)計(jì)。
- 容錯(cuò)與資源管理:?jiǎn)吸c(diǎn)故障對(duì)模型訓(xùn)練和推理的影響,以及CPU與GPU的資源分配與調(diào)度策略。
- ......
然而,實(shí)際上大多數(shù)工程師可能并不直接參與具體的訓(xùn)練工作,而是關(guān)注在構(gòu)建應(yīng)用時(shí)可以如何利用大模型的參數(shù)。
圖片
5. 大模型應(yīng)用中使用的參數(shù)
這里主要關(guān)注在使用大模型輸出文本時(shí),可以配置的三個(gè)參數(shù):Temperature、Top-K和Top-P。
Temperature參數(shù)通常被誤解為僅控制模型創(chuàng)造性的開(kāi)關(guān),但其實(shí)它更深層的作用是調(diào)節(jié)概率分布的“軟性”。當(dāng)Temperature值設(shè)置較高時(shí),概率分布變得更柔和、均勻,這促使模型生成更多樣化、具創(chuàng)造性的輸出。反之,較低的Temperature值會(huì)使分布更尖銳,峰值更明顯,從而傾向于產(chǎn)生與訓(xùn)練數(shù)據(jù)類似的輸出。
Top-K參數(shù)用于限制模型在每個(gè)步驟中輸出最可能的Top-K個(gè)標(biāo)記,通過(guò)這種方式可以減少輸出中的不連貫或無(wú)意義內(nèi)容。這種策略在維持輸出的最有可能的一致性與允許一定程度的創(chuàng)造性抽樣之間形成平衡。
Top-P是另一種解碼方法,它根據(jù)設(shè)定的P值(0≤P≤1)來(lái)選擇一組累積概率超過(guò)P值的最小單詞集合作為輸出。這種方法使得選中的單詞數(shù)量能夠根據(jù)下一個(gè)單詞的概率分布動(dòng)態(tài)地增加或減少。特別地,當(dāng)P值為1時(shí),Top-P會(huì)選擇所有單詞,相當(dāng)于從整個(gè)分布中抽樣,從而產(chǎn)生更加多樣的輸出;而當(dāng)P值為0時(shí),Top-P僅選擇概率最高的單詞,類似于貪婪解碼,使輸出更加集中和一致。
這三個(gè)參數(shù)共同作用,影響模型的行為。例如,當(dāng)設(shè)置Temperature=0.8、Top-K=36以及Top-P=0.7時(shí),模型首先基于上下文計(jì)算整個(gè)詞匯表的完整非規(guī)范化對(duì)數(shù)概率分布。Temperature=0.8意味著每個(gè)對(duì)數(shù)概率除以0.8,這在歸一化前有效地增加了模型對(duì)其預(yù)測(cè)的信心。Top-K=36表示選擇具有最高頻比例對(duì)數(shù)概率的36個(gè)標(biāo)記。接著,Top-P=0.7在這個(gè)Top-K=36集合中應(yīng)用過(guò)濾,按概率從高到低保持排序,直到累積概率達(dá)到0.7。最后,將這個(gè)過(guò)濾后的集合重新歸一化,用于后續(xù)的采樣過(guò)程。
6. 小結(jié)
在工程實(shí)踐中,理解大模型的參數(shù)是有意義的。參數(shù)在大模型中起著決定性的作用,它們定義了大模型的行為、性能、實(shí)現(xiàn)的成本以及對(duì)資源的需求。在工程上理解大模型的參數(shù),就是要把握模型的復(fù)雜度、性能和能力之間的關(guān)系。從存儲(chǔ)和計(jì)算的視角合理配置和優(yōu)化這些參數(shù),可以在實(shí)際應(yīng)用中更好地選擇和優(yōu)化模型,以適應(yīng)不同的任務(wù)需求和資源限制。
【參考資料】
- ZeRO: Memory Optimizations Toward Training Trillion Parameter Models ,https://arxiv.org/pdf/1910.02054v3.pdf
- Reducing Activation Recomputation in Large Transformer Models,https://arxiv.org/pdf/2205.05198.pdf
- https://timdettmers.com/2023/01/30/which-gpu-for-deep-learning/
- https://blog.eleuther.ai/transformer-math/