TorchDynamo API 用于细粒度跟踪¶
注意
在本文件中,torch.compiler.compile
和 torch.compile
可互换使用。这两个版本在您的代码中都可以正常工作。
torch.compile
对整个用户模型执行 TorchDynamo 跟踪。但是,模型代码中可能有一小部分无法由 torch.compiler
处理。在这种情况下,您可能希望在该特定部分禁用编译器,同时对模型的其余部分运行编译。本节介绍用于定义要跳过编译的代码部分的现有 API 以及相关用例。
以下表格列出了您可以用来定义禁用编译代码部分的 API。
API |
描述 |
何时使用? |
---|---|---|
|
禁用装饰函数以及递归调用函数的 Dynamo。 |
如果模型的一小部分无法使用 |
|
禁止在 TorchDynamo 图中标记的操作。TorchDynamo 会导致图中断,并在急切模式(不编译)下运行操作。这适用于操作,而 |
如果自定义操作(如 |
|
注释的可调用对象按原样进入 TorchDynamo 图。例如,TorchDynamo Dynamo 的黑盒。请注意,AOT Autograd 会跟踪它,因此 |
此 API 适用于模型中已知 TorchDynamo 难以支持的功能部分,例如钩子或 |
|
添加图中断。图中断之前和之后的代码都将通过 TorchDynamo。 |
**很少用于部署** - 如果你认为你需要它,很可能你需要 |
|
指示图是否作为 torch.compile() 或 torch.export() 的一部分执行/跟踪。 |
|
|
指示图是否通过 TorchDynamo 跟踪。它比 torch.compiler.is_compiling() 标志更严格,因为它仅在使用 TorchDynamo 时才会设置为 True。 |
torch.compiler.disable
¶
torch.compiler.disable
在装饰的函数帧及其从装饰的函数帧递归调用的所有函数帧上禁用编译。
TorchDynamo 会拦截每个 Python 函数帧的执行。因此,假设您有一个代码结构(下图所示),其中函数 fn
调用函数 a_fn
和 b_fn
。而 a_fn
调用 aa_fn
和 ab_fn
。当您使用 PyTorch 急切模式而不是 torch.compile
时,这些函数帧按原样运行。使用 torch.compile
时,TorchDynamo 会拦截每个函数帧(用绿色表示)。

假设函数 a_fn
在使用 torch.compile
时遇到了问题。并且这是模型中一个非关键部分。您可以在函数 a_fn
上使用 compiler.disable
。如上所示,TorchDynamo 将停止查看源自 a_fn
调用的帧(白色表示原始 Python 行为)。
要跳过编译,您可以使用 @torch.compiler.disable
装饰有问题的函数。
如果您不想更改源代码,也可以使用非装饰器语法。但是,我们建议您尽可能避免这种风格。在这里,您必须注意原始函数的所有用户现在都在使用修补后的版本。
torch._dynamo.disallow_in_graph
¶
torch._dynamo.disallow_in_graph
禁止运算符出现在 TorchDynamo 提取的图中,但不禁止函数出现。请注意,这适用于运算符,而不是像 _dynamo.disable
那样的一般函数。
假设您使用 PyTorch 编译模型。TorchDynamo 能够提取图,但您发现下游编译器出现故障。例如,元内核丢失,或者某个特定运算符的 Autograd 派遣键设置不正确。然后,您可以将该运算符标记为 disallow_in_graph
,TorchDynamo 将导致图断裂并使用 PyTorch 急切模式运行该运算符。
需要注意的是,您需要找到相应的 Dynamo 级运算符,而不是 ATen 级运算符。有关更多信息,请参阅文档的“限制”部分。
警告
torch._dynamo.disallow_in_graph
是一个全局标志。如果您正在比较不同的后端编译器,则可能需要在切换到另一个编译器时为被禁止的运算符调用 allow_in_graph
。
torch.compiler.allow_in_graph
¶
torch.compiler.allow_in_graph
在相关函数帧具有某些已知的难以支持的 TorchDynamo 功能(例如钩子和 autograd.Function
)时非常有用,并且您确信下游 PyTorch 组件(例如 AOTAutograd)可以安全地跟踪经过修饰的函数。当函数使用 allow_in_graph
修饰时,TorchDynamo 将其视为黑盒,并将其原样放入生成的图中。
警告
allow_in_graph
完全跳过 TorchDynamo 对经过修饰的函数,省略所有 TorchDynamo 安全检查,包括图断裂、处理闭包等。请谨慎使用 allow_in_graph。PyTorch 下游组件(例如 AOTAutograd)依赖 TorchDynamo 来处理复杂的 Python 功能,但 allow_in_graph
会绕过 TorchDynamo。使用 allow_in_graph
可能会导致健壮性和难以调试的问题。
限制¶
所有现有的 API 都应用于 TorchDynamo 级。因此,这些 API 只能看到 TorchDynamo 所看到的内容。这会导致令人困惑的情况。
例如,torch._dynamo.disallow_in_graph
不会对 ATen 运算符起作用,因为它们对 AOT Autograd 可见。例如,torch._dynamo.disallow_in_graph(torch.ops.aten.add)
在上面的示例中将不起作用。