TensorRT 後端,適用於 torch.compile
¶
本指南介紹 Torch-TensorRT torch.compile 後端:一種深度學習編譯器,使用 TensorRT 加速各種模型的 JIT 樣式工作流程。
主要功能¶
Torch-TensorRT torch.compile 後端的主要目標是透過結合 torch.compile API 的簡便性與 TensorRT 的效能,實現即時編譯工作流程。呼叫 torch.compile 後端就像匯入 torch_tensorrt 套件並指定後端一樣簡單
import torch_tensorrt
...
optimized_model = torch.compile(model, backend="torch_tensorrt", dynamic=False)
注意
使用者可以使用許多其他自訂選項。這些將在本指南中更深入地討論。
後端可以處理各種具有挑戰性的模型結構,並提供簡單易用的介面,以有效加速模型。此外,它還具有許多自訂選項,以確保編譯過程適合特定用例。
可自訂設定¶
- class torch_tensorrt.dynamo.CompilationSettings(enabled_precisions: ~typing.Set[~torch_tensorrt._enums.dtype] = <factory>, debug: bool = False, workspace_size: int = 0, min_block_size: int = 5, torch_executed_ops: ~typing.Collection[~typing.Union[~typing.Callable[[...], ~typing.Any], str]] = <factory>, pass_through_build_failures: bool = False, max_aux_streams: ~typing.Optional[int] = None, version_compatible: bool = False, optimization_level: ~typing.Optional[int] = None, use_python_runtime: ~typing.Optional[bool] = False, truncate_double: bool = False, use_fast_partitioner: bool = True, enable_experimental_decompositions: bool = False, device: ~torch_tensorrt._Device.Device = <factory>, require_full_compilation: bool = False, disable_tf32: bool = False, assume_dynamic_shape_support: bool = False, sparse_weights: bool = False, engine_capability: ~torch_tensorrt._enums.EngineCapability = <factory>, num_avg_timing_iters: int = 1, dla_sram_size: int = 1048576, dla_local_dram_size: int = 1073741824, dla_global_dram_size: int = 536870912, dryrun: ~typing.Union[bool, str] = False, hardware_compatible: bool = False, timing_cache_path: str = '/tmp/torch_tensorrt_engine_cache/timing_cache.bin', lazy_engine_init: bool = False, cache_built_engines: bool = False, reuse_cached_engines: bool = False, use_explicit_typing: bool = False, use_fp32_acc: bool = False, refit_identical_engine_weights: bool = False, strip_engine_weights: bool = False, immutable_weights: bool = True, enable_weight_streaming: bool = False, enable_cross_compile_for_windows: bool = False, use_aot_joint_export: bool = True)[來源]¶
Torch-TensorRT Dynamo 路徑的編譯設定
- 參數
enabled_precisions (Set[dpython:type]) – 可用的核心 dtype 精度
debug (bool) – 是否印出詳細的偵錯資訊
workspace_size (python:int) – TRT 允許模組使用的工作區大小 (預設為 0)
min_block_size (python:int) – 每個 TRT 引擎區塊的最小運算子數量
torch_executed_ops (Collection[Target]) – 要在 Torch 中執行的運算集合,無論轉換器涵蓋範圍為何
pass_through_build_failures (bool) – 是否在 TRT 引擎建置錯誤時失敗 (True) 或不失敗 (False)
max_aux_streams (Optional[python:int]) – 每個引擎允許的最大輔助 TRT 串流數量
version_compatible (bool) – 為引擎計畫檔案提供版本向前相容性
optimization_level (Optional[python:int]) – 建置器最佳化 0-5,較高等級表示建置時間較長,搜尋更多最佳化選項。TRT 預設為 3
use_python_runtime (Optional[bool]) – 是否嚴格使用 Python 執行階段或 C++ 執行階段。若要根據 C++ 依賴項是否存在自動選取執行階段 (如果可用,優先選擇 C++ 執行階段),請將引數保留為 None
truncate_double (bool) – 是否將 float64 TRT 引擎輸入或權重截斷為 float32
use_fast_partitioner (bool) – 是否使用快速或全域圖形分割系統
enable_experimental_decompositions (bool) – 是否啟用所有核心 aten 分解或僅啟用部分選定的分解
device (Device) – 在其上編譯模型的 GPU
require_full_compilation (bool) – 是否要求圖形在 TensorRT 中完全編譯。僅適用於 ir=”dynamo”;對於 torch.compile 路徑無效
assume_dynamic_shape_support (bool) – 將此設定為 true 可讓轉換器同時適用於動態和靜態形狀。預設值:False
disable_tf32 (bool) – 是否停用 TRT 層的 TF32 計算
sparse_weights (bool) – 是否允許建置器使用稀疏權重
engine_capability (trt.EngineCapability) – 將核心選擇限制為安全 GPU 核心或安全 DLA 核心
num_avg_timing_iters (python:int) – 用於選取核心的平均計時迭代次數
dla_sram_size (python:int) – DLA 用於在層內通訊的快速軟體管理 RAM。
dla_local_dram_size (python:int) – DLA 用於跨運算共用中繼張量資料的主機 RAM
dla_global_dram_size (python:int) – DLA 用於儲存權重和中繼資料以供執行使用的主機 RAM
dryrun (Union[bool, str]) – 切換「Dryrun」模式,該模式會執行所有分割,但不會轉換為 TRT 引擎。印出圖形結構和分割性質的詳細記錄。如果指定字串路徑,則可選擇將輸出儲存到檔案
hardware_compatible (bool) – 建置與 GPU 架構 (而非建置引擎的 GPU 架構) 相容的 TensorRT 引擎 (目前適用於 NVIDIA Ampere 及更新版本)
timing_cache_path (str) – 計時快取的路徑 (如果存在) 或編譯後將儲存的位置
cache_built_engines (bool) – 是否將編譯的 TRT 引擎儲存到儲存空間
reuse_cached_engines (bool) – 是否從儲存空間載入編譯的 TRT 引擎
use_strong_typing (bool) – 此旗標啟用 TensorRT 編譯中的強型別,其會遵循在 Pytorch 模型中設定的精度。當使用者具有混合精度圖形時,這非常有用。
use_fp32_acc (bool) – 此選項會在 matmul 層周圍插入轉換為 FP32 的節點,而 TensorRT 可確保 matmul 的累積以 FP32 進行。僅當在 enabled_precisions 中設定 FP16 精度時才使用此選項。
refit_identical_engine_weights (bool) – 是否使用相同的權重重新調整引擎
strip_engine_weights (bool) – 是否去除引擎權重
immutable_weights (bool) – 建置不可重新調整的引擎。這對於某些不可重新調整的層很有用。如果將此引數設定為 true,則會忽略 strip_engine_weights 和 refit_identical_engine_weights
enable_weight_streaming (bool) – 啟用權重串流。
enable_cross_compile_for_windows (bool) – 預設情況下,此值為 False 表示 TensorRT 引擎只能在建置引擎的相同平台上執行。True 將啟用跨平台相容性,允許在 Linux 上建置引擎並在 Windows 上執行
use_aot_joint_export (bool) – 使用 aot_export_joint_simple,否則使用 AOT_autograd 包裝後端,分散式張量需要此設定
自訂設定用法¶
import torch_tensorrt
...
optimized_model = torch.compile(model, backend="torch_tensorrt", dynamic=False,
options={"truncate_long_and_double": True,
"enabled_precisions": {torch.float, torch.half},
"debug": True,
"min_block_size": 2,
"torch_executed_ops": {"torch.ops.aten.sub.Tensor"},
"optimization_level": 4,
"use_python_runtime": False,})
注意
量化/INT8 支援預計在未來版本中推出;目前,我們支援 FP16 和 FP32 精度層。
編譯¶
編譯是透過將輸入傳遞至模型來觸發,如下所示
import torch_tensorrt
...
# Causes model compilation to occur
first_outputs = optimized_model(*inputs)
# Subsequent inference runs with the same, or similar inputs will not cause recompilation
# For a full discussion of this, see "Recompilation Conditions" below
second_outputs = optimized_model(*inputs)
編譯後¶
編譯物件可用於 Python 會話中的推論,並將根據以下詳述的重新編譯條件重新編譯。除了通用推論之外,編譯過程還可以作為判斷模型效能、目前運算子涵蓋範圍和序列化可行性的實用工具。以下將詳細介紹這些要點。
模型效能¶
從 torch.compile 傳回的最佳化模型對於模型基準測試非常有用,因為它可以自動處理編譯內容的變更,或可能需要重新編譯的不同輸入。在基準測試不同分佈、批次大小或其他條件的輸入時,這可以節省時間。
運算子涵蓋範圍¶
編譯也是判斷特定模型的運算子涵蓋範圍的實用工具。例如,以下編譯命令將顯示每個圖形的運算子涵蓋範圍,但不會編譯模型 - 有效地提供「dryrun」機制
import torch_tensorrt
...
optimized_model = torch.compile(model, backend="torch_tensorrt", dynamic=False,
options={"debug": True,
"min_block_size": float("inf"),})
如果模型的關鍵運算子不受支援,請參閱 dynamo_conversion 以貢獻您自己的轉換器,或在此處提交問題:https://github.com/pytorch/TensorRT/issues。
序列化的可行性¶
編譯也有助於示範圖形中斷和特定模型序列化的可行性。例如,如果模型沒有圖形中斷,並且使用 Torch-TensorRT 後端成功編譯,則該模型應可透過 torch_tensorrt Dynamo IR 進行編譯和序列化,如 使用 Torch-TensorRT 的動態形狀 中所述。若要判斷模型中的圖形中斷次數,torch._dynamo.explain 函式非常有用
import torch
import torch_tensorrt
...
explanation = torch._dynamo.explain(model)(*inputs)
print(f"Graph breaks: {explanation.graph_break_count}")
optimized_model = torch.compile(model, backend="torch_tensorrt", dynamic=False, options={"truncate_long_and_double": True})
動態形狀支援¶
Torch-TensorRT torch.compile 後端目前需要針對遇到的每個新批次大小重新編譯,並且在使用此後端編譯時,最好使用 dynamic=False 引數。完整的動態形狀支援計畫在未來版本中推出。
重新編譯條件¶
模型編譯完成後,後續具有相同形狀和資料類型的推論輸入 (以相同方式遍歷圖形) 將不需要重新編譯。此外,每次新的重新編譯都將在 Python 會話期間快取。例如,如果將批次大小為 4 和 8 的輸入提供給模型,導致兩次重新編譯,則在同一會話中進行推論時,對於未來具有這些批次大小的輸入,將不再需要重新編譯。引擎快取序列化支援計畫在未來版本中推出。
重新編譯通常由兩個事件之一觸發:遇到不同大小的輸入或以不同方式遍歷模型程式碼的輸入。後者情況可能發生在模型程式碼包含條件邏輯、複雜迴圈或資料相關形狀時。torch.compile 會處理這兩種情況的防護,並判斷何時需要重新編譯。