Nvidia TensorRT RTX 執行提供程式
Nvidia TensorRT RTX 執行提供程式是消費級硬體 (RTX PC) 上 GPU 加速的首選執行提供程式。與專注於資料中心環境的舊版 TensorRT 執行提供程式相比,它更易於使用,並且比 CUDA EP 效能更佳。以下是使其比我們的舊版 TensorRT 執行提供程式更適合 RTX PC 的一些優點:
- 佔用空間更小
- 模型編譯/載入時間大大加快。
- 在跨多個 RTX GPU 使用快取模型方面具有更好的可用性。
ONNX Runtime 中的 Nvidia TensorRT RTX 執行提供程式利用 NVIDIA 的 TensorRT RTX 深度學習推理引擎(TODO:一旦 TRT RTX 文件可用,更正連結)來加速 RTX GPU 上的 ONNX 模型。Microsoft 和 NVIDIA 密切合作,將 TensorRT RTX 執行提供程式與 ONNX Runtime 整合。
目前 TensorRT RTX 支援 Ampere 或更新架構的 RTX GPU。對 Turing GPU 的支援即將推出。
目錄
安裝
請選擇 Onnx Runtime 的 Nvidia TensorRT RTX 版本:https://onnxruntime.llms.tw/docs/install。(TODO!)
從原始碼構建
請參閱 構建說明。
要求
| ONNX Runtime | TensorRT-RTX | CUDA |
|---|---|---|
| 主分支 | 1.0 | 12.0-12.9 |
| 1.22 | 1.0 | 12.0-12.9 |
用法
C/C++
const auto& api = Ort::GetApi();
Ort::SessionOptions session_options;
api.SessionOptionsAppendExecutionProvider(session_options, "NvTensorRtRtx", nullptr, nullptr, 0);
Ort::Session session(env, model_path, session_options);
C API 詳情請見 此處。
Python
要使用 TensorRT RTX 執行提供程式,您必須在例項化 InferenceSession 時顯式註冊 TensorRT RTX 執行提供程式。
import onnxruntime as ort
sess = ort.InferenceSession('model.onnx', providers=['NvTensorRtRtxExecutionProvider'])
配置
TensorRT RTX 設定可以透過 TensorRT 執行提供程式會話選項進行配置。
以下是設定 NV TensorRT RTX EP 會話選項的示例和不同場景
點選下方檢視 Python API 示例
import onnxruntime as ort
model_path = '<path to model>'
# note: for bool type options in python API, set them as False/True
provider_options = {
'device_id': 0,
'nv_dump_subgraphs': False,
'nv_detailed_build_log': True,
'user_compute_stream': stream_handle
}
sess_opt = ort.SessionOptions()
sess = ort.InferenceSession(model_path, sess_options=sess_opt, providers=[('NvTensorRTRTXExecutionProvider', provider_options)])
點選下方檢視 C++ API 示例
Ort::SessionOptions session_options;
cudaStream_t cuda_stream;
cudaStreamCreate(&cuda_stream);
// Need to put the CUDA stream handle in a string
char streamHandle[32];
sprintf_s(streamHandle, "%lld", (uint64_t)cuda_stream);
const auto& api = Ort::GetApi();
std::vector<const char*> option_keys = {
"device_id",
"user_compute_stream", // this implicitly sets "has_user_compute_stream"
};
std::vector<const char*> option_values = {
"1",
streamHandle
};
Ort::ThrowOnError(api.SessionOptionsAppendExecutionProvider(session_options, "NvTensorRtRtx", option_keys.data(), option_values.data(), option_keys.size()));
場景
| 場景 | NV TensorRT RTX EP 會話選項 | 型別 |
|---|---|---|
| 指定用於執行的 GPU ID | device_id | int |
| 為 GPU 操作設定自定義計算流 | user_compute_stream | string |
| 設定 TensorRT RTX EP GPU 記憶體使用限制 | nv_max_workspace_size | int |
| 轉儲最佳化後的子圖以進行除錯 | nv_dump_subgraphs | bool |
| 捕獲 CUDA 圖以減少啟動開銷 | nv_cuda_graph_enable | bool |
| 啟用構建步驟的詳細日誌記錄 | nv_detailed_build_log | bool |
| 定義最小形狀 | nv_profile_min_shapes | string |
| 定義最大形狀 | nv_profile_max_shapes | string |
| 定義最佳形狀 | nv_profile_opt_shapes | string |
注意:對於布林型別選項,在 Python 中賦值為 True/False,在 C++ 中賦值為 1/0。
執行提供程式選項
TensorRT RTX 配置可以透過執行提供程式選項設定。當每個模型和推理會話都有自己的配置時,這會很有用。所有配置都應顯式設定,否則將採用預設值。
device_id
- 描述:GPU 裝置 ID。
- 預設值:0
user_compute_stream
-
描述:定義推理執行的計算流。它隱式設定了
has_user_compute_stream選項。流控制代碼需要以十進位制數字的形式列印成字串,並作為會話選項傳遞,如上例所示。 - 這也可以透過 Python API 進行設定。
-
例如,從 PyTorch 捕獲的 cuda 流可以傳遞給 ORT-NV TensorRT RTX EP。點選下方檢視示例程式碼
import onnxruntime as ort import torch ... sess = ort.InferenceSession('model.onnx') if torch.cuda.is_available(): s = torch.cuda.Stream() provider_options = { 'device_id': 0, 'user_compute_stream': str(s.cuda_stream) } sess = ort.InferenceSession( model_path, providers=[('NvTensorRtRtxExecutionProvider', provider_options)] ) options = sess.get_provider_options() assert "NvTensorRtRtxExecutionProvider" in options assert options["NvTensorRtRtxExecutionProvider"].get("user_compute_stream", "") == str(s.cuda_stream) ...
-
- 為了利用使用者計算流,建議使用 I/O 繫結將輸入和輸出繫結到裝置中的張量。
nv_max_workspace_size
-
描述:TensorRT RTX 引擎的最大工作空間大小(以位元組為單位)。
-
預設值:0(讓 TensorRT 選擇最佳值)。
nv_dump_subgraphs
- 描述:如果 ONNX 被拆分為多個執行提供程式,則轉儲子圖。
- 這有助於除錯子圖,例如使用
trtexec --onnx subgraph_1.onnx並檢查解析器的輸出。
- 這有助於除錯子圖,例如使用
nv_detailed_build_log
- 描述:在 NV TensorRT RTX EP 上啟用詳細的構建步驟日誌記錄,幷包含每個引擎構建的時間。
nv_cuda_graph_enable
- 描述:這將捕獲一個 CUDA 圖,這對於包含許多小層的網路來說可以顯著提高效能,因為它減少了 CPU 上的啟動開銷。
nv_profile_min_shapes
nv_profile_max_shapes
nv_profile_opt_shapes
- 描述:使用包含所提供最小/最大/最佳形狀的配置檔案構建顯式動態形狀。
- 預設情況下,TensorRT RTX 引擎將支援動態形狀,為了提高效能,可以指定一個或多個顯式形狀範圍。
- 配置檔案形狀的格式為
input_tensor_1:dim_1xdim_2x...,input_tensor_2:dim_3xdim_4x...,...- 這三個標誌都應提供才能啟用顯式配置檔案形狀功能。
- 請注意,可以透過為同一輸入張量傳遞多個形狀來啟用多個 TensorRT RTX 配置檔案。
- 有關更多詳細資訊,請檢視 TensorRT 文件 最佳化配置檔案。
NV TensorRT RTX EP 快取
主要有兩種 TRT RTX EP 快取:
- 嵌入式引擎模型 / EPContext 模型
- 內部 TensorRT RTX 快取
內部 TensorRT RTX 快取由 EP 自動管理。使用者只需要管理 EPContext 快取。快取對於大幅縮短會話建立時間至關重要。
TensorRT RTX 將編譯分為預編譯(AOT)引擎和即時(JIT)編譯。AOT 編譯可以儲存為 EPContext 模型,此模型在多個 GPU 代次之間相容。載入此類 EPContext 模型後,TensorRT RTX 將即時編譯引擎以適應所使用的 GPU。此 JIT 過程透過 TensorRT RTX 的內部快取加速。有關示例用法,請參見:https://github.com/microsoft/onnxruntime/blob/main/onnxruntime/test/providers/nv_tensorrt_rtx/nv_basic_test.cc
更多關於嵌入式引擎模型 / EPContext 模型
- TODO:決定預設使用去權重引擎的計劃。修復 EP 實現以啟用該功能。解釋動機並在此文件中提供如何使用正確選項的示例。
- EPContext 模型還支援封裝外部編譯的引擎,例如使用
trtexec。Python 工具中包含一個能夠將此類預編譯引擎封裝到 ONNX 檔案中的Python 指令碼。(TODO:文件說明這如何與去權重引擎一起工作)。
效能調優
有關效能調優,請參閱此頁面上的指南:ONNX Runtime 效能調優
當/如果使用 onnxruntime_perf_test 時,請使用標誌 -e nvtensorrttrx。
TensorRT RTX 外掛支援
TensorRT RTX 不支援外掛。