报告问题#
创建时间: 2025年7月29日 | 最后更新时间: 2025年7月29日
如果提供的解决方法不足以使 torch.compile 正常工作,那么您应该考虑向 PyTorch 报告该问题。但有一些事情可以大大简化我们的工作。
消融#
使用 torch.compile 的 backend= 选项,检查 torch.compile 堆栈中的哪个组件导致了问题。特别是,尝试使用
torch.compile(fn, backend="eager"),它只运行 TorchDynamo,即torch.compile的图捕获组件。torch.compile(fn, backend="aot_eager"),它运行 TorchDynamo 和 AOTAutograd,后者还在编译期间生成反向图。torch.compile(fn, backend="aot_eager_decomp_partition"),它运行 TorchDynamo 和 AOTAutograd,并进行算子分解/分区。torch.compile(fn, backend="inductor"),它运行 TorchDynamo、AOTAutograd 和 TorchInductor,即生成编译后内核的后端 ML 编译器。
如果您仅在使用 Inductor 后端时遇到问题,您还可以测试各种 Inductor 模式
torch.compile(fn, backend="inductor", mode="default")torch.compile(fn, backend="inductor", mode="reduce-overhead")torch.compile(fn, backend="inductor", mode="max-autotune")
您还可以检查动态形状是否导致任何后端出现问题
torch.compile(fn, dynamic=True)(始终使用动态形状)torch.compile(fn, dynamic=False)(从不使用动态形状)torch.compile(fn, dynamic=None)(自动动态形状)
二分查找#
您是否在最新的 nightly 版本上进行了测试?过去有效的东西现在是否不再有效?您能否通过二分查找确定问题首次出现的 nightly 版本?二分查找对于性能、精度或编译时间的回退尤其有用,在这些情况下,问题源头并不明显。
创建可复现的示例#
创建可复现的示例需要大量工作,如果您没有时间去做,那也没关系。但是,如果您是一位热情的用户,不熟悉 torch.compile 的内部机制,创建一个独立的、可复现的示例将极大地提高我们修复 bug 的能力。没有可复现的示例,您的 bug 报告必须包含足够的信息,以便我们找出问题的根本原因并从头开始编写可复现的示例。
以下是有用的可复现示例列表,按偏好程度从高到低排序
独立的、简小的可复现示例: 一个没有外部依赖项的脚本,代码行数少于 100 行,运行后可重现问题。
独立的、大型的可复现示例: 即使代码量大,独立性也是一个巨大的优势!
具有可管理依赖项的非独立可复现示例: 例如,如果您可以通过运行脚本并在
pip install transformers后运行脚本来重现问题,这是可管理的。我们很可能能够运行它并进行调查。需要大量设置的非独立可复现示例: 这可能涉及下载数据集、多个环境设置步骤或需要 Docker 镜像的特定系统库版本。设置越复杂,我们重现环境就越困难。
注意
Docker 简化了设置,但增加了更改环境的复杂性,因此它并非完美的解决方案,尽管我们将根据需要使用它。
如果可能,请尝试使您的可复现示例成为单进程的,因为它们比多进程的可复现示例更容易调试。
此外,下面是一个不详尽的列表,其中包含您可以在问题中检查并尝试在可复现示例中复制的方面
Autograd。是否有张量输入且
requires_grad=True?是否对输出调用了backward()?动态形状。您是否设置了
dynamic=True?或者您是否多次运行测试代码并使用不同的形状?自定义算子。实际工作流程中是否涉及自定义算子?您能否使用 Python 自定义算子 API 复制其某些重要特性?
配置。您是否设置了所有相同的配置?这包括
torch._dynamo.config和torch._inductor.config设置,以及torch.compile的参数,如backend/mode。上下文管理器。您是否复制了任何活动的上下文管理器?这可能是
torch.no_grad、自动混合精度、TorchFunctionMode/TorchDispatchMode、激活检查点、编译过的 autograd 等。张量子类。是否涉及张量子类?