7B? 13B? 175B?解讀大模型的參數

PHPz
發布: 2024-06-12 20:04:15
原創
583 人瀏覽過

大模型也是有大有小的,它們的大小靠參數數來度量。 GPT-3就有175億個參數,而Grok-1更是不得了,有314億個參數。當然,也有像Llama這樣身材苗條一點的,參數數量只有70億到700億之間。

這裡說的70B可能不是指訓練資料的數量,而是指模型中那些密密麻麻的參數。這些參數就像是一個小小的“腦細胞”,越多就能讓模型更聰明,更能理解數據中那些錯綜複雜的關係。有了這些“腦細胞”,模型在處理任務時可能會表現得更好。 然而,很多時候這些參數,尤其是在大規模的模型中,會帶來一些問題。這些「腦細胞」在處理任務時可能會互相影響,導致模型難以理解資料中那些複雜的關係。有了這些“腦細胞”,模型在處理任務時可能會表現得更好。 因此,在處理任務時,我們需要找到一種方式來管理這些參數之間的關係。常用的方法是透過正則化

這些大模型的參數就像是模型內部的“建築師”,透過複雜的演算法和訓練過程,一點一滴地搭建這個龐大的語言世界。每個參數都有它的作用,它們共同協作,讓模型更準確地理解我們的語言,並給出更合適的答案。

那麼,大模型中的參數是怎麼構成的呢?

1. 大模型中的參數

大模型參數是其“內部零件”,這些零件各有各的用途,通常包括但不限於以下幾類:

  • 權重(Weights):權重就像神經網路裡的“電線”,連接著各個神經元。它們負責調整訊號傳遞時的“音量”,讓重要的訊息傳得更遠,不那麼重要的訊息就小聲點。例如在全連接層裡,權重矩陣W就是一張“地圖”,告訴我們哪些輸入特徵和輸出特徵關係最密切。
  • 偏移(Biases):偏移就像是神經元的“小助手”,負責給神經元的回應定個基準。有了它,神經元就知道自己該在什麼層次上活躍了。
  • 注意力機制的參數(Attention Parameters):在基於Transformer的模型中,這些參數就像是“指南針”,告訴模型哪些資訊最值得關注。它們包括查詢矩陣、鍵矩陣和值矩陣等,就像是在一大堆資訊中找出最關鍵的「線索」。
  • 嵌入矩陣(Embedding Matrices):在處理文字資料時,嵌入矩陣就是模型的「字典」。每一列都代表一個詞彙,用一個數字來表示這個字。這樣,模型就能理解文本的意思了。
  • 隱藏狀態初始化參數(Initial Hidden State Parameters):這些參數就是用來設定模型最初的隱藏狀態的,就像是給模型定個基調,讓它知道從哪裡開始「思考」。
  • ......

這些參數一般會使用4種表達和儲存的格式:

  1. Float: 32位元的浮點數,即4位元組
  2. Half/BF16: 16位元的浮點數,即2位元組
  3. Int8: 8位元的整數,即1位元組
  4. #Int4: 4位元的整數,即0.5位元組

一般來說,參數的數量是影響大模型效能的主要因素。例如,13B-int8模型通常優於同一體系結構的7B-BF16模型。

2. 大模型參數對記憶體的需求

對於工程師而言,面對的是大模型訓練或推理時會使用多少的記憶體資源。儘管V100(具備32GB的GPU記憶體)或A100(具備40GB的GPU記憶體)非常強大,大模型仍無法在單一GPU上進行訓練,例如使用Tensorflow或PyTorch。

2.1 訓練階段的記憶體需求

在模型訓練期間,主要體現為模型狀態和活動過程對記憶體的儲存需求。模型狀態包括由優化器狀態、梯度和參數組成的張量。活動過程中包含在正向通道中創建的任何張量,這些張量是在反向通道中梯度計算所必需的。 為了優化記憶體使用,可以考慮以下幾個方面: 1. 減少模型參數的數量:可以透過減少模型規模或使用稀疏矩陣等技術來減少參數的數量,並降低記憶體使用。 2. 優化器狀態的儲存:可以選擇只儲存必要的優化器狀態,而不是儲存全部狀態。可根據需要選擇性地更新和儲存優化器狀態。 3. 修改張量的資料類型:

在訓練的任何時候,對於每個模型參數,總是需要有足夠的 GPU 記憶體來儲存:

  • 模型參數複製的位元組數x
  • 梯度複製的位元組數y
  • 優化器狀態一般為12個位元組,主要是參數、變異數等的拷貝,會將所有優化器狀態保存在FP32中,以保持穩定訓練並避免數值異常。

這意味著,訓練時需要如下記憶體來儲存所有的模型狀態和過程資料:(x+y+12 ) * model_size

2.2 推理階段的記憶體需求

推理階段利用預先訓練好的LLM 完成文字產生或翻譯等任務。在這裡,記憶體需求通常較低,主要的影響因素:

  • 有限的上下文: 推理通常處理較短的輸入序列,需要較少的記憶體來儲存與較小的文字區塊相關的激活。
  • 無反向傳播: 在推理過程中,LLM 不需要保留反向傳播的中間值,這是一種用於訓練調整參數的技術。這消除了大量的記憶體開銷。

推理階段所需的記憶體不會高於相同參數計數和類型的訓練階段所需記憶體的四分之一。例如,對於一個7B的模型而言,大體上,使用浮點精度需要28GB內存,使用BF16精度需要14GB內存,使用int8精度需要7GB內存。這個粗略的估計方式可以相應地應用到其他版本的模型。

另外,當根據特定任務調整 LLM 時,微調需要更高的記憶體佔用。微調通常包括更長的訓練序列來捕捉目標任務的細微差別。當 LLM 處理更多的文字資料時,這將導致更大的啟動。反向傳播過程需要儲存用於梯度計算的中間值,這些中間值用於在訓練期間更新模型的權重。與推理相比,這增加了大量的記憶體負擔。

2.3 基於Transformer的大模型的記憶體估算

具體而言, 對應基於Transformer的大模型,嘗試計算訓練時所需的內存,其中設:

  • l :transformer的層數
  • a:attention 的head 數量
  • b:批次大小
  • ##s:序列長度
  • h :隱藏層的維度大小
  • p:精度
這裡, bshp = b * s * h * p 代表了輸入資料量的大小。在transformer 的線性層部分,大概需要9bshp+bsh 的空間來用於後面的啟動。在attention 部分,self-attention 可以表達為:softmax((XQ)(XK)^T)XV

那麼,XQ,XK,XV均需bshp大小的空間。在標準self-attention中,乘法(XQ) * (XK) ^ T 的結果只是一個包含 logit 的 b * s * s 矩陣。然而在實踐中,由於使用了多頭注意力機制,需要為每個頭都要建立一個單獨的 s * s 儲存空間。這意味著需要 abssp 位元組的空間,而儲存 softmax 的輸出也同樣需要 abssp 位元組。在 softmax 之後還一般需要額外的 abss 位元組來儲存掩碼,所以 attention部分需要2abssp+abss的儲存空間。

此外,transformer中還有兩個Norm layer,每個仍需bshp的儲存空間,共2個bshp。

所以,基於Transformer 的大模型訓練所需記憶體大約是:L(9bshp+bsh+2abssp+abss +2bshp) = Lbshp[16+2/p+(as/h)(2+1/ p)]

解釋一下,訓練基於Transformer 的大模型所需記憶體大約是:模型的層數x 訓練批次的大小x 序列長度x 隱藏層的維度x 精度x 大於16的整數

這或許就是基於Transfromer的大模型參數對訓練時記憶體需求的一個理論下界。

3. 大模型參數對GPU 的需求

有了大模型參數對記憶體的要求, 可以進一步估算大模型在訓練和推理中所需的GPU數量。但由於GPU數量估算依賴的參數稍多,有人(Dr. Walid Soula,https://medium.com/u/e41a20d646a8)給出了一個粗略估算的簡單公式, 在工程上同樣有一定的參考意義。

7B? 13B? 175B?解讀大模型的參數圖片

其中,

    Model's parameters in billions 是以B為單位的模型參數數量;
  • 18是訓練期間不同元件的記憶體佔用因子;
  • 1.25 代表了啟動過程所需的記憶體數量因子,活化是隨著模型處理輸入資料而變化的動態資料結構。
  • GPU Size in GB是可用的GPU 記憶體總量
舉個實際的例子,假設使用的是NVIDIA RTX 4090 GPU,它有24GB 的VRAM,計算一下訓練' Llama3 7B'模型所需的GPU 數量,大約是:

GPU 的總數≈(7 * 18 * 1.25)/24,大約等於7

对于推理而言, 可以简化为训练阶段的1/8~1/9 , 当然,这些只是一般意义的粗略估计。

4. 由大模型参数到分布式训练

理解大模型参数的组成及其对内存和GPU的需求,有助于深入掌握分布式训练在工程实践中所面临的挑战。

采用专为分布式训练设计的框架,例如TensorFlow或PyTorch,可以显著简化分布式训练策略的实施过程,这些框架提供了丰富的工具和API。通过运用梯度累积等技术在更新模型前,或利用梯度压缩等技术减少节点间的数据交换量,可以有效降低通信成本。确定分布式训练的最佳批次大小(即前文提到的参数b)至关重要;b值过小可能增加通信开销,而过大则可能导致内存不足。

LLMOps的重要性日益凸显。定期监控为分布式训练配置的性能指标,调整超参数、分区策略和通信设置以优化性能,是提升训练效率的关键。实施模型的检查点机制并在发生故障时进行有效的恢复,可以确保训练过程在无需从头开始的情况下继续进行。

换句话说,大模型的训练/推理本质上是一个复杂的分布式系统架构工程挑战,例如:

  • 通信开销:在执行梯度计算和数据更新时,通信所需时间可能会影响整体的加速效果。
  • 同步复杂性:多台机器并行训练时,同步的复杂性需要谨慎设计。
  • 容错与资源管理:单点故障对模型训练和推理的影响,以及CPU与GPU的资源分配与调度策略。
  • ......

然而,实际上大多数工程师可能并不直接参与具体的训练工作,而是关注在构建应用时可以如何利用大模型的参数。

7B? 13B? 175B?解讀大模型的參數图片

5. 大模型应用中使用的参数

这里主要关注在使用大模型输出文本时,可以配置的三个参数:Temperature、Top-K和Top-P。

Temperature参数通常被误解为仅控制模型创造性的开关,但其实它更深层的作用是调节概率分布的“软性”。当Temperature值设置较高时,概率分布变得更柔和、均匀,这促使模型生成更多样化、具创造性的输出。反之,较低的Temperature值会使分布更尖锐,峰值更明显,从而倾向于产生与训练数据类似的输出。

Top-K参数用于限制模型在每个步骤中输出最可能的Top-K个标记,通过这种方式可以减少输出中的不连贯或无意义内容。这种策略在维持输出的最有可能的一致性与允许一定程度的创造性抽样之间形成平衡。

Top-P是另一种解码方法,它根据设定的P值(0≤P≤1)来选择一组累积概率超过P值的最小单词集合作为输出。这种方法使得选中的单词数量能够根据下一个单词的概率分布动态地增加或减少。特别地,当P值为1时,Top-P会选择所有单词,相当于从整个分布中抽样,从而产生更加多样的输出;而当P值为0时,Top-P仅选择概率最高的单词,类似于贪婪解码,使输出更加集中和一致。

这三个参数共同作用,影响模型的行为。例如,当设置Temperature=0.8、Top-K=36以及Top-P=0.7时,模型首先基于上下文计算整个词汇表的完整非规范化对数概率分布。Temperature=0.8意味着每个对数概率除以0.8,这在归一化前有效地增加了模型对其预测的信心。Top-K=36表示选择具有最高频比例对数概率的36个标记。接着,Top-P=0.7在这个Top-K=36集合中应用过滤,按概率从高到低保持排序,直到累积概率达到0.7。最后,将这个过滤后的集合重新归一化,用于后续的采样过程。

6. 小结

在工程实践中,理解大模型的参数是有意义的。参数在大模型中起着决定性的作用,它们定义了大模型的行为、性能、实现的成本以及对资源的需求。在工程上理解大模型的参数,就是要把握模型的复杂度、性能和能力之间的关系。从存储和计算的视角合理配置和优化这些参数,可以在实际应用中更好地选择和优化模型,以适应不同的任务需求和资源限制。

【参考资料】

  • ZeRO:訓練萬億參數模型的記憶體最佳化,https://arxiv.org/pdf/1910.02054v3.pdf
  • 減少大型變壓器模型中的活化重新計算,https:/ /arxiv. org/pdf/2205.05198.pdf
  • https://timdettmers.com/2023/01/30/which-gpu-for-deep-learning/
  • https:// blog.eleuther .ai/transformer-math/

以上是7B? 13B? 175B?解讀大模型的參數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:51cto.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡[email protected]
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!