部署 Torch-TensorRT 程式¶
編譯並儲存 Torch-TensorRT 程式後,不再嚴格依賴完整的 Torch-TensorRT 庫。執行編譯後的程式所需的只是執行時。因此,除了在應用程式中附帶完整的 Torch-TensorRT 編譯器之外,還有幾種部署程式的方法。
Torch-TensorRT 包 / libtorchtrt.so¶
程式編譯完成後,使用標準 PyTorch API 執行它。所需的只是在 python 中匯入該包或在 C++ 中連結它。
執行時庫¶
C++ 發行版中包含了 libtorchtrt_runtime.so。此庫僅包含執行 Torch-TensorRT 程式所需的元件。無需連結 libtorchtrt.so 或匯入 torch_tensorrt,您可以將 libtorchtrt_runtime.so 連結到您的部署程式中,或者使用 DL_OPEN 或 LD_PRELOAD。對於 python,您可以使用 torch.ops.load_library("libtorchtrt_runtime.so") 載入執行時。然後,您可以繼續像透過 PyTorch API 那樣使用程式。
注意
如果您在 x86 平臺上的 Python 中使用標準的 PyTorch 發行版,您可能需要 libtorchtrt_runtime.so 的 pre-cxx11-abi 變體,請查閱 安裝 文件瞭解更多詳情。
注意
如果您正在連結 libtorchtrt_runtime.so,使用以下標誌可能會有所幫助 -Wl,--no-as-needed -ltorchtrt -Wl,--as-needed,因為對於大多數 Torch-TensorRT 執行時應用程式來說,與 Torch-TensorRT 執行時中的任何內容都沒有直接的符號依賴關係。
此處提供了一個如何使用 libtorchtrt_runtime.so 的示例: https://github.com/pytorch/TensorRT/tree/master/examples/torchtrt_runtime_example
外掛庫¶
如果您使用 Torch-TensorRT 作為 TensorRT 引擎的轉換器,並且您的引擎使用了 Torch-TensorRT 提供的外掛,那麼 Torch-TensorRT 會提供庫 libtorchtrt_plugins.so,其中包含 Torch-TensorRT 在編譯期間使用的 TensorRT 外掛的實現。此庫可以像其他 TensorRT 外掛庫一樣透過 DL_OPEN 或 LD_PRELOAD 載入。
多裝置安全模式¶
多裝置安全模式是 Torch-TensorRT 中的一個設定,它允許使用者確定執行時是否在每次推理呼叫之前檢查裝置一致性。
啟用多裝置安全模式時,每次推理呼叫都會產生不可忽略的固定成本,這就是為什麼它現在預設停用的原因。可以透過以下兼作上下文管理器的便捷函式來控制它。
# Enables Multi Device Safe Mode
torch_tensorrt.runtime.set_multi_device_safe_mode(True)
# Disables Multi Device Safe Mode [Default Behavior]
torch_tensorrt.runtime.set_multi_device_safe_mode(False)
# Enables Multi Device Safe Mode, then resets the safe mode to its prior setting
with torch_tensorrt.runtime.set_multi_device_safe_mode(True):
...
TensorRT 要求每個引擎都與其被呼叫的活動執行緒中的 CUDA 上下文相關聯。因此,如果在活動執行緒中更改裝置(這在使用同一 Python 程序在多個 GPU 上呼叫引擎時可能會發生),安全模式將導致 Torch-TensorRT 顯示警報並相應地切換 GPU。如果未啟用安全模式,引擎裝置與 CUDA 上下文裝置之間可能存在不匹配,從而可能導致程式崩潰。
在不同 GPU 上管理多個 TRT 引擎同時又不犧牲多裝置安全模式效能的一種技術是使用 Python 執行緒。每個執行緒負責單個 GPU 上的所有 TRT 引擎,並且每個執行緒上的預設 CUDA 裝置對應於其負責的 GPU(可以透過 torch.cuda.set_device(...) 設定)。透過這種方式,可以在同一個 Python 指令碼中使用多個執行緒,而無需切換 CUDA 上下文併產生效能開銷。
Cudagraphs 模式¶
Cudagraphs 模式是 Torch-TensorRT 中的一個設定,它允許使用者確定執行時是否在某些情況下使用 cudagraphs 來加速推理。
Cudagraphs 可以透過減少核心開銷來加速某些模型,更多詳情可在此處查閱文件:[here](https://pytorch.com.tw/blog/accelerating-pytorch-with-cuda-graphs/)。
# Enables Cudagraphs Mode
torch_tensorrt.runtime.set_cudagraphs_mode(True)
# Disables Cudagraphs Mode [Default Behavior]
torch_tensorrt.runtime.set_cudagraphs_mode(False)
# Enables Cudagraphs Mode, then resets the mode to its prior setting
with torch_tensorrt.runtime.enable_cudagraphs(trt_module):
...
在當前的實現中,使用新的輸入形狀(例如在動態形狀情況下)將導致 Cudagraph 被重新記錄。Cudagraph 記錄通常不是延遲密集型的,未來的改進包括為多種輸入形狀快取 Cudagraphs。
動態輸出分配模式¶
動態輸出分配是 Torch-TensorRT 中的一個功能,它允許動態分配 TensorRT 引擎的輸出緩衝區。這對於具有動態輸出形狀的模型非常有用,特別是具有資料依賴形狀的操作。動態輸出分配模式不能與 CUDA Graphs 或預分配輸出功能同時使用。如果沒有動態輸出分配,輸出緩衝區是根據輸入大小推斷出的輸出形狀進行分配的。
在以下兩種場景下會啟用動態輸出分配:
1. 在編譯時已確定模型至少有一個 TensorRT 子圖需要動態輸出分配。這些模型將自動啟用(並記錄)執行時模式,並且與其他執行時模式(例如 CUDA Graphs)不相容。
轉換器可以使用 requires_output_allocator=True 宣告它們生成的子圖需要輸出分配器,從而強制任何使用該轉換器的模型自動使用輸出分配器執行時模式。例如,
@dynamo_tensorrt_converter(
torch.ops.aten.nonzero.default,
supports_dynamic_shapes=True,
requires_output_allocator=True,
)
def aten_ops_nonzero(
ctx: ConversionContext,
target: Target,
args: Tuple[Argument, ...],
kwargs: Dict[str, Argument],
name: str,
) -> Union[TRTTensor, Sequence[TRTTensor]]:
...
使用者可以透過
torch_tensorrt.runtime.enable_output_allocator上下文管理器手動啟用動態輸出分配模式。
# Enables Dynamic Output Allocation Mode, then resets the mode to its prior setting
with torch_tensorrt.runtime.enable_output_allocator(trt_module):
...