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