torch.utils.bottleneck#
创建日期:2018 年 3 月 23 日 | 最后更新日期:2022 年 9 月 28 日
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 运算符就有意义了。
当然,现实要复杂得多,您的脚本可能不会处于这两个极端之一,具体取决于您正在评估的模型部分。如果分析器输出没有帮助,您可以尝试查看 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()
以获取更多信息。