評價此頁

ShapeEnv#

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

向符號環境中新增一個新的符號。

bind_symbols(placeholders, args)[source]#

給定符號化大小的佔位符(fake tensors)和具有真實大小的具體引數(regular tensors)的成對列表,返回一個將每個符號對映到其真實值的字典。例如,如果一個佔位符的大小為 (s0, s1),將其繫結到 (2, 4) 將得到 {s0: 2, s1: 4}。這不保證繫結 ShapeEnv 中的所有符號;如果一個符號不出現在任何佔位符中,我們將無法繫結它,而已經有替代項的符號也不會被繫結。

這與 evaluate_guards 有些重複,但又足夠不同,因此建立另一個副本似乎是最清晰的做法。這假設 guards 已經檢查過,但如果開銷很小,我們會檢查是否存在意外情況。

返回型別

dict[sympy.Symbol, int]

bound_sympy(expr, size_oblivious=False)[source]#

給定一個 sympy 表示式,計算它可以取值的 ValueRanges 邊界。

返回型別

ValueRanges

check_equal(other)[source]#

比較另一個 ShapeEnv 是否等價。

cleanup()[source]#

斷開迴圈引用。

這會銷燬堆疊。如果你真的想保留它們,我們只需要一種方法來斷開程式碼物件的引用。

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

建立由此 ShapeEnv 跟蹤的新符號。

返回型別

Expr

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

為給定的張量返回符號化的尺寸和步幅列表。我們盡力用尺寸來表示步幅,以免引入新的符號變數。

返回型別

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

create_symboolnode(sym)[source]#

從 sympy 布林表示式建立 SymBool 物件。

返回型別

SymBool

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

從符號表達式建立 SymFloat 值。

返回型別

FloatLikeType

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

從符號表達式建立 SymInt 值。

如果您知道要建立的 SymInt 的當前提示值,請將其傳遞給 hint。否則,請傳遞 None,我們將盡最大努力進行猜測。

返回型別

IntLikeType

create_unbacked_symbool()[source]#

建立沒有提示值的符號布林值。

返回型別

SymBool

create_unbacked_symfloat()[source]#

建立沒有提示值的符號浮點數。

返回型別

SymFloat

create_unbacked_symint(source=None)[source]#

建立沒有提示值的符號整數。

返回型別

SymInt

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

建立具有不確定值的符號。

與標準符號相比,我們不假定值為正,也不針對零或一值進行專門化。

返回型別

Expr

create_unspecified_symint_and_symbol(value, source, dynamic_dim)[source]#

建立包裝新不確定符號的 SymInt。

返回型別

IntLikeType

deserialize_symexpr(code)[source]#

供 compile_fx 反序列化 symexpr 使用。

返回型別

Union[SymInt, SymFloat, SymBool]

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

給定一個表示式,對其進行求值,並在必要時新增 guard。當 fallback_value 不為 None 時,函式將返回 fallback_value 而不是因資料依賴而失敗。

返回型別

Basic

evaluate_guards_expression(code, args)[source]#

預期與 produce_guards_expression() 一起使用。為給定的具體引數求值由 produce_guards_expression() 生成的表示式。

返回型別

布林值

evaluate_guards_for_args(placeholders, args, *, ignore_static=True)[source]#

為圖的佔位符值生成 guards 並使用 args 對 guards 進行求值。

返回型別

布林值

evaluate_sym_node(sym_node, size_oblivious=False, fallback_value=None)[source]#

給定一個 SymNode,對其 expr 進行求值,並在必要時新增 guards。

返回型別

Basic

evaluate_symexpr(code)[source]#

供 compile_fx 求值 symexpr 使用。

返回型別

Union[int, float, bool]

format_guards(verbose=False)[source]#

根據可選的 traceback 資訊格式化此 shape env 的 guard 表示式(如果 verbose 為 True)。

返回型別

str

freeze()[source]#

凍結此 ShapeEnv 以停止累積 guards。

已凍結的 ShapeEnv 將忽略在其上生成的任何後續 guards,僅發出警告,這可能導致準確性問題。

freeze_runtime_asserts()[source]#

凍結此 ShapeEnv 以停止新增延遲的執行時斷言。

如果您嘗試安裝新的執行時斷言,當它被凍結時,我們將報錯。這可能表示一個 lowering 違規,或者可能是我們靜態已知為 True 但以一種無法清楚證明的方式再次檢查它的情況。

get_axioms(symbols=None, compute_hint=False)[source]#

給定表示式中的符號,它會返回所有與這些符號相關的執行時斷言,並與所有 guards 連線。如果 symbols 為 None,則返回所有執行時斷言(以及所有 guards)。

返回型別

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

get_implications(e)[source]#

給定一個表示式,它會返回該表示式的謂詞列表。

返回型別

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

get_nontrivial_guards()[source]#

返回一組不被靜態已知的 guard 表示式(即非平凡的)。

返回型別

list[‘sympy.logic.boolalg.Boolean’]

get_pruned_guards(symints)[source]#

獲取 guards 列表,但進行了修剪,使其僅提供引用傳入的 symints 的 guards。

返回型別

list[torch._guards.ShapeGuard]

guard_or_defer_runtime_assert(orig_expr, msg, fx_node=None)[source]#

在可以的情況下,新增一個 guard 使 orig_expr 為 True,或者回退到新增一個在執行時檢查的 assert。

引數
  • orig_expr (sympy.Expr) – 斷言為真的布林表示式

  • msg (str) – 在斷言失敗時顯示的錯誤訊息

  • fx_node (Optional, torch.fx.Node) – `self.graph` 中與表示式對應的節點,如果適用。

返回型別

布林值

ignore_fresh_unbacked_symbols()[source]#

指示新分配的未備份 SymInts 將被丟棄。

返回型別

Iterator[None]

is_unbacked_symint(symbol)[source]#

檢查 sympy 符號是否符合未備份符號的命名約定。

返回型別

布林值

patch_source_specialization(source, check_fn)[source]#

暫時向 ShapeEnv 新增符號級別的公理。這在您希望“分叉”並擁有並行 ShapeEnvs 時很有用。例如,我們在進行多圖編譯時使用它,以便支援具有不同專業化級別的各種圖。

此上下文管理器允許根據應用於與源關聯的符號的專業化函式,暫時向 shape 環境新增約束。

引數
  • source (Source) – 要專業化的符號的源。

  • check_fn (Callable[[Symbol], Expr]) – 一個函式,它接受一個 sympy Symbol 並返回一個 sympy 表示式,表示要應用的約束/專業化。

返回型別

Iterator[None]

produce_guards(*args, **kwargs)[source]#

類似於 produce_guards_verbose,但僅返回非 verbose 的 Python guard 表示式(不生成 verbose guards)。

返回型別

list[str]

produce_guards_expression(placeholders, *, guards=None, ignore_static=True)[source]#

預期與 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'))[source]#

生成 guards 字串列表,當在定義了所有源的張量的上下文中進行求值時,根據 guards 列表是否為 True 來返回 True 或 False。主要由 Dynamo 使用,但這也對 guards 的手動測試很有幫助(請參閱 evaluate_guards_for_args)。

為了方便測試,源可以是一個 str,在這種情況下,我們假設它是一個 LocalSource。

simplified 允許您省略 duck sizing、equality 和 0/1 guards。這在您不關心樣板 guards 的測試中很有用,並且可能也有助於使用者輸出(但要小心;一些 equality guards 是 nontrivial 的!如果 simplified 輸出也能列印它們會很好)。它是私有的,因為它不用於正常使用。

預設返回 python guards 和帶 verbose 註釋的 python guards(verbose)。

返回型別

list[_ShapeGuardsHelper]

replace(expr)[source]#

將符號替換應用於給定表示式中的任何符號。

返回型別

_SympyT

set_unbacked_var_to_val(k, v)[source]#

僅在 propagate_real_tensors 時使用;註冊一個未備份符號的值,該值可用作解決提示的最後手段。

simplify(expr, size_oblivious=False)[source]#

使用已知的約束和替換來簡化給定的表示式。

返回型別

_SympyT

size_hint(expr, *, allow_none=False)[source]#

從底層形狀獲取給定表示式的大小提示。它不會引入 guard,因此僅在您可以保證程式碼對於任意大小仍然有效時使用(例如,用於最佳化決策)。

返回型別

Optional[Basic]

suppress_guards()[source]#

上下文管理器,用於忽略內部生成的所有 guards。

返回型別

_GeneratorContextManager[None]