轉換階段¶
圖簡化為易於轉換的形式後,我們將設定一個轉換上下文,用於管理從塊節點構建 TensorRT INetworkDefinition。轉換上下文記錄已轉換的節點集、塊輸入和輸出以及關於圖轉換的其他資訊。然後,此資料用於幫助轉換器將層連結在一起,並儲存構建時資訊,例如構建引擎所需的權重。上下文建立後,塊轉換器開始遍歷節點列表,對於每個節點,轉換器將檢視其輸入並組裝要傳遞給轉換器的資源陣列。輸入可以處於幾種狀態:
輸入是塊引數
在這種情況下,輸入應該已經作為 IValue 儲存在轉換上下文的
evaluated_value_map中。轉換階段將把該 IValue 新增到轉換器的引數列表中。
輸入是已轉換節點的一個輸出
在這種情況下,輸出的 ITensor 已新增到
value_tensor_map中,轉換階段將把該 ITensor 新增到轉換器的引數列表中。
輸入來自產生靜態值的節點
有些節點會產生靜態值,通常用於儲存運算子的引數,我們需要在轉換時評估這些節點才能轉換一個運算子。轉換系統將在評估器登錄檔中查詢節點評估器並對該節點執行它。產生的 IValue 將被輸入到轉換上下文的
evaluated_value_map中,並新增到轉換器的引數列表中。如果待評估的節點需要輸入,轉換階段將遞迴地解析依賴關係,直到最終的靜態值被評估出來。
輸入來自尚未轉換的節點
Torch-TensorRT 在此將報錯
節點評估¶
有些節點包含靜態資料,並且是操作的資源。這些節點可以在轉換時進行評估,以便在進行節點轉換時使用這些值。理論上,任何節點型別只要能產生靜態 IValue,都可以擁有一個轉換時評估器,該 IValue 將儲存在轉換上下文中,以便可以被任何以該評估節點作為輸入的節點使用。常見的節點型別有發出常量的 prim::Constant 和建立列表的 prim::ListConstruct。
節點轉換器¶
節點轉換器將 JIT 節點對映到層或層的子圖。然後,它們在轉換上下文中將 JIT 圖和 TRT 圖的輸出關聯起來。這使得轉換階段能夠為下一個節點組裝輸入。在某些情況下,節點產生的輸出不是 Tensor,而是對需要首先轉換的輸入進行計算產生的靜態結果。在這種情況下,轉換器可能會將輸出關聯到 evaluated_value_map 中,而不是 value_tensor_map 中。更多資訊請參閱:writing_converters