系統概述¶
Torch-TensorRT 主要是一個 C++ 庫,並計劃提供 Python API。我們使用 Bazel 作為構建系統,目前主要針對 Linux x86_64 和 Linux aarch64(僅原生支援)。我們使用的編譯器是 GCC 7.5.0,該庫尚未在早於此版本的編譯器上進行測試,因此如果您嘗試使用舊版本編譯器,可能會出現編譯錯誤。
倉庫結構如下
core: 主要編譯器原始碼
cpp: C++ API
tests: C++ API、核心和 Converter 的測試
py: Python API
notebooks: 使用 Torch-TensorRT 構建的示例應用
docs: 文件
docsrc: 文件原始檔
third_party: 依賴庫的 BUILD 檔案
toolchains: 不同平臺的 Toolchain
C++ API 尚不穩定,在庫成熟之前可能會發生變化,但大部分工作都在核心內部進行。
核心包含幾個主要部分:頂層編譯器介面,負責協調模組的攝取、Lowering、轉換以及生成新模組並將其返回給使用者。編譯器有三個主要階段:Lowering 階段、轉換階段和執行階段。
編譯器階段¶
Lowering¶
Lowering 階段由一系列 Pass 組成(部分來自 PyTorch,部分特定於 Torch-TensorRT),這些 Pass 在圖 IR 上執行,將龐大的 PyTorch opset 對映到更容易轉換為 TensorRT 的精簡 opset。
Partitioning¶
此階段是可選的,由使用者啟用。它指示編譯器將節點分離為應在 PyTorch 中執行的節點和應在 TensorRT 中執行的節點。分離的標準包括:缺少 Converter、使用者明確將 operator 設定為在 PyTorch 中執行,或者節點具有透過模組回退 Pass 告知 Partitioning 在 PyTorch 中執行的標誌。
轉換¶
在轉換階段,我們遍歷 Lowering 後的圖並構建等效的 TensorRT 圖。轉換階段由三個主要元件組成:用於管理編譯時資料的上下文、用於執行可在編譯時解析的操作的 Evaluator 庫,以及用於將 JIT 的 op 對映到 TensorRT 的 Converter 庫。
編譯與執行時¶
最終的編譯階段構建一個 TorchScript 程式來執行轉換後的 TensorRT Engine。它獲取一個序列化的 Engine,並在 Engine Manager 中例項化它,然後編譯器將構建一個引用此 Engine 並將其封裝在 Module 中的 JIT 圖,最後將其返回給使用者。當用戶執行該 Module 時,JIT 程式將在由 Torch-TensorRT 擴充套件的 JIT 執行時中執行,並使用使用者提供的資料。