torch.utils.bottleneck¶
torch.utils.bottleneck 是一個工具,可以用作偵錯程式中瓶頸的第一步。它使用 Python 分析器和 PyTorch 的自動微分分析器來總結您腳本的執行。
在命令列上執行它,使用
python -m torch.utils.bottleneck /path/to/source/script.py [args]
其中 [args] 是 script.py 的任意數量參數,或執行 python -m torch.utils.bottleneck -h 以獲得更多使用說明。
警告
因為您的腳本將被分析,請確保它在有限的時間內退出。
警告
由於 CUDA 核心是非同步的,因此在針對 CUDA 程式碼執行時,cProfile 輸出和 CPU 模式自動微分分析器可能無法顯示正確的時間:報告的 CPU 時間報告啟動核心所花費的時間,但不包括核心在 GPU 上執行的時間,除非操作執行同步。在常規 CPU 模式分析器下,執行同步的操作似乎非常昂貴。在這些時間不正確的情況下,CUDA 模式自動微分分析器可能會有所幫助。
備註
要決定要查看哪個(僅限 CPU 模式或 CUDA 模式)自動微分分析器輸出,您應該首先檢查您的腳本是否是 CPU 密集型的(“CPU 總時間遠大於 CUDA 總時間”)。如果是 CPU 密集型的,則查看 CPU 模式自動微分分析器的結果將有所幫助。另一方面,如果您的腳本大部分時間都在 GPU 上執行,則在 CUDA 模式自動微分分析器的輸出中尋找負責任的 CUDA 運算子是有意義的。
當然,現實情況要複雜得多,而且您的腳本可能不會處於這兩種極端情況之一,具體取決於您正在評估的模型部分。如果分析器輸出沒有幫助,您可以嘗試查看使用 nvprof 執行的 torch.autograd.profiler.emit_nvtx() 的結果。但是,請注意,NVTX 的開銷非常高,並且經常會導致時間軸嚴重偏斜。同樣,Intel® VTune™ Profiler 有助於使用 torch.autograd.profiler.emit_itt() 進一步分析 Intel 平台上的效能。
警告
如果您正在分析 CUDA 程式碼,則 bottleneck 執行的第一個分析器(cProfile)將在其時間報告中包含 CUDA 啟動時間(CUDA 緩衝區分配成本)。如果您的瓶頸導致程式碼比 CUDA 啟動時間慢得多,則這應該無關緊要。
有關分析器更複雜的使用(例如在多 GPU 情況下),請參閱 https://docs.python.club.tw/3/library/profile.html 或 torch.autograd.profiler.profile() 以獲取更多資訊。