评价此页

torch.compiler.allow_in_graph#

torch.compiler.allow_in_graph(fn)[source]#

告诉编译器前端 (Dynamo) 跳过该函数的符号化自省,而是在遇到时直接将其写入图。

如果您正在使用 torch.compile()(后端为 “inductor”(默认),或 torch.export.export()),并尝试在所有跟踪中将 Python 函数视为黑盒,请勿使用此 API。而是应创建一个自定义运算符(请参阅 PyTorch 自定义运算符登陆页)。

警告

如果您是典型的 torch.compile 用户(例如,您将 torch.compile 应用于模型以提高其运行速度),您可能不希望使用此函数。allow_in_graph() 是一个“枪柄”,因为它会跳过负责安全检查(图中断、处理闭包等)的编译器前端(Dynamo)。不当使用会导致难以调试的静默不正确问题。

给定一个没有 allow_in_graph 装饰器的 Python 函数,torch.compile 的常规执行会跟踪该函数。allow_in_graph() 会将其更改为,前端不会跟踪该函数内部,但编译器后端仍会跟踪它。与自定义运算符相比,后者将函数视为整个 torch.compile 堆栈中的黑盒。下表对此类机制进行了比较。

机制

前端 (Dynamo)

后端 (AOTAutograd+Inductor)

无装饰器

跟踪内部

跟踪内部

allow_in_graph

不透明的可调用对象

跟踪内部

自定义运算符

不透明的可调用对象

不透明的可调用对象

allow_in_graph() 的一个常见用例是作为编译器前端的逃生舱:如果您知道该函数对于编译堆栈的下游组件(AOTAutograd 和 Inductor)是有效的,但存在一个阻止其正确符号化自省该函数的 Dynamo 错误(或者如果您的代码是用 C/C++ 编写的,因此无法通过 Dynamo 进行自省),那么您可以使用 allow_in_graph() 来装饰 said 函数,以绕过 Dynamo。

我们要求 fn 遵守以下限制。不遵守将导致未定义的行为。

  • fn 的输入必须是 FX 图中的 Proxyable 类型。有效类型包括:Tensor/int/bool/float/None/List[Tensor?]/List[int?]/List[float?] Tuple[Tensor?, …]/Tuple[int?, …]/Tuple[float?, …]/torch.dtype/torch.device

  • fn 的输出必须是 FX 图中的 Proxyable 类型(请参阅上一条)。

  • fn 内部使用的所有 Tensor 都必须直接作为输入传递给 fn(而不是作为捕获的变量)。

参数

fn – 一个代表要包含在图中的函数的调用对象。如果 fn 是一个可调用对象的列表或元组,它将递归地将 allow_in_graph() 应用于每个函数,并返回一个包含修改后的函数的新列表或元组。

示例

torch.compiler.allow_in_graph(my_custom_function)

@torch.compile(...)
def fn(x):
    x = torch.add(x, 1)
    x = my_custom_function(x)
    x = torch.add(x, 1)
    return x

fn(...)

将捕获一个包含 my_custom_function() 的单个图。