torch.fx.experimental.symbolic_shapes.constrain_range#
- torch.fx.experimental.symbolic_shapes.constrain_range(a, *, min, max=None)[source]#
对传递的 SymInt 应用一个约束,使其落在 min-max 包含-包含之间,而不引入对 SymInt 的 guard(即它可以用于未绑定的 SymInt)。如果 min/max 为 None,则假定该维度在该方向上是无界的。重复应用 constrain_range 会相交范围。这是一个相当底层的 API,没有很多安全保证(TODO:提供更高层的 API)。
目前,我们在以下情况下使用此 API:当我们分配一个未绑定的 SymInt 时,表示一个数据依赖的整数数量,我们通常不知道它可能取什么值。这意味着任何针对它的 guard 都会立即失败。但是,在很多情况下,我们对未绑定的 SymInt 有所了解:例如,我们知道 nonzero(x).size(0) 必须 >= 0。我们使用 constrain_range 来缩小可能的范围,声明不可能出现负数符号。这使得我们可以肯定地回答诸如 ‘nnz >= 0’ 之类的查询,即使我们不知道 ‘nnz’ 的实际(提示的)值。事实上,我们实际上使用 constrain_range 来不严谨地解除常见的 guard:对于由 nonzero 产生的未绑定 SymInt,我们还将假定它不等于 0/1(尽管这些在运行时是完全可能的值),因为我们通常期望对 N=2 有效的图也对 N=1 有效。