返回首頁

GitHub Repo

PyTorch 2.14 被回報原地轉置數值錯誤,涉及 CUDA 編譯融合

一份 RTX 4070 重現案例顯示,部分張量尺寸經 torch.compile 後會產生錯誤結果。回報指向迴圈重排與讀寫相依性,修補及跨環境影響仍待確認。

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

9 月 22 日,PyTorch 社群回報 2.14.0 的 CUDA 編譯路徑會在部分原地矩陣轉置中產生錯誤數值。案例使用 RTX 4070 與 CUDA 13.0;直接執行正常,經 `torch.compile` 後則隨張量尺寸出現差異,目前仍是待處理的公開回報。[問題紀錄](https://github.com/pytorch/pytorch/issues/198280)

重現程式先轉置最後兩個維度、乘以一,再以 `copy_` 寫回原張量。回報者測試八萬個五乘五矩陣時,五次執行各有數千至上萬個元素不同。其分析指向相依性檢查與迴圈重排的交互作用:編譯器先移除一道讀寫順序約束,再調整迴圈,最後把轉置讀取與原地寫入融合到同一核心。[重現與編譯分析](https://github.com/pytorch/pytorch/issues/198280)

這牽涉編譯後是否保留程式語意。官方文件說明,`torch.compile` 預設使用 Inductor,並可依輸入條件產生不同編譯結果。因此,工程上的推論是:小尺寸案例通過,仍不足以保證實際批次正確;僅確認程式沒有拋出例外,也無法驗證輸出數值。[編譯介面](https://docs.pytorch.org/docs/2.14/generated/torch.compile.html)

官方將 `clone` 定義為建立輸入的副本,且預設會保留符合條件張量的記憶體格式。就工程驗證而言,仍須核對編譯後的數值是否符合副本語意,不能只看原始程式有沒有呼叫複製函式。[複製介面](https://docs.pytorch.org/docs/2.14/generated/torch.clone.html)

回報中的 `clone()` 與 `contiguous()` 改寫也出現相同問題,不能直接當成修復。關閉迴圈重排後,回報者的案例恢復正常,但這項內部設定尚不能視為普遍有效的部署方案。[回報細節](https://github.com/pytorch/pytorch/issues/198280)

排查時可依官方指引,分別用 eager、aot_eager 與 Inductor 後端縮小故障範圍,再以未編譯版本對照多種形狀與重複執行結果。若工作流程會反覆更新同一緩衝區,本文建議連中間張量一起比對,並保存版本、驅動及最小重現程式,避免只檢查最終輸出形狀。這些是定位手段;跨顯卡、其他資料型別及模型端影響,仍須實測。[官方排查指南](https://docs.pytorch.org/docs/2.14/user_guide/torch_compiler/torch.compiler_troubleshooting.html)

同日建立的 2.14.1 追蹤頁,將靜默數值錯誤列入可接受的關鍵修補類別,但要求個別提交經申請、測試與核准。截至查核,不能據此宣稱本案已修復或確定納入下一版。後續應追蹤修補提交、回歸測試與正式發布紀錄。[版本追蹤](https://github.com/pytorch/pytorch/issues/198239)

來源

  1. PyTorch issue #198280:原地轉置的 CUDA 編譯數值錯誤
  2. torch.compile — PyTorch 2.14 documentation
  3. torch.clone — PyTorch 2.14 documentation
  4. torch.compile Troubleshooting
  5. PyTorch v2.14.1 Release Tracker