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 為例。
- 執行模型的效能測試腳本 - 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至關重要。
- 在輸出日誌中,尋找以下行 - **Compiled module path: /tmp/torchinductor_shunting/qz/cqz7hvhood7y3psp7fy6msjxsxyli7qiwiybizdwtjw6ffyq5wwd.py** 
對於每個已編譯的模組,我們都有一行。如果沒有額外的圖形中斷,我們會在日誌中看到兩行,一行用於正向圖,另一行用於反向圖。
對於我們的範例命令,我們分別獲得正向圖和反向圖的以下已編譯模組
- https://gist.github.com/shunting314/c2a4d8a28b00fcb5586d0e9d9bf77f9f 
- https://gist.github.com/shunting314/48efc83b12ec3ead950052e4a0220b10 
- 現在,我們可以深入研究每個已編譯模組的效能。讓我們選擇正向圖來進行說明。為了方便起見,我將其命名為 - fwd.py。使用- -p參數直接執行它- **> python fwd.py -p** 
請參閱此 範例 gist 中的完整輸出日誌。
在輸出中,您可以注意到以下內容
- 我們為效能分析寫入了一個 Chrome 追蹤檔案,以便我們可以載入該追蹤並與之互動。在日誌中,尋找如下所示的行以找到追蹤檔案的路徑。 
效能分析的 Chrome 追蹤已寫入 /tmp/compiled_module_profile.json
將追蹤載入 Chrome(在 Chrome 瀏覽器中訪問 chrome://tracing 並按照 UI 的建議載入檔案)將顯示如下所示的 UI

您可以放大和縮小以檢查效能分析。
- 我們透過如下所示的日誌行報告 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% 
 - 此資訊可以在每個核心類別報告的摘要行(最後一行)中找到。 
- 我們還可以放大查看某一類別的核心。例如,讓我們檢查縮減核心   - 我們可以看到每個個別縮減核心執行時間的有序表。我們還可以查看每個核心執行的次數。這很有幫助,原因如下 - 如果一個核心只佔用很少的時間,例如 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
 
為了方便起見,我將其重新命名為 k.py。 這是這個檔案的貼上。
k.py 是一個獨立的 Python 模組,包含核心程式碼及其基準測試。
直接執行 k.py 將會報告其執行時間和頻寬。
 
我們可以通過執行以下命令來檢查最大自動調整是否有助於此核心:
**TORCHINDUCTOR_MAX_AUTOTUNE=1 python /tmp/k.py**
我們也可以暫時添加更多減少啟發式方法並再次執行腳本,以檢查這對核心有何幫助。