评价此页

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.htmltorch.autograd.profiler.profile() 以获取更多信息。