torch.utils.bottleneck¶
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 运算符才有意义。
当然,现实情况要复杂得多,您的脚本可能不属于这两种极端情况,具体取决于您正在评估的模型部分。如果分析器输出没有帮助,您可以尝试查看 torch.autograd.profiler.emit_nvtx()
配合 nvprof
的结果。但是,请注意 NVTX 开销非常高,通常会给出严重扭曲的时间线。类似地,Intel® VTune™ Profiler
配合 torch.autograd.profiler.emit_itt()
有助于进一步分析 Intel 平台上的性能。
警告
如果您正在分析 CUDA 代码,bottleneck
运行的第一个分析器(cProfile)将把 CUDA 启动时间(CUDA 缓冲区分配成本)包含在其时间报告中。如果您的瓶颈导致的执行时间比 CUDA 启动时间慢得多,那么这应该无关紧要。
对于更复杂的分析器使用(例如在多 GPU 情况下),请参阅 https://docs.pythonlang.cn/3/library/profile.html 或 torch.autograd.profiler.profile()
以获取更多信息。