Backed vs Unbacked Symints#
创建日期: 2025年9月22日 | 最后更新日期: 2025年12月3日
Backed SymInts 是具有具体值或“提示”的符号整数。这意味着 torch 可以使用这些值来做出控制流决策,例如确定执行哪一段代码分支。它们通常来自大小或值已知或可以推断的操作。
Unbacked SymInts 是不具有具体值或提示的符号整数。它们通常来自数据依赖性操作,例如 .nonzero() 或 .item(),其中大小或值无法在编译时确定。由于它们缺乏具体值,因此不能用于控制流决策,并且尝试这样做需要中断图。
Unbacked SymInts 使用不敏感大小推理,这在处理 0/1 特化重新编译问题 时特别有用。
总而言之,backed SymInts 具有可用于决策的已知值,而 unbacked SymInts 则没有,需要特殊处理以避免图中断。
Unbacked 符号整数可能过于严格,导致大多数 PyTorch 程序失败。为了解决这个问题,你可以使用以下方法和 API 作为解决方法
使用更高级别的 API,例如
empty,而不是empty_strided来创建张量。这确保了张量是非重叠且密集的,避免了不必要的步长排序和保护创建,以避免对这些属性进行不必要的重新计算。修改你的代码,使预计算属性延迟。这确保了对 unbacked 符号整数的保护仅在必要时应用,从而减少计算开销。
如何使用 unbacked#
要使用 unbacked API,请将 mark_dynamic 替换为 mark_unbacked,并将 TORCH_COMPILE_DYNAMIC_SOURCES 替换为 TORCH_COMPILE_UNBACKED_SOURCES。这告诉编译器将输入视为 unbacked。
另请参阅