寫在開頭
近期因為要準備一場比較硬核的技術分享,需要很詳細的講解 FP8、BF16、FP32 和 INT4 這些東西在實戰模型訓練中代表些什麼,剛好 DeepSeek 作為新興的 LLM 模型,其在模型訓練和推理中採用了多種數據精度格式和混合精度訓練策略,並在計算性能和資源使用之間取得平衡,進而有效降低了模型訓練成本和提升效率。索性就趁機把晾了很久多篇與 DeepSeek 相關論文讀了一下,並把模型採用的數據精度格式、混合精度訓練策略,以及其對模型性能和效率的影響做些筆記,同時與其他大型語言模型進行簡略的比較分析,最後嘗試總結 DeepSeek 在模型訓練和推理方面的創新點。
編按:DeepSeek 的技術細節實在是太多了,我這篇文章只針對 FP8、BF16、FP32 和 INT4 混合精度訓練策略做些『略懂』的筆記。
FP8、BF16、FP32 和 INT4?
隨著人工智慧(AI)的快速發展,深度學習模型的規模和複雜性日益增長,對硬體的性能和效率提出了更高的要求。為了滿足這些需求,業界一直在探索新的技術和方法來優化計算過程,其中浮點數精度扮演著重要的角色。FP8、BF16、FP32 和 INT4 是常見的浮點數精度格式,它們在深度學習模型的訓練和推理中都有各自的優缺點和應用場景。
浮點數精度格式比較
特性 | FP8 | BF16 | FP32 | INT4 |
---|---|---|---|---|
位元數 | 8 | 16 | 32 | 4 |
精度 | 低 | 中 | 高 | 極低 |
範圍 | 中 | 高 | 高 | 極低 |
性能 | 高 | 中 | 低 | 極高 |
應用場景 | LLM 推理、混合精度訓練 | LLM 訓練、推理 | 科學計算、模型訓練 | 模型量化、邊緣計算 |
優點 | 儲存空間小、計算速度快、能效比高、降低通訊成本 | 數值範圍大、計算效率高、易於轉換、有助於防止溢出 | 高精度、廣泛支援 | 極致壓縮、高效率 |
缺點 | 數值穩定性、硬體需求 | 精度 | 記憶體佔用 | 精度損失、硬體支援 |
FP8
FP8(8 位元浮點數)是一種新興的數值精度格式,它是為了加速深度學習訓練和推論而發展出來的,接續 FP16 和 BF16 的腳步。FP8 主要用於深度學習中的 AI 訓練和推論,尤其是在大型語言模型(LLM)和圖像生成模型中。FP8 目標在平衡性能與數據精度,並在 NVIDIA Hopper 和 Ada Lovelace 等 GPU 上得到支援。
FP8 的定義
FP8 是一種浮點數表示格式,使用 8 位元來儲存一個浮點數,其結構如下:
- 1 位元:符號位(正數或負數)
- 4 位元:指數位(用來表示數值範圍的大小)
- 3 位元:尾數位(用來表示數值的精度)
FP8 有兩種不同的表示形式:E4M3 和 E5M2,它們在不同的場景中都有其作用。E4M3 使用 4 位元表示指數,3 位元表示尾數,而 E5M2 則使用 5 位元表示指數,2 位元表示尾數。
FP8 的應用
FP8 在 AI 訓練和推論中都有應用,特別是在以下場景:
- 生成式 AI 模型:FP8 可以提升生成式 AI 模型的效率,例如在 AMD 的 WMMA 技術中,FP8 可以增強影像升級的品質並減少畫面生成的延遲。
- 混合精度訓練:DeepSeek 提出了一種利用 FP8 數據格式進行訓練的細粒度混合精度框架,通過低精度訓練優化訓練效率。
- KV 暫存量化:在 LLM 推理中,FP8 可以用於量化 KV 暫存,減少記憶體佔用並提高推理速度。
FP8 的優點
- 更小的數據儲存:使用 FP8 可以大幅減少顯存和 RAM 佔用,適合超大規模的 AI 模型。
- 計算速度提升:FP8 所需的硬體資源較少,運算速度顯著提升。
- 能效比更高:GPU 能以更低的功耗執行 FP8 運算。
- 降低通訊成本:在分散式訓練中,FP8 可以降低通訊成本。
FP8 的缺點
- 數值穩定性:由於尾數位較少,數值精度可能不足,尤其是在非常小或非常大的數值範圍中,可能導致模型的收斂變慢。
- 硬體需求:需要特定的硬體支援,例如 NVIDIA 的 Hopper 架構。
BF16
BF16(Bfloat16)是由 Google Brain 提出的另一種 16 位元浮點數格式,專為機器學習而設計。它使用 1 位元表示符號,8 位元表示指數,和 7 位元表示尾數。BF16 的指數位元數與 FP32 相同,但尾數位元數較少,這使得 BF16 在保持較大動態範圍的同時,犧牲了一些精度以換取更高的計算效率。
BF16 的定義
BF16 是一種 16 位元的浮點數格式,它與 FP32 的主要區別在於尾數的位元數。BF16 的尾數位元數較少,但它有更大的指數範圍,這意味著它能夠表示更大的數值範圍。
BF16 的應用
BF16 主要用於深度學習模型的訓練,特別是在以下場景:
- 大型模型訓練:BF16 適合用於訓練大型模型,因為它可以避免溢出或精度丟失的問題。
- Google TPU:Google TPU 支援 BF16 運算,使其成為 Google TPU 上深度學習訓練的理想選擇。
- Intel CPU:Intel 從 Cascade Lake 和 10 奈米 Ice Lake 處理器開始,加入了 BF16 指令集。
BF16 的優點
- 更大的數值範圍:BF16 的指數範圍與 FP32 相同,可以避免溢出或精度丟失的問題。
- 計算效率:BF16 的計算效率比 FP32 高,同時保持了相對較高的精度。
- 易於轉換:BF16 與 FP32 之間的轉換非常容易。
- 有助於防止溢出:BF16 更大的指數範圍有助於防止訓練過程中出現溢出問題。
BF16 的缺點
- 精度:BF16 的精度比 FP32 低,但在許多深度學習任務中,這種精度損失是可以接受的。
FP32
FP32(單精度浮點數)是一種常見的浮點數表示方式,提供了更高的數值精度,適用於大多數深度學習模型的訓練和推理過程。FP32 是深度學習訓練的基準,用於衡量其他低精度格式的性能和精度。
FP32 的定義
FP32 是一種 32 位元的浮點數格式,它遵循 IEEE 754 標準,使用 32 位元來表示一個數字,包括 1 位元符號位、8 位元指數位和 23 位元尾數位。
FP32 的應用
FP32 適用於大多數深度學習模型的訓練和推理過程,特別是以下場景:
- 模型訓練:FP32 適用於需要高精度計算的模型訓練任務。
- 科學計算:FP32 適用於科學計算、工程模擬和財務分析等需要高精度計算的領域。
FP32 的優點
- 高精度:FP32 提供了更高的數值精度,適用於大多數深度學習模型的訓練和推理過程。
- 廣泛支援:大部分硬體都支援 FP32 運算。
FP32 的缺點
- 記憶體佔用:FP32 的精度比 FP16 和 BF16 高,但會佔用更多的儲存空間和計算資源。
INT4
INT4(4 位元整數)是一種使用 4 位元二進制數來表示一個整數的數據類型。INT4 量化技術可以將模型的權重和啟動值量化為 4 位元整數,從而大幅減少模型的儲存需求和計算資源需求。
INT4 的定義
INT4 是一種 4 位元的整數格式,它可以表示 -8 到 7 的有符號整數,或 0 到 15 的無符號整數。
INT4 的應用
INT4 主要用於以下場景:
- 模型量化:INT4 可以用於量化模型的權重和啟動值,以減少模型的儲存需求和計算量。
- 邊緣計算:INT4 適用於在資源受限的環境中部署模型,例如嵌入式系統或移動設備。
INT4 的優點
- 極致壓縮:INT4 提供了最高的壓縮率,可以大幅減少模型的容量需求和計算資源需求。
- 高效率:INT4 的計算效率非常高,適用於對模型大小和計算資源非常受限的環境。
INT4 的缺點
- 精度損失:INT4 量化相對於 FP32 或 INT8 量化可能會帶來更多的精度損失。
- 硬體支援:確保目標部署平台能夠支援 INT4 推理,因為某些硬體可能不支援這種低精度計算。
隨著深度學習模型的規模和複雜性不斷增加,業界正在積極探索更高效的浮點數精度格式。FP8 和 BF16 等低精度格式在深度學習訓練和推理中的應用日益增長,以提升性能和效率。
FP16(半精度浮點數)和 BF16(Brain Floating Point 16)?
FP16(半精度浮點數)和 BF16(Brain Floating Point 16)都是 16 位元的浮點數格式,但它們在結構和精度上存在差異。
格式差異:
- FP16:由 1 位符號位、5 位指數位和 10 位尾數位組成。
- BF16:由 1 位符號位、8 位指數位和 7 位尾數位組成。 這意味著 FP16 的尾數位較多,提供更高的精度;而 BF16 的指數位較多,擁有更廣的數值範圍。
精度比較:
- FP16:因為有 10 位尾數位,能表示約 3.3 位十進位有效數字,適合需要較高精度的計算。
- BF16:只有 7 位尾數位,能表示約 2.4 位十進位有效數字,精度較低,但其與 FP32 相同的指數位使其數值範圍更廣。 因此,FP16 在精度上優於 BF16,但 BF16 能表示更大的數值範圍。
應用場景:
- FP16:適用於需要較高精度且數值範圍較小的計算,如某些圖形處理和科學計算。
- BF16:由於其廣泛的數值範圍和適中的精度,特別適合深度學習中的訓練任務,能有效防止上溢或下溢問題。
FP16 和 BF16 不僅在格式上有差異,精度和適用場景也不同。選擇使用哪種格式應根據具體需求,如對精度和數值範圍的要求,以及硬體支援情況來決定。
稍微整理一下
- FP8 和 INT8 都是常用的模型量化技術,它們都能減少模型的儲存空間和計算量,但它們的精度表現有所不同。根據研究,FP8 在多種網路模型的訓練後量化(PTQ)中通常優於 INT8,特別是 E5M2 和 E4M3 格式效果最好。例如在一個啟動值量化的實驗中,FP8-E4M3 的精度表現優於 INT8,因為 FP8-E4M3 對於小值的精度更好。
- FP8 和 BF16 都是 16 位元的浮點數格式,但它們在動態範圍和精度方面有所不同。BF16 擁有與 FP32 相似的動態範圍,可以表示更大範圍的數值,但精度較低。FP8 則提供了更高的精度,但動態範圍較窄。
- FP32 提供了最高的精度,但會佔用更多的儲存空間和計算資源。FP16、BF16 和 FP8 等低精度格式可以減少模型的儲存空間和計算量,提高訓練和推理速度,但會犧牲一些精度。在許多深度學習任務中,這種精度損失是可以接受的。
- INT4 的挑戰:INT4 的表示範圍非常有限,這使得它在量化過程中容易造成顯著的精度損失。為了減輕這種影響,需要使用特殊的量化演算法和技術。
- FP8、BF16、FP32 和 INT4 是深度學習中常用的浮點數精度格式,它們在精度、範圍和性能方面都有各自的優缺點。FP8 是一種新興的精度格式,它在 LLM 推理和混合精度訓練中展現出巨大的潛力。BF16 是一種平衡了精度和性能的格式,它在大規模模型訓練中得到了廣泛應用。FP32 是一種高精度的格式,它適用於需要高精度計算的任務。INT4 是一種極致壓縮的格式,它適用於對模型大小和計算資源非常受限的環境。
- FP8:FP8 訓練的穩定性和精度仍然是業界關注的焦點。NVIDIA 和微軟等公司正在積極研究如何提高 FP8 訓練的穩定性和精度,並將其應用於更大規模的模型訓練。
- BF16:BF16 已經成為深度學習訓練中一種流行的精度格式,並且在未來的發展中,它可能會得到更廣泛的應用。
- FP32:隨著硬體算力的提升,FP32 的應用可能會逐渐减少,但它仍然是某些需要高精度计算的任務的首選格式。
- INT4:INT4 量化技術仍處於發展初期,未來的研究可能會集中在如何減少 INT4 量化帶來的精度損失,以及如何將其應用於更廣泛的模型和任務。
DeepSeek 模型的數據精度格式
DeepSeek 模型在模型訓練和推理的不同階段和操作中,靈活運用了 FP8、BF16、FP32 和 INT4 等數據精度格式,以達到最佳的性能和效率。
- FP8(8 位元浮點數): DeepSeek-V2 的訓練中,FP8 被用於大多數計算密集型操作,如通用矩陣乘法(GEMM)。FP8 的使用顯著降低了訓練成本,DeepSeek-V2 的預訓練僅消耗了 2664K H800 GPU 小時,總成本約為 557.6 萬美元。FP8 混合精度訓練框架是 DeepSeek 的一大創新,它首次在超大規模模型上驗證了 FP8 訓練的有效性。DeepSeek 採用 FP8 的主要原因是它可以減少 GPU 記憶體使用和計算開銷,同時保持較高的模型性能。 為了避免 FP8 精度不足的問題,DeepSeek 採用了混合精度策略,在關鍵操作中使用 BF16 或 FP32。此外 DeepSeek 支援兩種 FP8 格式:E4M3 和 E5M2。E4M3 提供更精確的數值,而 E5M2 提供更大的動態範圍。 DeepSeek 在訓練中採用了 E4M3 格式,以保持較高的數值精度。
- BF16(16 位元大幅度浮點數)和 FP32(32 位元浮點數):在需要高精度的關鍵操作中,如嵌入層和注意力機制,DeepSeek 使用 BF16 或 FP32 以確保數值穩定性。這種混合精度訓練策略在 DeepSeek-V2 中被廣泛應用,以在性能和精度之間取得最佳平衡。
- INT4(4 位元整數)DeepSeek 採用了 INT4 格式進行模型量化,以減少模型的存儲和計算資源佔用。例如 DeepSeek-7B-chat 模型使用了 4 位元量化技術(如 Qlora)進行微調,顯著降低了 RAM 佔用,同時保持了較高的推理性能。模型量化技術可以將模型參數從浮點數轉換為低精度整數,從而減小模型尺寸、加速計算、降低能耗。
DeepSeek 的混合精度訓練策略
DeepSeek 採用混合精度訓練策略,在不同階段和操作中使用不同精度的数据格式,以在性能和效率之間取得平衡。DeepSeek 的混合精度訓練策略主要用在在以下幾個方面:
- FP8 混合精度訓練:DeepSeek 在訓練過程中,大部分核心計算内核均採用 FP8 精度實現,包括前向傳播、啟動反向傳播和權重反向傳播。針對某些對低精度計算敏感的運算和一些低成本運算,如嵌入模組、輸出頭、MoE 門控模組、歸一化算子和注意力算子,則保留了 FP16 甚至 FP32 的精度。這種混合精度策略可以兼顧模型穩定性和降低算力成本。
- 精度解耦:DeepSeek 將模型的不同部分分開處理,對不敏感的部分用 FP8,對敏感的部分保持高精度(如 BF16 或 FP32)。
- 自動缩放:DeepSeek 動態調整數據的缩放比例,確保數值在 FP8 的範圍內,避免溢出或精度丟失。
- 細粒度量化:DeepSeek 對數據進行分組缩放,例如每 128 個通道一組,既保證精度又提高效率。
- 遞增累加精度:DeepSeek 在計算過程中,先用 FP8 快速計算,隔一段時間再用高精度(FP32)累加結果,減少誤差累積。
- LossFree 負載均衡:在混合專家(MoE)架構中,親和分數(Affinity score)是衡量每個輸入 token 與各個 Eexpert 之間相關性的指標。這些分數決定了哪些專家最適合處理特定的輸入。為了實現無輔助損失的負載平衡,DeepSeek 在計算 top-K 路由時,對 Affinity score 添加了一個偏差項(Bias term)。在訓練過程中,根據每個專家的負載情況,動態調整這些偏差項,以確保各專家的負載更加均衡,從而避免傳統方法可能導致的性能下降。
DeepSeek 的混合精度訓練策略有效降低了訓練成本和提升了訓練效率。DeepSeek-V2 的預訓練成本僅為 557.6 萬美元,遠低於 GPT-4 的上億美元。DeepSeek-V3 的 API 定價也低至 GPT-4 Turbo 的 1/70。
DeepSeek 的數據優化策略
除了模型架構和混合精度訓練,DeepSeek 還採用了數據優化策略來提升訓練效率和模型性能。 這些策略包括:
- 增加數學和程式撰寫樣本比例:DeepSeek-V3 相比 DeepSeek-V2 提升了數學和程式碼樣本的比例,使其在程式碼生成和數學推理方面表現更出色。
- 擴大多語言覆蓋範圍:DeepSeek-V3 擴展了中英语言之外的多語言覆蓋範圍,使其能更好地處理多語言任務。
- 優化數據處理流程:DeepSeek-V3 優化了數據處理流程,以減少冗餘並確保語料庫的多樣性和完整性。
- 文件打包方法:DeepSeek-V3 採用了文件打包方法以維護數據完整性。
DeepSeek-V2 預訓練成本降低的原因
DeepSeek-V2 預訓練成本降低的主要原因包括以下幾個方面:
- FP8 精度訓練:DeepSeek 採用 FP8 精度進行訓練,相比傳統的 FP32 精度,FP8 精度可以顯著減少計算資源的消耗,同時保持較高的模型性能。
- DualPipe 雙向流水線:DeepSeek 引入 DualPipe 雙向流水線技術,更高效地利用計算資源,進一步降低訓練成本。DualPipe 算法的核心創新是能够將計算和通信階段重疊進行,減少 GPU 在等待數據傳輸時出現的空閒期。
- MoE 負載均衡和多頭潛在注意力機制(MLA):DeepSeek 優化了 MoE(Mixture of Experts)負載均衡機制,並引入了多頭潛在注意力機制(MLA),這些技術不僅提高了模型的訓練效率,還提升了模型的性能。MLA 可以減少 KV 暫存需求約 93.3%,顯著降低了硬體資源消耗。
- 模型蒸餾和多 Token 預測(MTP):DeepSeek 通過模型蒸餾技術將複雜模型的知識遷移到更小的模型中,同時採用多 Token 預測技術,進一步優化了訓練過程。
- PTX :DeepSeek 繞過 CUDA 採用 PTX,使工程師能夠更好地控制 GPU 指令的執行,提高 GPU 利用率,從而降低訓練成本。
- RAM 管理:DeepSeek 採用了多種 RAM 管理技術,例如通過對 RMSNorm、MLA up-projection 等操作進行重計算,在反向傳播(backpropagation)階段,對這些操作的輸出不進行持久存儲,而是在需要時重新計算,這種方法的計算開銷較小,但能顯著減少存儲啟動值所需的記憶體。再來就是將模型參數的指數移動平均(EMA)等數據儲存到 CPU 主記憶體中,來降低 GPU 顯存壓力,在訓練期間,模型參數的 EMA 被存儲在 CPU 的主記憶體((即 RAM)中,而非 GPU 的顯存,進而降低對 GPU 記憶體的佔用,EMA 參數在每個訓練步驟後進行非同步更新,讓更新操作與主要的訓練過程並行進行,不對訓練速度造成顯著影響。
DeepSeek 模型量化技術的應用
DeepSeek 採用了 INT4 格式進行模型量化,以減少模型的存儲和計算資源佔用。模型量化技術可以將模型參數從浮點數轉換為低精度整數,從而減小模型尺寸、加速計算、降低能耗。
DeepSeek-7B-chat 模型使用了 4 位元量化技術(如 Qlora)進行微調,顯著降低了 RAM 佔用,同時保持了較高的推理性能。量化精度越低,模型大小和推理所需的 RAM 就越小,但相應模型的能力也越弱。以 ChatGLM2-6B 為例,該模型的全精度(FP32)版本大小為 12G,推理所需 RAM 約為 12-13G;而量化的 INT4 版本僅為 3.7G,推理所需 RAM 降至 5G。Qlora 是一種高效的模型量化技術,它可以在不顯著降低模型性能的情況下,將模型的權重和啟動值量化到低精度。
DeepSeek 與其他大型語言模型的比較
DeepSeek 與其他大型語言模型在數據精度格式和混合精度訓練策略方面存在一些異同。
- 數據精度格式:大部分 LLM 模型都使用了 FP16 或 BF16 進行訓練,而 DeepSeek 則是首個大規模應用 FP8 混合精度訓練的模型。FP8 的使用可以顯著降低訓練成本和提升訓練效率,但也對模型精度和穩定性提出了更高的要求。
- 混合精度訓練策略:大部分 LLM 模型都採用了混合精度訓練策略,但 DeepSeek 的混合精度訓練策略更加精細和複雜,例如精度解耦合、自動缩放、細粒度量化和遞增累加精度等。這些策略可以更好地平衡模型性能和效率。
- 模型架構:DeepSeek 採用了 MoE 架構和 MLA 多頭潛在注意力機制,這些技術可以提升模型性能和效率。
- 訓練數據:DeepSeek 使用了高質量和多樣化的訓練數據,並針對特定任務增加了數據的比例,例如數學和程式撰寫。
- 開源策略:DeepSeek 堅持開源策略,將模型程式碼及技術細節全部公開,這有助於促進 AI 技術的發展和應用。
模型 | 數據精度格式 | 混合精度訓練策略 | 優點 | 缺點 |
---|---|---|---|---|
DeepSeek | FP8、BF16、FP32、INT4 | 精度解耦、自動缩放、細粒度量化、遞增累加精度、LossFree 負載均衡 | 訓練成本低、效率高、性能強大 | 模型精度和穩定性要求高 |
GPT-4 | FP16、BF16 | AMP | 性能強大 | 訓練成本高 |
LLaMA | FP16、BF16 | AMP | 性能較好 | 訓練成本较高 |
DeepSeek 的多模態能力
DeepSeek 同時也是一款强大的多模態 AI 系統,支援文本、圖像、聲音與影像等多種數據類型的綜合處理。 DeepSeek-V3 採用了多模態編碼器,支援超過 200 種文件類型,並通過跨模態注意力對齊專利技術有效提升了數據處理的準確性。 DeepSeek 的多模態能力使其可以應用於更廣泛的場景,例如圖像理解、影像分析等。
結論
DeepSeek 通過在不同階段和操作中靈活運用 FP8、BF16、FP32 和 INT4 等數據格式,以及採用混合精度訓練策略和數據優化策略,實現了高效且經濟的模型訓練和推理。DeepSeek 的創新點包括 FP8 混合精度訓練框架、MLA 多頭潛在注意力機制、DeepSeekMoE 架構、多 Token 預測(MTP)、強化學習(RL)驅動的推理優化和 PTX 編程語言等。DeepSeek 未來發展趨勢可能包括進一步提升推理能力、擴展模型規模、加強多語言支持、推動 AI 平權、ASIC 晶片優化、應對美國出口管制和模型密度定律等。DeepSeek 模型已被廣泛應用於各個領域,例如程式開發助手、檢索增強生成 (RAG)、內容創作與多輪對話、金融行業、醫療行業、智能製造和邊緣計算等。DeepSeek 的出現,為 LLM 的發展提供了新的思路,也為 AI 技術的普及和應用帶來了新的機遇。
就結果論,DeepSeek 是一款具有創新性和發展潛力的 LLM 模型,它的出現為 AI 技術的發展和應用帶來了新的可能性。