评价此页

报告问题#

创建时间: 2025年7月29日 | 最后更新时间: 2025年7月29日

如果提供的解决方法不足以使 torch.compile 正常工作,那么您应该考虑向 PyTorch 报告该问题。但有一些事情可以大大简化我们的工作。

消融#

使用 torch.compilebackend= 选项,检查 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 报告必须包含足够的信息,以便我们找出问题的根本原因并从头开始编写可复现的示例。

以下是有用的可复现示例列表,按偏好程度从高到低排序

  1. 独立的、简小的可复现示例: 一个没有外部依赖项的脚本,代码行数少于 100 行,运行后可重现问题。

  2. 独立的、大型的可复现示例: 即使代码量大,独立性也是一个巨大的优势!

  3. 具有可管理依赖项的非独立可复现示例: 例如,如果您可以通过运行脚本并在 pip install transformers 后运行脚本来重现问题,这是可管理的。我们很可能能够运行它并进行调查。

  4. 需要大量设置的非独立可复现示例: 这可能涉及下载数据集、多个环境设置步骤或需要 Docker 镜像的特定系统库版本。设置越复杂,我们重现环境就越困难。

注意

Docker 简化了设置,但增加了更改环境的复杂性,因此它并非完美的解决方案,尽管我们将根据需要使用它。

如果可能,请尝试使您的可复现示例成为单进程的,因为它们比多进程的可复现示例更容易调试。

此外,下面是一个不详尽的列表,其中包含您可以在问题中检查并尝试在可复现示例中复制的方面

  • Autograd。是否有张量输入且 requires_grad=True?是否对输出调用了 backward()

  • 动态形状。您是否设置了 dynamic=True?或者您是否多次运行测试代码并使用不同的形状?

  • 自定义算子。实际工作流程中是否涉及自定义算子?您能否使用 Python 自定义算子 API 复制其某些重要特性?

  • 配置。您是否设置了所有相同的配置?这包括 torch._dynamo.configtorch._inductor.config 设置,以及 torch.compile 的参数,如 backend / mode

  • 上下文管理器。您是否复制了任何活动的上下文管理器?这可能是 torch.no_grad、自动混合精度、TorchFunctionMode / TorchDispatchMode、激活检查点、编译过的 autograd 等。

  • 张量子类。是否涉及张量子类?