報告問題#
建立時間: 2025年7月29日 | 最後更新時間: 2025年7月29日
如果提供的解決方法不足以使 torch.compile 正常工作,那麼您應該考慮向 PyTorch 報告該問題。但有一些事情可以大大簡化我們的工作。
消融#
使用 torch.compile 的 backend= 選項,檢查 torch.compile 堆疊中的哪個元件導致了問題。特別是,嘗試使用
torch.compile(fn, backend="eager"),它只執行 TorchDynamo,即torch.compile的圖捕獲元件。torch.compile(fn, backend="aot_eager"),它執行 TorchDynamo 和 AOTAutograd,後者還在編譯期間生成反向圖。torch.compile(fn, backend="aot_eager_decomp_partition"),它執行 TorchDynamo 和 AOTAutograd,並進行運算元分解/分割槽。torch.compile(fn, backend="inductor"),它執行 TorchDynamo、AOTAutograd 和 TorchInductor,即生成編譯後核心的後端 ML 編譯器。
如果您僅在使用 Inductor 後端時遇到問題,您還可以測試各種 Inductor 模式
torch.compile(fn, backend="inductor", mode="default")torch.compile(fn, backend="inductor", mode="reduce-overhead")torch.compile(fn, backend="inductor", mode="max-autotune")
您還可以檢查動態形狀是否導致任何後端出現問題
torch.compile(fn, dynamic=True)(始終使用動態形狀)torch.compile(fn, dynamic=False)(從不使用動態形狀)torch.compile(fn, dynamic=None)(自動動態形狀)
二分查詢#
您是否在最新的 nightly 版本上進行了測試?過去有效的東西現在是否不再有效?您能否透過二分查詢確定問題首次出現的 nightly 版本?二分查詢對於效能、精度或編譯時間的回退尤其有用,在這些情況下,問題源頭並不明顯。
建立可復現的示例#
建立可復現的示例需要大量工作,如果您沒有時間去做,那也沒關係。但是,如果您是一位熱情的使用者,不熟悉 torch.compile 的內部機制,建立一個獨立的、可復現的示例將極大地提高我們修復 bug 的能力。沒有可復現的示例,您的 bug 報告必須包含足夠的資訊,以便我們找出問題的根本原因並從頭開始編寫可復現的示例。
以下是有用的可復現示例列表,按偏好程度從高到低排序
獨立的、簡小的可復現示例: 一個沒有外部依賴項的指令碼,程式碼行數少於 100 行,執行後可重現問題。
獨立的、大型的可復現示例: 即使程式碼量大,獨立性也是一個巨大的優勢!
具有可管理依賴項的非獨立可復現示例: 例如,如果您可以透過執行指令碼並在
pip install transformers後執行指令碼來重現問題,這是可管理的。我們很可能能夠執行它並進行調查。需要大量設定的非獨立可復現示例: 這可能涉及下載資料集、多個環境設定步驟或需要 Docker 映象的特定系統庫版本。設定越複雜,我們重現環境就越困難。
注意
Docker 簡化了設定,但增加了更改環境的複雜性,因此它並非完美的解決方案,儘管我們將根據需要使用它。
如果可能,請嘗試使您的可復現示例成為單程序的,因為它們比多程序的可復現示例更容易除錯。
此外,下面是一個不詳盡的列表,其中包含您可以在問題中檢查並嘗試在可復現示例中複製的方面
Autograd。是否有張量輸入且
requires_grad=True?是否對輸出呼叫了backward()?動態形狀。您是否設定了
dynamic=True?或者您是否多次執行測試程式碼並使用不同的形狀?自定義運算元。實際工作流程中是否涉及自定義運算元?您能否使用 Python 自定義運算元 API 複製其某些重要特性?
配置。您是否設定了所有相同的配置?這包括
torch._dynamo.config和torch._inductor.config設定,以及torch.compile的引數,如backend/mode。上下文管理器。您是否複製了任何活動的上下文管理器?這可能是
torch.no_grad、自動混合精度、TorchFunctionMode/TorchDispatchMode、啟用檢查點、編譯過的 autograd 等。張量子類。是否涉及張量子類?