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 有效。