返回首頁

GitHub Repo

Transformers 社群回報 ZeRO-3 初始化精度退化,RoPE 頻率可能被降為 BF16

10 月 29 日的 Transformers 社群回報指出,DeepSpeed ZeRO-3 初始化可能降低旋轉位置編碼的頻率精度,影響長序列訓練。作者已提交修補與版本對照,但截至查核時尚未合併,實際模型品質影響仍待驗證。

Marcus Qwertyus · Public domain · Image source
zh-Hant

Hugging Face Transformers 社群於 10 月 29 日提出一項長序列訓練精度回報:使用 DeepSpeed ZeRO-3 與 BF16 載入模型時,旋轉位置編碼(RoPE)的反頻率緩衝區 inv_freq 可能以 BF16 建立,偏離原本保留 FP32 的行為。作者在 5.17.0 與開發主線提供重現,單張 H200 即可觸發。問題回報

問題指向模型初始化與混合精度的交界。作者分析,deepspeed.zero.Init 會攔截張量建構,將浮點結果轉成訓練精度;先前 RoPE 重構改用浮點 torch.arange,因此即使指定 torch.float,仍可能先被降精度。後續把新值複製進既有 BF16 緩衝區,也無法恢復原始精度。修補說明

回報以 head dimension 256、RoPE theta 為一千萬的設定,比較 FP64 參考值:Llama 在位置 65,536 的最大未取模角度誤差,於 ZeRO-3 達 117.7 弧度,對照路徑為 0.003 弧度。這是特定設定的數值誤差,不能直接換算成準確率損失;作者亦指出,測試中的 YaRN 路徑未受影響。重現與量測

DeepSpeed 官方文件說明,ZeRO-3 透過分割模型參數節省記憶體,並提供 zero.Init 建立大型模型。這使初始化階段的精度處理成為值得檢查的環節:工程上可據此推論,只確認權重精度,仍不足以排除位置編碼緩衝區的數值差異。DeepSpeed 文件

修補提案改回先建立 int64 序列、再轉成浮點數,涵蓋 203 個檔案。作者回報修補後恢復 FP32,並附上本機測試結果;截至查核時,PR 仍開啟且沒有審查核准。長上下文微調團隊接下來應關注維護者重現、正式版本納入情況,以及自身模型載入後的 inv_freq 精度與訓練對照,避免將這組數據泛化到所有 RoPE 模型。修補提案

來源

  1. RoPE inv_freq is initialized in bf16 under DeepSpeed ZeRO-3 again
  2. Build RoPE inv_freq from an int64 arange so ZeRO-3 init keeps it fp32
  3. ZeRO — DeepSpeed documentation