评价此页

torch.fx.experimental.symbolic_shapes.constrain_range#

torch.fx.experimental.symbolic_shapes.constrain_range(a, *, min, max=None)[源代码]#

应用一个约束,使得传入的 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 有效。