torch.utils.bottleneck#
創建於:2018年3月23日 | 最後更新於:2022年9月28日
torch.utils.bottleneck 是一個工具,可以作為除錯程式瓶頸的初步步驟。它使用 Python 剖析器和 PyTorch 的 autograd 剖析器來彙總指令碼的執行情況。
在命令列上執行它:
python -m torch.utils.bottleneck /path/to/source/script.py [args]
其中 [args] 是傳遞給 script.py 的任意數量的引數,或者執行 python -m torch.utils.bottleneck -h 以獲取更多使用說明。
警告
由於您的指令碼將被剖析,請確保它能在有限的時間內退出。
警告
由於 CUDA 核函式的非同步性質,在針對 CUDA 程式碼執行時,cProfile 輸出和 CPU 模式的 autograd 剖析器可能無法顯示正確的計時:報告的 CPU 時間表示啟動核函式所花費的時間,但不包括核函式在 GPU 上執行的時間,除非該操作進行了同步。執行同步的操作在常規 CPU 模式剖析器下會顯得異常昂貴。在這些計時不正確的場合,CUDA 模式的 autograd 剖析器可能很有幫助。
注意
要決定檢視哪種(僅 CPU 模式或 CUDA 模式)autograd 剖析器輸出,您應該首先檢查您的指令碼是 CPU 密集型(“CPU 總時間遠大於 CUDA 總時間”)。如果是 CPU 密集型,檢視 CPU 模式 autograd 剖析器的結果將有所幫助。另一方面,如果您的指令碼大部分時間都花在 GPU 執行上,那麼在 CUDA 模式 autograd 剖析器的輸出中尋找負責的 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() 以獲取更多資訊。