torch.compiler.allow_in_graph#
- torch.compiler.allow_in_graph(fn)[源代码]#
告知编译器前端 (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()装饰器来绕过 Dynamo。我们要求
fn遵守以下限制。不遵守将导致未定义行为fn的输入必须是 FX 图中的 Proxy-able 类型。有效类型包括:Tensor/int/bool/float/None/List[Tensor?]/List[int?]/List[float?] Tuple[Tensor?, …]/Tuple[int?, …]/Tuple[float?, …]/torch.dtype/torch.devicefn的输出必须是 FX 图中的 Proxy-able 类型 (请参阅上一条)。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()的图。