返回首頁

GitHub Repo

PyTorch 社群回報 CPU logit 精度缺陷,半精度輸入接近 0.5 時結果可能縮半

10 月 6 日的 PyTorch 2.14 CPU 社群重現指出,logit 的中間運算捨入可能讓特定半精度輸入產生約 50% 相對誤差。回報附有完整輸入枚舉與修補程式碼,但修補尚未經實際建置驗證。

Pytorch Deepdream (https://github.com/gordicaleksa/pytorch-deepdream) by gordicaleksa (https://github.com/gordicaleksa/pytorch-deepdream/commits?author=gordicaleksa) · MIT · Image source
zh-Hant

PyTorch 社群於 10 月 6 日提出一項 CPU 數值精度回報:torch.special.logit 處理 float16、bfloat16 時,可能在取對數前就丟失關鍵精度。回報環境為 PyTorch 2.14.0+cpu、具 AVX512 與 MKL 的 Intel Xeon;float16 輸入約 0.499756 時,輸出約為 −0.000488,float64 參考值則約為 −0.000977,相對誤差接近一半。社群重現

依官方定義,logit 計算 log(x / (1 - x)),並可透過 eps 將輸入限制在指定區間。當 x 接近 0.5,比例接近 1,取對數後的結果接近零;此時中間值的捨入,即使絕對差距很小,也可能形成顯著相對誤差。設定截斷範圍主要處理邊界,無法直接消除區間內的運算精度問題。API 文件

回報者將區間內所有可表示的兩種低精度輸入與 float64 比較,指出 CPU 的減法與除法先按輸入型別捨入,而 CUDA 程式碼先提升至 float 運算。其測試中,先執行 x.float()、計算 logit,再轉回原型別,可將最大誤差降至 0.5 ULP;ULP 表示該數值附近的浮點間距。測試與核心分析

對使用低精度機率做校準、統計轉換或 CPU 後處理的工程師,這提供了一個具體排查方向:跨裝置差異應同時比較絕對與相對誤差,並以較高精度建立參考值。這是依運算機制推導的工程意涵,目前沒有完整模型準確率或訓練損失受影響的證據。官方也說明,CPU 與 GPU 即使輸入相同,仍不保證逐位一致。數值精度說明

回報內的修補建議改用 float 中間運算,最後才轉回低精度。作者明確表示未能建置 PyTorch,僅以 NumPy 模擬驗證修補算術,也未測量效能。截至查核,議題仍開放;後續應觀察上游實測、審查與版本納入情況,不能將附上的程式碼視為已發布修復。修補限制

來源

  1. CPU torch.special.logit 低精度中間捨入問題 #199867
  2. torch.special.logit — PyTorch 2.14 文件
  3. Numerical accuracy — PyTorch 2.14 文件