评价此页

ShapeEnv#

class torch.fx.experimental.symbolic_shapes.ShapeEnv(*, should_record_events=None, tracked_fakes=None, **kwargs)[源代码]#
add_var_to_val(expr, val)[源代码]#

将新符号添加到符号环境中。

bind_symbols(placeholders, args)[源代码]#

给定符号占位符(具有符号大小的假张量)和具体参数(具有实际大小的常规张量)的配对列表,返回一个映射每个符号到其真实值的字典。例如,如果您有一个大小为 (s0, s1) 的占位符,将 (2, 4) 绑定到它将得到 {s0: 2, s1: 4}。这不保证绑定 ShapeEnv 中的所有符号;如果符号未出现在任何占位符中,则无法绑定该符号,并且已经有替换的符号不会获得绑定。

这在某种程度上与 evaluate_guards 重复,但它足够不同,所以似乎最好再复制一份。这假设 guards 已经检查过,但如果便宜的话,我们会检查是否有欺骗行为。

返回类型:

dict[sympy.Symbol, int]

bound_sympy(expr, size_oblivious=False)[源代码]#

给定一个 sympy 表达式,计算它可能取值的 ValueRanges 边界。

返回类型:

ValueRanges

check_equal(other)[源代码]#

比较另一个 ShapeEnv 是否等价。

cleanup()[源代码]#

断开引用循环。

这会销毁堆栈。如果你真的想保留它们,我们只需要一种方法来断开对代码对象的引用。

create_symbol(val, source, dynamic_dim=DimDynamic.DUCK, constraint_dim=None, positive=True, do_not_specialize_zero_one=False, symbolic_context=None)[源代码]#

创建由此 ShapeEnv 跟踪的新符号。

返回类型:

Expr

create_symbolic_sizes_strides_storage_offset(ex, source, *, symbolic_context=None)[源代码]#

返回给定张量的符号大小和步幅列表。我们尽力用大小来表示步幅,以避免引入新的符号变量。

返回类型:

tuple[tuple[IntLikeType, …], tuple[IntLikeType, …], IntLikeType]

create_symboolnode(sym)[源代码]#

从 sympy 布尔表达式创建 SymBool 对象。

返回类型:

SymBool

create_symfloatnode(sym, *, hint, source=None)[源代码]#

从符号表达式创建 SymFloat 值。

返回类型:

FloatLikeType

create_symintnode(sym, *, hint, source=None)[源代码]#

从符号表达式创建 SymInt 值。

如果您知道要创建的 SymInt 的当前提示值,请将其传递给 hint。否则,请传递 None,我们将尽力猜测。

返回类型:

IntLikeType

create_unbacked_symbool()[源代码]#

创建没有提示值的符号布尔值。

返回类型:

SymBool

create_unbacked_symfloat()[源代码]#

创建没有提示值的符号浮点数。

返回类型:

SymFloat

create_unbacked_symint(source=None)[源代码]#

创建没有提示值的符号整数。

返回类型:

SymInt

create_unspecified_symbol(val, source, dynamic_dim=DimDynamic.DUCK, constraint_dim=None, symbolic_context=None)[源代码]#

创建一个未指定值的符号。

与标准符号相比,我们不假设值为正,也不对零或一值进行特殊化。

返回类型:

Expr

create_unspecified_symint_and_symbol(value, source, dynamic_dim)[源代码]#

创建一个包装新未指定符号的 SymInt。

返回类型:

IntLikeType

deserialize_symexpr(code)[源代码]#

供 compile_fx 用于反序列化 symexprs。

返回类型:

SymInt | SymFloat | SymBool

evaluate_expr(orig_expr, hint=None, fx_node=None, size_oblivious=False, fallback_value=None, *, forcing_spec=False)[源代码]#

给定一个表达式,对其进行求值,并在必要时添加 guards。当 fallback_value 不为 None 时,该函数将返回 fallback_value 而不是因数据依赖性错误而失败。

返回类型:

Basic

evaluate_guards_expression(code, args)[源代码]#

预期与 produce_guards_expression() 一起使用。为给定的具体参数求值由 produce_guards_expression() 生成的表达式。

返回类型:

布尔值

evaluate_guards_for_args(placeholders, args, *, ignore_static=True)[源代码]#

为图的占位符值生成 guards,并使用 args 求值 guards。

返回类型:

布尔值

evaluate_sym_node(sym_node, size_oblivious=False, fallback_value=None)[源代码]#

给定一个 SymNode,求值 sym_node.expr,并在必要时添加 guards。

返回类型:

Basic

evaluate_symexpr(code)[源代码]#

供 compile_fx 用于求值 symexprs。

返回类型:

int | float | bool

format_guards(verbose=False)[源代码]#

以可选的 traceback 信息格式化此 shape env 的 guard 表达式(如果 verbose)。

返回类型:

str

freeze()[源代码]#

冻结此 ShapeEnv 以停止累积 guards。

已冻结的 ShapeEnv 将忽略在其上生成的任何后续 guards,仅发出警告,这可能导致准确性问题。

freeze_runtime_asserts()[源代码]#

冻结此 ShapeEnv 以停止添加延迟的运行时断言。

如果您尝试安装新的运行时断言,当它被冻结时,我们将报错。这可能表明存在降低违规,或者可能是一些我们静态已知为 True 但我们以一种不易于解除的方式对其进行检查。

get_axioms(symbols=None, compute_hint=False)[源代码]#

给定表达式中的符号,它将返回所有引用这些符号的运行时断言,并与所有 guards 组合。如果 symbols 为 None,则返回所有运行时断言(以及所有 guards)。

返回类型:

tuple[sympy.logic.boolalg.Boolean, …]

get_implications(e)[源代码]#

给定一个表达式,它返回一个从该表达式推导出的谓词列表。

返回类型:

tuple[tuple[sympy.logic.boolalg.Boolean, BooleanAtom], …]

get_nontrivial_guards()[源代码]#

返回一个 guards 表达式列表,这些表达式不是静态已知的(即,非平凡的)。

返回类型:

list[sympy.logic.boolalg.Boolean]

get_pruned_guards(symints)[源代码]#

获取 guards 列表,但进行修剪,使其仅提供引用传入输入的 symints 的 guards。

返回类型:

list[ShapeGuard]

guard_or_defer_runtime_assert(orig_expr, msg, fx_node=None)[源代码]#

如果可能,添加一个 guard 使 orig_expr 为 True,或者回退到添加一个在运行时检查的断言。

参数:
  • orig_expr (sympy.Expr) – 断言为真的布尔表达式

  • msg (str) – 在断言失败时显示的错误消息

  • fx_node (Optional, torch.fx.Node) – self.graph 中对应于表达式的节点,如果适用

返回类型:

布尔值

ignore_fresh_unbacked_symbols()[源代码]#

指示新分配的未备份 SymInts 被丢弃。

返回类型:

Iterator[None]

is_unbacked_symint(symbol)[源代码]#

检查 sympy 符号是否匹配未备份符号的命名约定。

返回类型:

布尔值

patch_source_specialization(source, check_fn)[源代码]#

暂时向 ShapeEnv 添加符号级别的公理。这在您想要“分叉”并拥有 ShapeEnvs 的并行宇宙时很有用。例如,我们在进行多图编译时使用它,以便支持具有不同专业化程度的各种图。

此上下文管理器允许基于应用于与源相关的符号的专业化函数来临时向形状环境添加约束。

参数:
  • source (Source) – 要专业化的符号的来源。

  • check_fn (Callable[[Symbol], Expr]) – 一个函数,它接受一个 sympy Symbol 并返回一个 sympy 表达式,表示要应用的约束/专业化。

返回类型:

Iterator[None]

produce_guards(*args, **kwargs)[源代码]#

类似于 produce_guards_verbose,但仅返回非 verbose 的 Python guard 表达式(不生成 verbose guards)。

返回类型:

list[str]

produce_guards_expression(placeholders, *, guards=None, ignore_static=True)[源代码]#

预期与 evaluate_guards_expression() 一起使用。为给定的占位符生成 guards,并返回一个字符串表达式,该表达式由 evaluate_guards_expression() 使用占位符的具体值进行求值。

返回类型:

Optional[str]

produce_guards_verbose(placeholders, sources, source_ref=<function ShapeEnv.<lambda>>, *, guards=None, input_contexts=None, equalities_inputs=None, _simplified=False, ignore_static=True, langs=('python', 'verbose_python'))[源代码]#

生成一个 guards 字符串列表,当在定义了所有源的张量的上下文中进行求值时,根据列表中的 guards 是否评估为 True 来返回 True 或 False。主要由 Dynamo 使用,但也有助于手动测试 guards(请参阅 evaluate_guards_for_args)。

为了方便测试,源可以是一个字符串,在这种情况下,我们将假设它是一个 LocalSource。

simplified 允许您省略 duck sizing、equality 和 0/1 guards。这在您不关心样板 guards 时很有用,并且可能对用户输出也有帮助(但要小心;一些 equality guards 是非平凡的!最好也能打印 simplified 输出)。它是私有的,因为它不用于正常使用。

默认情况下,返回 python guards 和带有 verbose 注释的 python guards(verbose)。

返回类型:

list[_ShapeGuardsHelper]

replace(expr)[源代码]#

将符号替换应用于给定表达式中的任何符号。

返回类型:

_SympyT

set_unbacked_var_to_val(k, v)[源代码]#

仅在 propagate_real_tensors 时使用;注册一个未备份符号的值,该值可用作最后的手段来解析提示。

simplify(expr, size_oblivious=False)[源代码]#

使用已知的约束和替换来简化给定的 expr。

返回类型:

_SympyT

size_hint(expr, *, allow_none=False)[源代码]#

从我们底层的形状获取给定表达式的大小提示。不引入 guard,因此仅在您可以保证代码对于任意形状仍然有效时使用(例如,优化决策)。

返回类型:

Basic | None

suppress_guards()[源代码]#

内部忽略所有 guards 的上下文管理器。

返回类型:

_GeneratorContextManager[None]