LLM Inference 中的低精度陷阱:數值穩定性和可復現性
一、背景
LLM Inference 中的數值穩定性問題是一個長期存在的挑戰。自從 ChatGPT 發布以來,關于同樣輸入下,盡管使用了 Greedy Search,輸出仍然存在差異的問題就引發了廣泛關注。在我們之前的文章中,也曾涉及這一問題。最近,我們注意到一篇新的論文,針對這一問題進行了深入分析和討論,本文將對其進行簡要介紹。
對應的論文:[2506.09501] Give Me FP32 or Give Me Death? Challenges and Solutions for Reproducible Reasoning [1]
二、摘要
研究表明,LLM 效果的可復現性極其脆弱:評估的 Batch-Size、GPU 數量、GPU型號等微小變化都可能導致生成的 Response 有較大的差異。這類現象在 Reasoning 模型中尤為突出——早期 Token 的細微誤差會導致思維鏈出現級聯效應,最終影響精度。
通過溯源分析,作者發現這種差異的根本原因在于有限精度下浮點運算的非結合律特性(PS:這個似乎早已經是共識)。本文中,作者系統性揭示了數值精度如何影響 LLM Inference 的可復現性:通過跨硬件、軟件及精度設置的嚴格對照實驗,量化了模型輸出何時及如何產生差異。分析表明,盡管浮點精度對結果復現至關重要,但在評估實踐中卻常被忽視。受此啟發,作者開發了名為 LayerCast 的輕量級 Inference 方案——將權重存儲為 16 位精度,但所有計算均在 FP32 下執行,實現了內存效率與數值穩定性的平衡。
PS:論文的工作也有很多局限性,我們在最后的部分介紹。
三、引言
3.1 浮點數值表示
如下圖為 NVIDIA GPU 常見的浮點數表示方式,其中 sign 表示符號位,exponent 表示指數位(決定了動態范圍),mantissa 表示尾數位(決定了表示精度)。
- 相比 FP32:
FP16 的指數位和尾數位都更小。因此,通常 FP32 轉 BF16 時會帶來較大的精度損失。
BF16 的指數位和 FP32 相同,尾數位更少。因此,通常 FP32 轉 BF16 只需要做尾數位的截斷,損失相對較小。現在的 LLM 預訓練中通常都會使用 BF16。
- 相比 FP16:
- FP8 E4M3 的指數位和尾數位都更小。因此,通常 FP16 轉 FP8 E4M3 時會帶來較大的精度損失。
- FP8 E5M2 的指數位和 FP16 相同,尾數位更少。因此,通常 FP16 轉 FP8 E5M2 只需要做尾數位的截斷,損失相對較小。
需要說明的是,雖然都是 E5M2 或者 E4M3,不同公司的硬件可能采用不同的格式。比如 NVIDIA GPU 上的 E5M2 符合 IEEE 754 Style,而 E4M3 卻不符合 IEEE 754 Style,本文中沒有特殊說明都以 ARM-Intel-Nvidia Style 為例。如下圖所示,IEEE 754 Style 的 E4M3 的范圍為 [-240, 240],而 ARM-Intel-Nvidia Style 的 E4M3 的范圍是 [-448, 448]:
PS:2023 年,OCP(Open Compute Project) 在 AMD, Arm, Intel, Meta, Microsoft, NVIDIA, Qualcomm 的參與下提出 Microscaling(MX)Format 規范(OCP Microscaling Formats (MX) Specification Version 1.0 [2]),實現表示格式的同一,最新的 GPU 也都開始支持,比如 NVIDIA 的 Blackwell GPU。
3.2 浮點數值精度
如下圖所示為 FP16 在不同數值區間的精度:
如下圖所示為 ARM-Intel-Nvidia FP8-E4M3 在不同數值區間的精度:
如下圖所示為 ARM-Intel-Nvidia FP8-E5M2 在不同數值區間的精度:
與傳統的 FP16 和 FP32 相比,FP8 可以顯著減少存儲,提高計算吞吐。對于 FP8 而言,在表示范圍內:
- E4M3 更精準:比如 [1, 2] 之間,E4M3 的最小間隔為 1/8,而 E5M2 的最小間隔為 1/4。
- E5M2 范圍更寬:比如 E4M3 的表示范圍為 [-448, 448],而 E5M2 的表示范圍為 [-57344, 57344]
3.3 舍入錯誤
浮點數的位數越低,越容易出現舍入誤差(大數吃小數)。以 FP16 為例,其在不同區間的精度是不同的,比如在 [1024, 2048] 之間,間隔只有 1,也就是如果是 1024.0 加上 1.5,其結果為 1025.0,如下圖所示為一個簡單的示例:
- 1024.6 用 FP16 表示時,將表示為 1025.0。
- FP16 的 1025.0 + FP16 的 0.4 = 1025.0。
- FP16 的 1025.0 + FP16 的 100.6 = 1126.0。
Pytorch 也提供了僅使用 deterministic 算法的方式,可以參考:torch.use_deterministic_algorithms — PyTorch 2.7 documentation [3]。可以最大限度避免隨機性引入的誤差或不穩定。
即使使用了 deterministic 算法,依然無法避免硬件、Batch-Size 等導致的不一致問題。在 LLM Inference 場景中,一般都會使用 Continuous Batching 來提升 Decoding 階段的吞吐,這就導致實際計算時的 Shape 是動態變化的。假設單個 Token t 計算時,A * B 的大小為 (1, 4096) * (4096, 4096),當 Token t 與其他 Token Batching 處理后 Shape 可能變為 (128, 4096) * (4096, 4096)。雖然理論上 Token t 的結果不應該改變,但是因為兩種方式 Shape 不同,實際計算的順序、算法也就可能不一致,導致結果的隨機性。
四、有限精度下的可復現性
4.1 實驗設置
4 個模型:
- 兩個 Reasoning 模型:DeepSeek-R1-Distill-Qwen-7B 和 DeepSeek-R1-Distill-Llama-8B。最大輸出 Token 32K。
- 兩個非 Reasoning 模型:Qwen2.5-7B-Instruct 和 Llama-3.1-8B-Instruct。最大輸出 Token 2K。
5 種評估任務:
- AIME’24(30 個樣本),
- MATH500(500)
- LiveCodeBench([2403.07974] LiveCodeBench: Holistic and Contamination Free Evaluation of Large Language Models for Code [4])
Easy(142)
Medium(168)
Hard(90)
使用 vLLM 作為 Inference 后端,非隨機場景使用 Greedy Search,隨機場景設置 temperature 為 0.7,top-p 為 0.95。每個任務 12 種不同的運行配置:
- 2 種 GPU:A100 和 L40s。
- 2 種 GPU 并行數:2 和 4。
- 3 種 Batch Size:8,16,32。
對于 Greedy Decoding 場景,4 種評估指標:
- Std@Acc:Accuracy 的標準差,如果足夠穩定,應該接近于 0。
- Avg_Std@Output_Length:輸出長度的標準差。
- Div_Index:針對同一問題,若兩個或多個 Response 在特定位置前生成完全相同的序列,但此后出現差異,則將該位置索引定義為 Divergence Index。較高的 Div_Index 值表明不同運行配置下產生的響應具有更強的一致性。
- Avg_Std@top1_prob:在 Div_Index 之前,不同運行配置下的所有 Response 在每一位置均生成相同的 Top-1 Token。然而,浮點運算誤差會導致這些 Token 的預測概率在不同設置間存在差異。為量化此現象,作者計算各位置 Top-1 Token 預測概率在不同設置下的標準差,隨后對 0 至 Div_Index 區間內所有位置和全部樣本取平均值。用以表征浮點誤差所引入數值差異程度。
對于 Random Sampling 場景使用 Pass@1。
4.2 Greedy Decoding 不等于 Deterministic Output
如下圖 Table 3 所示,為 BF16、FP16 和 FP32 三種精度在 12 種運行配置下的 Std@Acc。實驗表明,Greedy Decoding 并不能保證在不同硬件和系統配置下獲得確定性輸出。不過,采用 FP32 精度可顯著改善這一狀況,并且始終能實現近乎完美的可復現性且方差可忽略不計。而 FP16 略微優于 BF16。尤其是,在 AIME’24 的評估中,DeepSeek-R1-Distill-Qwen-7B 模型在 BF16 下的 Std@Acc 甚至達到了 9%。
如下圖 Table 4 所示,BF16 精度還會導致 Response 長度在不同配置下出現顯著差異,比如不同配置可能導致輸出長度產生 9K 個 Token 的差異。當然,這里 Reasoning 模型的 Avg_Std@Output_Length 較大也和 Reasoning 模型輸出較長有關。這種差異會對 Reasoning 場景或者其他長序列場景產生較大的挑戰。
因此作者建議:若采用 Greedy Decoding,應優先使用 FP32 精度以提升高效 Reasoning 研究的可復現性。(然而,當前常見 GPU 中 BF16/FP16 的算力通常遠大于 FP32,使用 FP32 無法充分發揮 GPU 算力。比如,H100 GPU 中 FP16 的算力是 FP32 算力的 15 倍左右)
輸出結果產生差異的根本原因還是最終輸出 Token 的概率分布的差異。
- 如下圖 Figure 3 左圖所示,同一個輸入在兩個 Answer 中的概率分布示例,如果兩個 Token 的概率很接近,就可能因為誤差的存在導致順序的改變,從而影響最終的輸出 Token。
- 如下圖 Figure 3 右圖所示,呈現了 FP32 精度下 Top-1 和 Top-2 Token 概率差的直方圖分布,可見,在 Reasoning 模型中頭部競爭 Token 的概率差往往很小,容易受誤差的影響。
為深入理解這一現象與數值誤差的相互作用機制,如下圖 Figure 4 進一步展示了不同數值精度水平下 Top-1 Token 預測概率的 Avg_Std@top1_prob。數據顯示,BF16 精度下的 Top-1 Token 概率波動顯著高于 FP16 與 FP32。主要是 BF16 的尾數位較少(7位,而 FP16 為 10 位)導致概率計算誤差增大,當這些波動與 Top-1、Top-2 候選 Token 的微小概率差重疊時,會顯著提高 Token 翻轉概率。相比之下,FP32 運行時差異幾乎可忽略不計。
綜合這些結果表明:在 Greedy Decoding 過程中,由于競爭 Token 間的概率差極小,Token 選擇對微小的數值波動具有高度敏感性。
4.3 Random Sampling 同樣有可復現性問題
有觀點認為,Random Sampling 中隨機性的存在,會對精度導致的誤差更加魯棒。然而,作者實驗表明,數值精度同樣會顯著影響基于 Sampling 的評估穩定性和可復現性。如下圖 Table 5 所示,作者在 MATH500 和 AIME’24 上評估了 Pass@1 的標準差指標,其中 n 表示獨立采樣次數。可以看出,BF16 同樣往往會產生更高的方差。
4.4 消融實驗
如下圖 Figure 6 所示,作者進一步探索了 Batch Size 大小、GPU 數量以及 GPU 類型對精度的影響。使用 DeepSeek-R1-Distill-Qwen-7B 模型進行 Greedy Decoding 實驗。得出如下結論:
- a):4 GPU 比 2 GPU 表現出更高的概率差異。
- b):較小的 Batch Size 反而導致更高的 Token 概率方差。
- c):A100 GPU 表現出比 L40S 更高的概率方差。
五、LayerCast
采用 FP32 精度會導致內存占用和 Inference 耗時翻倍(PS:考慮到 FP16 和 FP32 算力的差距,遠不止翻倍)。作者提出了 LayerCast 混合精度計算框架:
- 模型參數初始化時以 FP32 精度載入;
- Inference 前顯式將所有線性層權重及偏置轉換為 BF16 格式存儲;
- 執行 Inference 時,采用即時(just-in-time)轉換策略,將權重逐個動態回轉為 FP32 精度進行矩陣乘法運算。
如下圖 Figure 7 所示,該方法確保所有計算均以 FP32 精度執行,同時將權重存儲為內存高效的 16 位格式。因此,該模型既能保持 FP32 在計算過程中的穩定性優勢,又能使內存占用量接近 16 位模型水平。(PS:還是 FP32 計算,依然會有無法利用 FP16 算力的問題)
如下圖 Figure 8 所示,LayerCast 實現了與 FP32 相當的精度,同時可以降低 34% 左右的內存需求:
六、局限性
需要說明的是,LLM Inference 中的數值精度問題確實值得關注,之前的論文 [2408.04667] Non-Determinism of "Deterministic" LLM Settings [6] 和 [2504.07086] A Sober Look at Progress in Language Model Reasoning: Pitfalls and Paths to Reproducibility [5] 也都有關 LLM Inference 穩定性和可復現性的工作。
然而,論文中的工作還有不少局限性,主要是如下的幾個方面:
1. 主要集中在 7B/8B 規模模型,這些結論在更大規模模型是否還適用?比如 Qwen-32B、72B,甚至 DeepSeek R1。之前在模型量化場景中會有個共識:更多預訓練數據訓練、更小規模的模型更難量化,而大規模模型通常更好量化,比如 DeepSeek-R1 使用 FP4 Inference 基本可以保持無損,但是 7B/8B 模型上往往并非如此。
2. 論文中的一個主要評估指標是 AIME’24,而 AIME’24 只有 30 個樣本,少的樣本數量往往容易導致評估中出現較大的方差。如下圖 Table 16 所示,DeepSeek-R1-Distill-Qwen-7B 和 DeepSeek-R1-Distill-Llama-8B 在 AIME’24 上的 Std@Acc 要明顯更大一些,在更多更全面的評估集上會不會有不一樣的結果?
3. 提出的 LayerCast 算法實用價值有限,最主要原因是當前 GPU 都在不斷擴展其低精度算力,FP8 精度基本成為默認選項,更低精度也在不斷發展,比如 NVIDIA Blackwell 和 AMD MI350X/355X 都原生支持 FP6 和 FP4。這些低精度的算力都遠遠大于 FP32 算力,為了可能不太明顯的差異而引入急劇增加的 Inference 成本不是好的選擇。
4. 分析不夠深入,如果能更進一步的分析哪些層、哪些模塊對這種誤差影響更大會更有參考意義,比如選擇部分層使用高精度、大部分層使用低精度,從而避免 Inference 成本的大幅增加。比如 FP8 訓練中經常會將首尾層、Attention 計算維持在 BF16 精度,而只將其他的 Linear 層保持在低精度。
七、參考鏈接:
- [1] https://arxiv.org/abs/2506.09501
- [2] https://www.opencompute.org/documents/ocp-microscaling-formats-mx-v1-0-spec-final-pdf
- [3] https://docs.pytorch.org/docs/stable/generated/torch.use_deterministic_algorithms.html
- [4] https://arxiv.org/abs/2403.07974
- [5] https://arxiv.org/abs/2504.07086
- [6] https://arxiv.org/abs/2408.04667?
本文轉載自???AI閑談???,作者:AI閑談
