捷徑

TorchInductor GPU 效能分析

本節列出一些有用的命令和工作流程,可以幫助您深入了解模型在 TorchInductor 中的效能。當模型的執行速度不如預期時,您可能需要檢查模型的個別核心。通常,那些佔用大部分 GPU 時間的核心是最令人感興趣的。之後,您可能還想直接執行個別核心並檢查其效能。PyTorch 提供了涵蓋上述所有內容的工具。

相關環境變數

您可以在分析中使用以下環境變數

  • TORCHINDUCTOR_UNIQUE_KERNEL_NAMES

    • 根據預設,TorchInductor 將 Triton 核心命名為 ‘triton\_’。啟用此環境變數後,Inductor 會在追蹤中產生更有意義的核心名稱,例如 triton_poi_fused_cat_155,其中包含核心類別(poi 表示逐點運算)和原始 ATen 運算子。根據預設,此設定處於停用狀態,以提高編譯快取命中的機會。

  • TORCHINDUCTOR_BENCHMARK_KERNEL

    • 啟用此選項將使 Inductor 程式碼產生工具測試個別 Triton 核心的效能。

  • TORCHINDUCTOR_MAX_AUTOTUNE

    • Inductor 自動調整器將測試更多 triton.Configs 並選擇效能最佳的配置。這將會增加編譯時間,但希望能提高效能。

細分模型 GPU 時間

以下是將模型的執行時間細分為個別核心的步驟。我們以 mixnet_l 為例。

  1. 執行模型的效能測試腳本

    TORCHINDUCTOR_UNIQUE_KERNEL_NAMES=1 TORCHINDUCTOR_BENCHMARK_KERNEL=1
    python -u benchmarks/dynamo/timm_models.py –backend inductor –amp
    –performance –dashboard –only mixnet_l –disable-cudagraphs –training
    

    注意

    該工具依靠核心名稱來決定其類別。啟用 TORCHINDUCTOR_UNIQUE_KERNEL_NAMES 至關重要。

  2. 在輸出日誌中,尋找以下行

    **Compiled module path:
    /tmp/torchinductor_shunting/qz/cqz7hvhood7y3psp7fy6msjxsxyli7qiwiybizdwtjw6ffyq5wwd.py**
    

對於每個已編譯的模組,我們都有一行。如果沒有額外的圖形中斷,我們會在日誌中看到兩行,一行用於正向圖,另一行用於反向圖。

對於我們的範例命令,我們分別獲得正向圖和反向圖的以下已編譯模組

  1. 現在,我們可以深入研究每個已編譯模組的效能。讓我們選擇正向圖來進行說明。為了方便起見,我將其命名為 fwd.py。使用 -p 參數直接執行它

    **> python fwd.py -p**
    

請參閱此 範例 gist 中的完整輸出日誌。

在輸出中,您可以注意到以下內容

  • 我們為效能分析寫入了一個 Chrome 追蹤檔案,以便我們可以載入該追蹤並與之互動。在日誌中,尋找如下所示的行以找到追蹤檔案的路徑。

效能分析的 Chrome 追蹤已寫入 /tmp/compiled_module_profile.json

將追蹤載入 Chrome(在 Chrome 瀏覽器中訪問 chrome://tracing 並按照 UI 的建議載入檔案)將顯示如下所示的 UI

_images/trace.png

您可以放大和縮小以檢查效能分析。

  • 我們透過如下所示的日誌行報告 GPU 時間相對於實際時間的百分比

    GPU 忙碌時間百分比:102.88%

    有時您可能會看到大於 100% 的值。原因是 PyTorch 使用啟用效能分析時的核心執行時間,而使用停用效能分析時的實際時間。效能分析可能會稍微扭曲核心執行時間。但總的來說,這應該不是什麼大問題。

    如果我們使用較小的批次大小執行 densenet121 之類的模型,我們會看到 GPU 忙碌時間百分比較低

    (Forward graph) Percent of time when GPU is busy: 32.69%
    

    這意味著模型有大量的 CPU 負擔。這與啟用 cudagraphs 可以顯著提高 densenet121 效能的事實是一致的。

  • 我們可以將 GPU 時間細分為不同類別的核心。在 mixnet_l 範例中,我們看到

    • 逐點運算核心佔用 28.58%

    • 縮減核心佔用 13.85%

    • 持久性縮減核心佔用 3.89%

    • 其餘的是用於 mm/conv 的 cutlass/cudnn 核心,佔用 56.57%

    此資訊可以在每個核心類別報告的摘要行(最後一行)中找到。

  • 我們還可以放大查看某一類別的核心。例如,讓我們檢查縮減核心

    _images/kernel_breakdown.png

    我們可以看到每個個別縮減核心執行時間的有序表。我們還可以查看每個核心執行的次數。這很有幫助,原因如下

    • 如果一個核心只佔用很少的時間,例如 0.1%,那麼改進它最多只能帶來 0.1% 的整體收益。不值得在上面花費太多精力。

    • 如果一個核心佔用 2% 的時間,那麼將其改進 2 倍將帶來 1% 的整體收益,這是值得努力的。

基準測試個別 Triton 核心

假設我們想仔細看看 triton_red_fused\__native_batch_norm_legit_functional_16,它是成本最高的縮減核心,佔用正向圖整體實際時間的 2.19%。

我們可以在 fwd.py 中查找核心名稱,並找到如下註釋:

# 核心路徑:/tmp/torchinductor_shunting/jk/cjk2vm3446xrk7rth7hr6pun7xxo3dnzubwcn6ydrpifal4eykrz.py

_images/inductor_code.png

為了方便起見,我將其重新命名為 k.py。 這是這個檔案的貼上。

k.py 是一個獨立的 Python 模組,包含核心程式碼及其基準測試。

直接執行 k.py 將會報告其執行時間和頻寬。

_images/terminal_printout.png

我們可以通過執行以下命令來檢查最大自動調整是否有助於此核心:

**TORCHINDUCTOR_MAX_AUTOTUNE=1 python /tmp/k.py**

我們也可以暫時添加更多減少啟發式方法並再次執行腳本,以檢查這對核心有何幫助。

文件

訪問 PyTorch 的完整開發者文件

查看文件

教學課程

獲取針對初學者和高級開發人員的深入教學課程

查看教學課程

資源

尋找開發資源並獲得問題解答

查看資源