GitHub Repo
PyTorch 開發版被回報誤用閉包計算圖,修補提案補上運算子檢查
最小案例中,加法與乘法閉包依序編譯後都回傳加法結果。補丁已提出但尚未合併,官方 CI、穩定版影響及預編譯相容性仍待驗證。

PyTorch 社群於 9 月 20 日回報一項編譯正確性問題:同一工廠函式產生的兩個閉包,若捕捉不同張量方法,可能誤用同一份計算圖。21 日已有修補提案,但截至查核仍未合併。這類錯誤可能直接傳回看似正常的數值,值得使用動態函式工廠的模型程式注意。[問題回報](https://github.com/pytorch/pytorch/issues/197811)、[修補提案](https://github.com/pytorch/pytorch/pull/197845)
最小案例讓兩個閉包分別捕捉張量的加法與乘法描述器。輸入 6 與 3,直接執行得到 9 與 18,依序編譯後卻都得到 9。回報環境為 9 月 19 日的 2.15 開發版、CPU 與 Python 3.11;作者稱三次獨立執行均重現,沒有警告或例外。改用頂層加乘函式則正常。[重現條件](https://github.com/pytorch/pytorch/issues/197811)
問題與編譯快取的粒度有關。官方文件說明,`torch.compile` 按程式碼物件保存結果,動態建立的函式副本可能共用快取;是否能重用,依賴守衛檢查執行條件。若閉包捕捉的運算子沒有受到檢查,即使張量形狀與型別符合,也不足以保證運算語意相同。[快取機制](https://docs.pytorch.org/docs/2.14/generated/torch.compile.html)
補丁作者指出,原本的建構流程對描述器略過守衛,提案改為替方法及包裝描述器加入身分比對。選用 `BUILTIN_MATCH` 的理由,是同時支援預編譯所需的守衛序列化;單用 `ID_MATCH` 雖能比對身分,卻會阻礙保存。新增測試涵蓋運算切換、快取重用,以及還原後接受原運算、拒絕另一運算。[補丁設計](https://github.com/pytorch/pytorch/pull/197845)
驗證仍有邊界。作者提供本機測試結果,並排除一項在其環境崩潰的加速器同步測試;公開頁面顯示官方 CI 尚待核准,亦無審核結果。因此,現階段不能宣稱穩定版普遍受影響,或已有正式修復版本。[驗證狀態](https://github.com/pytorch/pytorch/pull/197845)
依據這個案例,工程團隊可在同一程序內交錯執行不同運算閉包,對照未編譯結果,並保留跨呼叫快取。這能檢查跨呼叫的快取污染,尤其適合以設定產生多個模型變體、在長駐服務中重複編譯的工作流程;接著應追蹤補丁合併、支援版本與預編譯還原測試,再決定升級或採用經自行驗證的替代寫法。