降低階段¶
降低階段由一系列遍組成,這些遍是將圖從高階表示對映到低階表示的操作。每個遍執行特定的任務,例如內聯方法呼叫。其目的是顯著減少實際對映到 TensorRT 時轉換階段需要處理的內容。我們旨在實現更接近 1 對 1 的運算子轉換,而不是尋找適用的子圖,從而限制轉換器的數量並縮小每個轉換器的範圍。
透過將日誌級別設定為 Level::kGraph,您可以檢視每個遍的效果
使用的遍¶
消除公共子表示式¶
移除圖中的公共子表示式
消除死程式碼¶
死程式碼消除將檢查節點是否具有副作用,如果具有副作用則不會刪除它。
消除異常或透過模式¶
指令碼化模組中的常見模式是維度守衛,如果輸入維度與預期不符,它將丟擲異常。
%1013 : bool = aten::ne(%1012, %24) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/batchnorm.py:248:11
    = prim::If(%1013) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/batchnorm.py:248:8
    block0():
        = prim::RaiseException(%23) # ~/.local/lib/python3.6/site-packages/torch/nn/modules/batchnorm.py:249:12
    -> ()
    block1():
    -> ()
由於我們在編譯時解析所有這些內容,並且 TensorRT 圖中沒有異常,我們只需將其移除。
消除冗餘守衛¶
消除輸出完全由其輸入確定的運算子的冗餘守衛,即如果此類運算子的輸入受守衛保護,則允許我們移除運算子輸出上的守衛
凍結模組¶
凍結屬性並內聯常量和模組。在圖中傳播常量。
融合 AddMM 分支¶
指令碼化模組中的常見模式是不同維度的張量使用不同的結構來實現線性層。我們將這些不同的變體融合成一個單一的,該單一結構將被 Unpack AddMM 遍捕獲。
%ret : Tensor = prim::If(%622)
block0():
  %ret.1 : Tensor = aten::addmm(%self.fc.bias, %x9.1, %3677, %3, %3)
  -> (%ret.1)
block1():
  %output.1 : Tensor = aten::matmul(%x9.1, %3677)
  %output0.1 : Tensor = aten::add_(%output.1, %self.fc.bias, %3)
  -> (%output0.1)
我們將這組塊融合成一個如下所示的圖
%ret : Tensor = aten::addmm(%self.fc.bias, %x9.1, %3677, %3, %3)
融合 Linear¶
匹配 aten::linear 模式並將其融合成一個單一的 aten::linear。此遍將 JIT 生成的 addmm 或 matmul + add 重新融合成 linear
融合 Flatten Linear¶
當輸入層高於 1D 時,TensorRT 會將其隱式展平為全連線層。因此,當存在 aten::flatten -> aten::linear 模式時,我們移除 aten::flatten。
降低圖¶
給定一個方法圖,其第一個引數是 %self,將其降低為一個圖,其中所有屬性訪問都被替換為圖的顯式輸入(而不是對 %self 執行 prim::GetAttr 的結果)。返回一個元組 (graph, parameters),其中圖的最後 module.parameters.size() 個輸入是此方法中使用的可訓練引數。其餘輸入是函式的真實輸入。
降低元組¶
- 降低簡單元組:
移除 TupleConstruct 和 TupleUnpack 匹配的元組,但保留 if 語句、迴圈以及輸入/輸出中的元組
- 降低所有元組:
移除 _所有_ 元組,如果某些元組無法移除則丟擲錯誤。ONNX 使用此遍以確保轉換前沒有元組,但對輸入包含元組的圖無效。
模組回退¶
模組回退包含兩個必須成對執行的降低遍。第一個遍在凍結前執行,在圖中標註應在 PyTorch 中執行的模組周圍的定界符。第二個遍在凍結後標記這些定界符之間的節點,以指示它們應在 PyTorch 中執行。
- 標註模組回退
在凍結前在模組呼叫周圍放置定界節點,以指示圖中的哪些節點應在 PyTorch 中執行
- 標記回退節點
查詢定界符,然後標記定界符之間的所有節點,以告知分割槽應在 PyTorch 中執行它們
窺孔最佳化¶
此最佳化遍旨在捕獲您可能感興趣的所有小型、易於捕獲的窺孔最佳化。
- 目前,它執行以下操作:
- 消除無操作的 ‘expand’ 節點 
- 將 x.t().t() 簡化為 x 
 
移除 Contiguous¶
移除 contiguous 運算子,因為我們執行 TensorRT 時記憶體已是連續的。
移除 Dropout¶
移除 dropout 運算子,因為我們在執行推理。
移除 To¶
移除執行型別轉換的 aten::to 運算子,因為 TensorRT 會自行管理。重要的是,這是最後執行的遍之一,以便其他遍有機會將所需的型別轉換運算子移出主名稱空間。
解包 AddMM¶
將 aten::addmm 解包為 aten::matmul 和 aten::add_(並新增一個 trt::const 運算子以在 TensorRT 圖中凍結偏置)。這使我們能夠重用 aten::matmul 和 aten::add_ 轉換器,而無需專門的轉換器。
解包 LogSoftmax¶
將 aten::logsoftmax 解包為 aten::softmax 和 aten::log。這使我們能夠重用 aten::softmax 和 aten::log 轉換器,而無需專門的轉換器。
迴圈展開¶
展開相容的迴圈(例如足夠短的迴圈)的操作,以便您只需遍歷迴圈一次。
將 Tile 替換為 Repeat¶
移除 dropout 運算子,因為我們在執行推理。