TensorRT Execution Provider
Mit dem TensorRT Execution Provider liefert ONNX Runtime eine bessere Inferenzleistung auf derselben Hardware im Vergleich zur generischen GPU-Beschleunigung.
Der TensorRT Execution Provider in ONNX Runtime nutzt die TensorRT Deep-Learning-Inferenz-Engine von NVIDIA, um ONNX-Modelle auf deren GPUs zu beschleunigen. Microsoft und NVIDIA haben eng zusammengearbeitet, um den TensorRT Execution Provider in ONNX Runtime zu integrieren.
Inhalt
- Installieren
- Erstellung aus Quelle
- Voraussetzungen
- Verwendung
- Konfigurationen
- TensorRT EP Caches
- Performance-Tuning
- Beispiele
- Bekannte Probleme
Installieren
Bitte wählen Sie die GPU (CUDA/TensorRT)-Version von Onnx Runtime aus: https://onnxruntime.de/docs/install. Vorkompilierte Pakete und Docker-Images sind für Jetpack im Jetson Zoo verfügbar.
Aus dem Quellcode kompilieren
Siehe Build-Anweisungen.
Voraussetzungen
Hinweis
Ab Version 1.19 ist **CUDA 12** die Standardversion bei der Verteilung von ONNX Runtime GPU-Paketen.
Ab ORT 1.22 werden nur noch CUDA 12 GPU-Pakete veröffentlicht.
| ONNX Runtime | TensorRT | CUDA |
|---|---|---|
| main | 10.9 | 12.0-12.8 |
| 1.22 | 10.9 | 12.0-12.8 |
| 1.21 | 10.8 | 12.0-12.8, 11.8 |
| 1.20 | 10.4 | 12.0-12.6, 11.8 |
| 1.19 | 10.2 | 12.0-12.6, 11.8 |
| 1.18 | 10.0 | 11.8, 12.0-12.6 |
| 1.17 | 8.6 | 11.8, 12.0-12.6 |
| 1.16 | 8.6 | 11.8 |
| 1.15 | 8.6 | 11.8 |
| 1.14 | 8.5 | 11.6 |
| 1.12-1.13 | 8.4 | 11.4 |
| 1.11 | 8.2 | 11.4 |
| 1.10 | 8.0 | 11.4 |
| 1.9 | 8.0 | 11.4 |
| 1.7-1.8 | 7.2 | 11.0.3 |
| 1.5-1.6 | 7.1 | 10.2 |
| 1.2-1.4 | 7.0 | 10.1 |
| 1.0-1.1 | 6.0 | 10.0 |
Weitere Details zu CUDA/cuDNN-Versionen finden Sie unter CUDA EP Anforderungen.
Verwendung
C/C++
Ort::Env env = Ort::Env{ORT_LOGGING_LEVEL_ERROR, "Default"};
Ort::SessionOptions sf;
int device_id = 0;
Ort::ThrowOnError(OrtSessionOptionsAppendExecutionProvider_Tensorrt(sf, device_id));
Ort::ThrowOnError(OrtSessionOptionsAppendExecutionProvider_CUDA(sf, device_id));
Ort::Session session(env, model_path, sf);
Die Details der C-API finden Sie hier.
Python
Um den TensorRT Execution Provider zu verwenden, müssen Sie diesen explizit beim Instanziieren der InferenceSession registrieren. Beachten Sie, dass es empfohlen wird, auch den CUDAExecutionProvider zu registrieren, damit Onnx Runtime Knoten, die von TensorRT nicht unterstützt werden, der CUDA Execution Provider zuweisen kann.
import onnxruntime as ort
# set providers to ['TensorrtExecutionProvider', 'CUDAExecutionProvider'] with TensorrtExecutionProvider having the higher priority.
sess = ort.InferenceSession('model.onnx', providers=['TensorrtExecutionProvider', 'CUDAExecutionProvider'])
Konfigurationen
Es gibt zwei Möglichkeiten, TensorRT-Einstellungen zu konfigurieren: entweder über TensorRT Execution Provider Session Option oder über Umgebungsvariablen (veraltet).
Hier sind Beispiele und verschiedene Szenarien zum Festlegen von TensorRT EP Session-Optionen
Klicken Sie unten für ein Python API-Beispiel
import onnxruntime as ort
model_path = '<path to model>'
# note: for bool type options in python API, set them as False/True
providers = [
('TensorrtExecutionProvider', {
'device_id': 0, # Select GPU to execute
'trt_max_workspace_size': 2147483648, # Set GPU memory usage limit
'trt_fp16_enable': True, # Enable FP16 precision for faster inference
}),
('CUDAExecutionProvider', {
'device_id': 0,
'arena_extend_strategy': 'kNextPowerOfTwo',
'gpu_mem_limit': 2 * 1024 * 1024 * 1024,
'cudnn_conv_algo_search': 'EXHAUSTIVE',
'do_copy_in_default_stream': True,
})
]
sess_opt = ort.SessionOptions()
sess = ort.InferenceSession(model_path, sess_options=sess_opt, providers=providers)
Klicken Sie unten für ein C++ API-Beispiel
Ort::SessionOptions session_options;
const auto& api = Ort::GetApi();
OrtTensorRTProviderOptionsV2* tensorrt_options;
Ort::ThrowOnError(api.CreateTensorRTProviderOptions(&tensorrt_options));
std::vector<const char*> option_keys = {
"device_id",
"trt_max_workspace_size",
"trt_max_partition_iterations",
"trt_min_subgraph_size",
"trt_fp16_enable",
"trt_int8_enable",
"trt_int8_use_native_calibration_table",
"trt_dump_subgraphs",
// below options are strongly recommended !
"trt_engine_cache_enable",
"trt_engine_cache_path",
"trt_timing_cache_enable",
"trt_timing_cache_path",
};
std::vector<const char*> option_values = {
"1",
"2147483648",
"10",
"5",
"1",
"1",
"1",
"1",
"1",
"1",
"/path/to/cache",
"1",
"/path/to/cache", // can be same as the engine cache folder
};
Ort::ThrowOnError(api.UpdateTensorRTProviderOptions(tensorrt_options,
option_keys.data(), option_values.data(), option_keys.size()));
cudaStream_t cuda_stream;
cudaStreamCreate(&cuda_stream);
// this implicitly sets "has_user_compute_stream"
Ort::ThrowOnError(api.UpdateTensorRTProviderOptionsWithValue(cuda_options, "user_compute_stream", cuda_stream))
session_options.AppendExecutionProvider_TensorRT_V2(*tensorrt_options);
/// below code can be used to print all options
OrtAllocator* allocator;
char* options;
Ort::ThrowOnError(api.GetAllocatorWithDefaultOptions(&allocator));
Ort::ThrowOnError(api.GetTensorRTProviderOptionsAsString(tensorrt_options, allocator, &options));
Szenario
| Szenario | TensorRT EP Session Option | Typ |
|---|---|---|
| Geräte- und Computekonfiguration | ||
| GPU-ID für die Ausführung angeben | device_id | int |
| Benutzerdefinierten Compute-Stream für GPU-Operationen festlegen | user_compute_stream | string |
| Engine-Caching und Kompatibilität | ||
| Caching von TensorRT-Engines aktivieren | trt_engine_cache_enable | bool |
| Pfad zum Speichern von gecachten TensorRT-Engines festlegen | trt_engine_cache_path | string |
| Präfix für gecachte Engine-Dateien festlegen | trt_engine_cache_prefix | string |
| Engine-Kompatibilität über Ampere+-GPUs maximieren | trt_engine_hw_compatible | bool |
| Präzision und Leistung | ||
| Limit für TensorRT EP GPU-Speicherbelegung festlegen | trt_max_workspace_size | int |
| FP16-Präzision für höhere Leistung aktivieren | trt_fp16_enable | bool |
| INT8-Präzision für quantisierte Inferenz aktivieren | trt_int8_enable | bool |
| INT8-Kalibrierungstabelle für Nicht-QDQ-Modelle benennen | trt_int8_calibration_table_name | string |
| Native TensorRT-Kalibrierungstabellen verwenden | trt_int8_use_native_calibration_table | bool |
| Heuristiken zur Beschleunigung von Engine-Builds verwenden | trt_build_heuristics_enable | bool |
| Sparsity aktivieren, um Nullwerte zu nutzen | trt_sparsity_enable | bool |
| Deep Learning Accelerator (DLA) auf Edge-SoCs aktivieren | trt_dla_enable | bool |
| Zu verwendenden DLA-Core angeben | trt_dla_core | int |
| Subgraph- und Graph-Optimierung | ||
| Iterationen für die Modellkonvertierung begrenzen | trt_max_partition_iterations | int |
| Minimale Größe für Subgraphen bei der Partitionierung festlegen | trt_min_subgraph_size | int |
| Optimierte Subgraphen zum Debuggen ausgeben | trt_dump_subgraphs | bool |
| Sequenzielle Engine-Builds unter Multi-GPU erzwingen | trt_force_sequential_engine_build | bool |
| Bestimmte Op-Typen von der Ausführung auf TRT ausschließen | trt_op_types_to_exclude | string |
| Erweiterte Konfiguration und Profiling | ||
| Kontextspeicherfreigabe zwischen Subgraphen aktivieren | trt_context_memory_sharing_enable | bool |
| Layer-Norm-Berechnungen auf FP32 erzwingen | trt_layer_norm_fp32_fallback | bool |
| CUDA-Graphen für geringeren Startaufwand erfassen | trt_cuda_graph_enable | bool |
| Optimierungsstufe für den TensorRT Builder festlegen | trt_builder_optimization_level | int |
| Anzahl zusätzlicher Streams für die Berechnung festlegen | trt_auxiliary_streams | int |
| Taktikquellen für TensorRT angeben | trt_tactic_sources | string |
| Zusätzliche Plugin-Bibliotheks-Pfade für TensorRT hinzufügen | trt_extra_plugin_lib_paths | string |
| Detaillierte Protokollierung der Build-Schritte aktivieren | trt_detailed_build_log | bool |
| Timing-Cache | ||
| Verwendung des Timing-Caches zur Beschleunigung von Builds aktivieren | trt_timing_cache_enable | bool |
| Pfad zum Speichern des Timing-Caches festlegen | trt_timing_cache_path | string |
| Verwendung des Timing-Caches erzwingen, unabhängig von GPU-Übereinstimmung | trt_force_timing_cache | bool |
| Dynamische Form-Profiling | ||
| Minimale Formen definieren | trt_profile_min_shapes | string |
| Maximale Formen definieren | trt_profile_max_shapes | string |
| Optimale Formen definieren | trt_profile_opt_shapes | string |
Hinweis: Boolesche Optionen werden in Python mit **True**/**False** oder in C++ mit **1**/**0** zugewiesen.
Execution Provider Optionen
TensorRT-Konfigurationen können über Execution Provider-Optionen gesetzt werden. Dies ist nützlich, wenn jedes Modell und jede Inferenzsitzung ihre eigenen Konfigurationen haben. In diesem Fall überschreiben die Einstellungen der Execution Provider-Optionen alle Umgebungsvariablen. Alle Konfigurationen müssen explizit gesetzt werden, andernfalls wird der Standardwert übernommen.
device_id
- Beschreibung: GPU-Geräte-ID.
- Standardwert: 0
user_compute_stream
-
Beschreibung: Definiert den Compute-Stream, auf dem die Inferenz ausgeführt werden soll. Dies setzt implizit die Option
has_user_compute_stream. Es kann nicht überUpdateTensorRTProviderOptions, sondern nur überUpdateTensorRTProviderOptionsWithValuegesetzt werden. -
Kann nicht in Kombination mit einem externen Allokator verwendet werden.
-
Kann auch über die Python-API gesetzt werden.
-
D.h. der von PyTorch erfasste CUDA-Stream kann in ORT-TRT übergeben werden. Klicken Sie unten, um Beispielcode anzuzeigen.
import onnxruntime as ort import torch ... sess = ort.InferenceSession('model.onnx') if torch.cuda.is_available(): s = torch.cuda.Stream() option = {"user_compute_stream": str(s.cuda_stream)} sess.set_providers(["TensorrtExecutionProvider"], [option]) options = sess.get_provider_options() assert "TensorrtExecutionProvider" in options assert options["TensorrtExecutionProvider"].get("user_compute_stream", "") == str(s.cuda_stream) assert options["TensorrtExecutionProvider"].get("has_user_compute_stream", "") == "1" ...
-
-
Um den Benutzer-Compute-Stream zu nutzen, wird empfohlen, I/O-Binding zu verwenden, um Ein- und Ausgaben an Tensoren auf dem Gerät zu binden.
trt_max_workspace_size
-
Beschreibung: Maximale Arbeitsbereichsgröße für die TensorRT-Engine.
-
Standardwert: 1073741824 (1 GB).
trt_max_partition_iterations
- Beschreibung: Maximale Anzahl von Iterationen, die bei der Modellpartitionierung für TensorRT zulässig sind.
- Wenn das Zielmodell bei Erreichen der maximalen Anzahl von Iterationen nicht erfolgreich partitioniert werden kann, wird das gesamte Modell auf andere Ausführungsanbieter wie CUDA oder CPU zurückfallen.
- Standardwert: 1000.
trt_min_subgraph_size
-
Beschreibung: Minimale Knotengröße in einem Subgraphen nach der Partitionierung.
- Subgraphen mit kleinerer Größe werden auf andere Ausführungsanbieter zurückfallen.
- Standardwert: 1.
trt_fp16_enable
-
Beschreibung: Aktiviert den FP16-Modus in TensorRT.
Hinweis: Nicht alle NVIDIA-GPUs unterstützen FP16-Präzision.
trt_int8_enable
-
Beschreibung: Aktiviert den INT8-Modus in TensorRT.
Hinweis: Nicht alle NVIDIA-GPUs unterstützen INT8-Präzision.
trt_int8_calibration_table_name
-
Beschreibung: Gibt die INT8-Kalibrierungstabelle für Nicht-QDQ-Modelle im INT8-Modus an.
Hinweis: Es sollte keine Kalibrierungstabelle für QDQ-Modelle bereitgestellt werden, da TensorRT das Laden von Kalibrierungstabellen nicht zulässt, wenn Q/DQ-Knoten im Modell vorhanden sind. Standardmäßig ist der Name leer.
trt_int8_use_native_calibration_table
-
Beschreibung: Wählt aus, welche Kalibrierungstabelle für Nicht-QDQ-Modelle im INT8-Modus verwendet wird.
- Wenn
True, wird die nativ von TensorRT generierte Kalibrierungstabelle verwendet; - Wenn
False, wird die von ONNXRUNTIME generierte Kalibrierungstabelle verwendet.
Hinweis: Bitte kopieren Sie die aktuelle Kalibrierungstabelle vor der Inferenz in den
trt_engine_cache_path. Kalibrierungstabellen sind spezifisch für Modelle und Kalibrierungsdatensätze. Wann immer eine neue Kalibrierungstabelle generiert wird, sollte die alte Datei im Pfad gelöscht oder ersetzt werden. - Wenn
trt_dla_enable
-
Beschreibung: Aktiviert DLA (Deep Learning Accelerator).
Hinweis: Nicht alle NVIDIA-GPUs unterstützen DLA.
trt_dla_core
- Beschreibung: Gibt den DLA-Core an, auf dem ausgeführt werden soll. Standardwert: 0.
trt_engine_cache_enable
-
Beschreibung: Aktiviert das Caching von TensorRT-Engines.
-
Der Zweck des Engine-Cachings ist es, die Build-Zeit von Engines zu reduzieren, da TensorRT lange Zeit für die Optimierung und den Aufbau von Engines benötigen kann.
-
Die Engine wird beim ersten Aufbau gecacht, sodass sie bei der Erstellung einer neuen Inferenzsitzung direkt aus dem Cache geladen werden kann. Um zu validieren, dass die geladene Engine für die aktuelle Inferenz nutzbar ist, wird auch das Engine-Profil mitgeladen. Wenn die aktuellen Eingabeformen innerhalb des Bereichs des Engine-Profils liegen, kann die geladene Engine sicher verwendet werden. Andernfalls, wenn die Eingabeformen außerhalb des Bereichs liegen, wird das Profil-Cache aktualisiert, um die neue Form abzudecken, und die Engine wird basierend auf dem neuen Profil neu erstellt (und auch im Engine-Cache aktualisiert).
- Hinweis: Jede Engine wird für spezifische Einstellungen erstellt, wie z. B. Modellpfad/-name, Präzision (FP32/FP16/INT8 etc.), Arbeitsbereich, Profile etc., und für spezifische GPUs und ist nicht portabel. Daher ist es wichtig sicherzustellen, dass diese Einstellungen nicht geändert werden, da die Engine sonst neu aufgebaut und erneut gecacht werden muss.
Warnung: Bitte löschen Sie alle alten Engine- und Profil-Cache-Dateien (.engine und .profile), wenn eine der folgenden Änderungen eintritt
- Modelländerungen (wenn Änderungen an der Modelltopologie, Opset-Version, Operatoren etc. vorgenommen werden)
- ORT-Versionsänderungen (z. B. Umstieg von ORT-Version 1.8 auf 1.9)
- TensorRT-Versionsänderungen (z. B. Umstieg von TensorRT 7.0 auf 8.0)
trt_engine_cache_path
- Beschreibung: Gibt den Pfad für TensorRT-Engine- und Profil-Dateien an, wenn
trt_engine_cache_enableaufTruegesetzt ist, oder den Pfad für die INT8-Kalibrierungstabelle, wenntrt_int8_enableaufTruegesetzt ist.
trt_engine_cache_prefix
- Beschreibung: Passt das Präfix des Engine-Caches an, wenn
trt_engine_cache_enableaufTruegesetzt ist.- ORT-TRT wird nur bestehende Engine-Cache-Dateien mit angepasstem Präfix wiederverwenden, wenn dasselbe Präfix in
trt_engine_cache_prefixzugewiesen wird. Wenn diese Option leer ist, wird ein neuer Engine-Cache mit dem Standardpräfix generiert.
- ORT-TRT wird nur bestehende Engine-Cache-Dateien mit angepasstem Präfix wiederverwenden, wenn dasselbe Präfix in
trt_dump_subgraphs
- Beschreibung: Gibt die Subgraphen, die in TRT-Engines umgewandelt wurden, im ONNX-Format in das Dateisystem aus.
- Dies kann zur Fehlersuche bei Subgraphen hilfreich sein, z. B. mit
trtexec --onnx my_model.onnxund der Überprüfung der Ausgaben des Parsers.
- Dies kann zur Fehlersuche bei Subgraphen hilfreich sein, z. B. mit
trt_force_sequential_engine_build
- Beschreibung: Baut TensorRT-Engines sequenziell über Provider-Instanzen in einer Multi-GPU-Umgebung.
trt_context_memory_sharing_enable
- Beschreibung: Teilt den Ausführungskontext-Speicher zwischen TensorRT-Subgraphen.
trt_layer_norm_fp32_fallback
- Beschreibung: Erzwingt die Verwendung von FP32 für Pow + Reduce-Operationen in Layer-Norm.
trt_timing_cache_enable
- Beschreibung: Aktiviert den TensorRT Timing-Cache.
- Details finden Sie unter Timing-Cache.
trt_timing_cache_path
- Beschreibung: Gibt den Pfad für den TensorRT Timing-Cache an, wenn
trt_timing_cache_enableaufTruegesetzt ist.- Wenn kein
trt_timing_cache_pathangegeben wird, wird das Arbeitsverzeichnis verwendet.
- Wenn kein
trt_force_timing_cache
- Beschreibung: Erzwingt die Verwendung des TensorRT Timing-Caches, auch wenn das Geräteprofil nicht übereinstimmt.
- Eine exakte Übereinstimmung ist nur mit derselben GPU wie diejenige, die den Timing-Cache erzeugt hat, gegeben.
trt_detailed_build_log
- Beschreibung: Ermöglicht die detaillierte Protokollierung der Build-Schritte auf dem TensorRT EP mit Zeitangabe für jeden Engine-Build.
trt_build_heuristics_enable
- Beschreibung: Baut die Engine mit Heuristiken, um die Build-Zeit zu verkürzen.
trt_cuda_graph_enable
- Beschreibung: Erfasst einen CUDA-Graphen, der bei einem Netzwerk mit vielen kleinen Schichten die Startüberschreitung auf der CPU drastisch reduzieren kann.
trt_sparsity_enable
- Beschreibung: Steuert, ob Sparsity von TRT verwendet werden kann.
- Details finden Sie unter
--sparsityin den Kommandozeilenargumenten vontrtexec: Details.
- Details finden Sie unter
trt_builder_optimization_level
-
Beschreibung: Legt die Optimierungsstufe des Builders fest.
WARNUNG: Stufen unter 3 garantieren keine gute Engine-Leistung, verbessern aber die Build-Zeit erheblich. Standard ist 3, gültiger Bereich [0-5]. Details finden Sie unter
--builderOptimizationLevelin den Kommandozeilenargumenten vontrtexec: Details.
trt_auxiliary_streams
- Beschreibung: Legt die maximale Anzahl zusätzlicher Streams pro Inferenz-Stream fest.
- Das Setzen dieses Wertes auf 0 führt zu einer optimalen Speichernutzung.
- Standard -1 = Heuristiken.
- Details finden Sie unter
--maxAuxStreamsin den Kommandozeilenargumenten vontrtexec: Details.
trt_tactic_sources
- Beschreibung: Gibt die zu verwendenden Taktiken an, indem Taktiken zu den Standard-Taktikquellen hinzugefügt (+) oder daraus entfernt (-) werden (Standard = alle verfügbaren Taktiken).
- z. B. "-CUDNN,+CUBLAS" Verfügbare Schlüssel: "CUBLAS", "CUBLAS_LT", "CUDNN" oder "EDGE_MASK_CONVOLUTIONS".
trt_extra_plugin_lib_paths
- Beschreibung: Gibt zusätzliche TensorRT-Plugin-Bibliotheks-Pfade an.
- ORT TRT unterstützt standardmäßig alle TRT-Plugins, die im TRT-Registry in der TRT-Plugin-Bibliothek (d. h.
libnvinfer_plugin.so) registriert sind. - Darüber hinaus können Benutzer, wenn sie andere TRT-Plugins verwenden möchten, die nicht in der TRT-Plugin-Bibliothek enthalten sind,
- zum Beispiel, FasterTransformer hat viele TRT-Plugin-Implementierungen für verschiedene Modelle, Benutzer können dies angeben wie:
ORT_TENSORRT_EXTRA_PLUGIN_LIB_PATHS=libvit_plugin.so;libvit_int8_plugin.so.
- zum Beispiel, FasterTransformer hat viele TRT-Plugin-Implementierungen für verschiedene Modelle, Benutzer können dies angeben wie:
- ORT TRT unterstützt standardmäßig alle TRT-Plugins, die im TRT-Registry in der TRT-Plugin-Bibliothek (d. h.
trt_profile_min_shapes
trt_profile_max_shapes
trt_profile_opt_shapes
- Beschreibung: Baut mit dynamischen Formen unter Verwendung eines Profils mit den angegebenen Min-/Max-/Opt-Formen.
- Das Format der Profilformen lautet
input_tensor_1:dim_1xdim_2x...,input_tensor_2:dim_3xdim_4x...,...- Diese drei Flags müssen alle bereitgestellt werden, um die explizite Profilform-Funktion zu aktivieren.
- Weitere Details finden Sie unter Expliziter Formbereich für dynamische Form-Eingabe und in der TRT-Dokumentation Optimierungsprofile.
- Das Format der Profilformen lautet
trt_engine_hw_compatible
- Beschreibung: Aktiviert die Ampere+-Hardwarekompatibilität, wenn
trt_engine_cache_enableaktiviert ist.- Hardwarekompatible Engines können in allen Ampere+-GPU-Umgebungen wiederverwendet werden (möglicherweise mit geringerem Durchsatz und/oder höherer Latenz).
- Engines werden mit dem Suffix
sm80+statt der tatsächlichen Rechenleistung generiert und geladen. - Turing und frühere NVIDIA-GPU-Architekturen sowie die NVIDIA Jetson Orin-Plattform sind für diese Option nicht berechtigt.
trt_op_types_to_exclude
- Beschreibung: Schließt bestimmte Op-Typen von der Ausführung auf TRT aus. (Verfügbar in ORT 1.21.0)
- Das Format lautet
op_type_1,op_type_2,op_type_3... - Ein Anwendungsfall ist die Milderung des Leistungsproblems, das weiter unten erwähnt wird. Es ermöglicht Benutzern, DDS-Operationen von der Ausführung auf TensorRT auszuschließen und sicherzustellen, dass sie stattdessen von CUDA EP oder CPU EP ausgeführt werden.
./onnxruntime_perf_test -r 1 -e tensorrt -i "trt_op_types_to_exclude|NonMaxSuppression,NonZero,RoiAlign" /path/to/onnx/your_model.onnx - Ein weiterer Anwendungsfall ist das Experimentieren mit der Zuweisung von OPs zu CUDA EP vs. TRT EP.
- Das Format lautet
Umgebungsvariablen (veraltet)
Folgende Umgebungsvariablen können für den TensorRT Execution Provider gesetzt werden. Klicken Sie unten für weitere Details.
-
ORT_TENSORRT_MAX_WORKSPACE_SIZE: Maximale Arbeitsbereichsgröße für die TensorRT-Engine. Standardwert: 1073741824 (1 GB). -
ORT_TENSORRT_MAX_PARTITION_ITERATIONS: Maximale Anzahl von Iterationen, die bei der Modellpartitionierung für TensorRT zulässig sind. Wenn das Zielmodell bei Erreichen der maximalen Anzahl von Iterationen nicht erfolgreich partitioniert werden kann, wird das gesamte Modell auf andere Ausführungsanbieter wie CUDA oder CPU zurückfallen. Standardwert: 1000. -
ORT_TENSORRT_MIN_SUBGRAPH_SIZE: Minimale Knotengröße in einem Subgraphen nach der Partitionierung. Subgraphen mit kleinerer Größe werden auf andere Ausführungsanbieter zurückfallen. Standardwert: 1. -
ORT_TENSORRT_FP16_ENABLE: Aktiviert den FP16-Modus in TensorRT. 1: aktiviert, 0: deaktiviert. Standardwert: 0. Hinweis: Nicht alle NVIDIA-GPUs unterstützen FP16-Präzision. -
ORT_TENSORRT_INT8_ENABLE: Aktiviert den INT8-Modus in TensorRT. 1: aktiviert, 0: deaktiviert. Standardwert: 0. Hinweis: Nicht alle NVIDIA-GPUs unterstützen INT8-Präzision. -
ORT_TENSORRT_INT8_CALIBRATION_TABLE_NAME: Gibt die INT8-Kalibrierungstabelle für Nicht-QDQ-Modelle im INT8-Modus an. Hinweis: Es sollte keine Kalibrierungstabelle für QDQ-Modelle bereitgestellt werden, da TensorRT das Laden von Kalibrierungstabellen nicht zulässt, wenn Q/DQ-Knoten im Modell vorhanden sind. Standardmäßig ist der Name leer. ORT_TENSORRT_INT8_USE_NATIVE_CALIBRATION_TABLE: Wählt aus, welche Kalibrierungstabelle für Nicht-QDQ-Modelle im INT8-Modus verwendet wird. Wenn 1, wird die nativ von TensorRT generierte Kalibrierungstabelle verwendet; wenn 0, wird die von ONNXRUNTIME generierte Kalibrierungstabelle verwendet. Standardwert: 0.- Hinweis: Bitte kopieren Sie die aktuelle Kalibrierungstabelle vor der Inferenz in den
ORT_TENSORRT_CACHE_PATH. Kalibrierungstabellen sind spezifisch für Modelle und Kalibrierungsdatensätze. Wann immer eine neue Kalibrierungstabelle generiert wird, sollte die alte Datei im Pfad gelöscht oder ersetzt werden.
- Hinweis: Bitte kopieren Sie die aktuelle Kalibrierungstabelle vor der Inferenz in den
-
ORT_TENSORRT_DLA_ENABLE: Aktiviert DLA (Deep Learning Accelerator). 1: aktiviert, 0: deaktiviert. Standardwert: 0. Hinweis: Nicht alle NVIDIA-GPUs unterstützen DLA. -
ORT_TENSORRT_DLA_CORE: Gibt den DLA-Core an, auf dem ausgeführt werden soll. Standardwert: 0. ORT_TENSORRT_ENGINE_CACHE_ENABLE: Aktiviert das Caching von TensorRT-Engines. Der Zweck des Engine-Cachings ist es, die Build-Zeit von Engines zu reduzieren, da TensorRT lange Zeit für die Optimierung und den Aufbau von Engines benötigen kann. Die Engine wird beim ersten Aufbau gecacht, sodass sie bei der Erstellung einer neuen Inferenzsitzung direkt aus dem Cache geladen werden kann. Um zu validieren, dass die geladene Engine für die aktuelle Inferenz nutzbar ist, wird auch das Engine-Profil mitgeladen. Wenn die aktuellen Eingabeformen innerhalb des Bereichs des Engine-Profils liegen, kann die geladene Engine sicher verwendet werden. Andernfalls, wenn die Eingabeformen außerhalb des Bereichs liegen, wird das Profil-Cache aktualisiert, um die neue Form abzudecken, und die Engine wird basierend auf dem neuen Profil neu erstellt (und auch im Engine-Cache aktualisiert). Hinweis: Jede Engine wird für spezifische Einstellungen erstellt, wie z. B. Modellpfad/-name, Präzision (FP32/FP16/INT8 etc.), Arbeitsbereich, Profile etc., und für spezifische GPUs und ist nicht portabel. Daher ist es wichtig sicherzustellen, dass diese Einstellungen nicht geändert werden, da die Engine sonst neu aufgebaut und erneut gecacht werden muss. 1: aktiviert, 0: deaktiviert. Standardwert: 0.- Warnung: Bitte löschen Sie alle alten Engine- und Profil-Cache-Dateien (.engine und .profile), wenn eine der folgenden Änderungen eintritt
- Modelländerungen (wenn Änderungen an der Modelltopologie, Opset-Version, Operatoren etc. vorgenommen werden)
- ORT-Versionsänderungen (z. B. Umstieg von ORT-Version 1.8 auf 1.9)
- TensorRT-Versionsänderungen (z. B. Umstieg von TensorRT 7.0 auf 8.0)
- Hardwareänderungen. (Engine- und Profil-Dateien sind nicht portabel und für spezifische NVIDIA-Hardware optimiert)
- Warnung: Bitte löschen Sie alle alten Engine- und Profil-Cache-Dateien (.engine und .profile), wenn eine der folgenden Änderungen eintritt
-
ORT_TENSORRT_CACHE_PATH: Gibt den Pfad für TensorRT-Engine- und Profil-Dateien an, wennORT_TENSORRT_ENGINE_CACHE_ENABLEauf 1 gesetzt ist, oder den Pfad für die INT8-Kalibrierungstabelle, wenn ORT_TENSORRT_INT8_ENABLE auf 1 gesetzt ist. -
ORT_TENSORRT_DUMP_SUBGRAPHS: Gibt die Subgraphen, die in TRT-Engines umgewandelt wurden, im ONNX-Format in das Dateisystem aus. Dies kann zur Fehlersuche bei Subgraphen hilfreich sein, z. B. mittrtexec --onnx my_model.onnxund der Überprüfung der Ausgaben des Parsers. 1: aktiviert, 0: deaktiviert. Standardwert: 0. -
ORT_TENSORRT_FORCE_SEQUENTIAL_ENGINE_BUILD: Baut TensorRT-Engines sequenziell über Provider-Instanzen in einer Multi-GPU-Umgebung. 1: aktiviert, 0: deaktiviert. Standardwert: 0. -
ORT_TENSORRT_CONTEXT_MEMORY_SHARING_ENABLE: Teilt den Ausführungskontext-Speicher zwischen TensorRT-Subgraphen. Standard 0 = false, ungleich Null = true. -
ORT_TENSORRT_LAYER_NORM_FP32_FALLBACK: Erzwingt die Verwendung von FP32 für Pow + Reduce-Operationen in Layer-Norm. Standard 0 = false, ungleich Null = true. -
ORT_TENSORRT_TIMING_CACHE_ENABLE: Aktiviert den TensorRT Timing-Cache. Standard 0 = false, ungleich Null = true. Details finden Sie unter Timing-Cache. -
ORT_TENSORRT_FORCE_TIMING_CACHE_ENABLE: Erzwingt die Verwendung des TensorRT Timing-Caches, auch wenn das Geräteprofil nicht übereinstimmt. Standard 0 = false, ungleich Null = true. -
ORT_TENSORRT_DETAILED_BUILD_LOG_ENABLE: Ermöglicht die detaillierte Protokollierung der Build-Schritte auf dem TensorRT EP mit Zeitangabe für jeden Engine-Build. Standard 0 = false, ungleich Null = true. -
ORT_TENSORRT_BUILD_HEURISTICS_ENABLE: Baut die Engine mit Heuristiken, um die Build-Zeit zu verkürzen. Standard 0 = false, ungleich Null = true. -
ORT_TENSORRT_SPARSITY_ENABLE: Steuert, ob Sparsity von TRT verwendet werden kann. Standard 0 = false, 1 = true. Details finden Sie unter--sparsityin den Kommandozeilenargumenten vontrtexec: Details. -
ORT_TENSORRT_BUILDER_OPTIMIZATION_LEVEL: Legt die Optimierungsstufe des Builders fest. WARNUNG: Stufen unter 3 garantieren keine gute Engine-Leistung, verbessern aber die Build-Zeit erheblich. Standard ist 3, gültiger Bereich [0-5]. Details finden Sie unter--builderOptimizationLevelin den Kommandozeilenargumenten vontrtexec: Details. -
ORT_TENSORRT_AUXILIARY_STREAMS: Legt die maximale Anzahl zusätzlicher Streams pro Inferenz-Stream fest. Das Setzen dieses Wertes auf 0 führt zu einer optimalen Speichernutzung. Standard -1 = Heuristiken. Details finden Sie unter--maxAuxStreamsin den Kommandozeilenargumenten vontrtexec: Details. -
ORT_TENSORRT_TACTIC_SOURCES: Gibt die zu verwendenden Taktiken an, indem Taktiken zu den Standard-Taktikquellen hinzugefügt (+) oder daraus entfernt (-) werden (Standard = alle verfügbaren Taktiken). z. B. "-CUDNN,+CUBLAS" Verfügbare Schlüssel: "CUBLAS", "CUBLAS_LT", "CUDNN" oder "EDGE_MASK_CONVOLUTIONS". -
ORT_TENSORRT_EXTRA_PLUGIN_LIB_PATHS: Gibt zusätzliche TensorRT-Plugin-Bibliotheks-Pfade an. ORT TRT unterstützt standardmäßig alle TRT-Plugins, die im TRT-Registry in der TRT-Plugin-Bibliothek (d. h.libnvinfer_plugin.so) registriert sind. Darüber hinaus können Benutzer, wenn sie andere TRT-Plugins verwenden möchten, die nicht in der TRT-Plugin-Bibliothek enthalten sind, zum Beispiel, FasterTransformer hat viele TRT-Plugin-Implementierungen für verschiedene Modelle, Benutzer können dies angeben wie:ORT_TENSORRT_EXTRA_PLUGIN_LIB_PATHS=libvit_plugin.so;libvit_int8_plugin.so. ORT_TENSORRT_PROFILE_MIN_SHAPES,ORT_TENSORRT_PROFILE_MAX_SHAPESundORT_TENSORRT_PROFILE_OPT_SHAPES: Baut mit dynamischen Formen unter Verwendung eines Profils mit den Min-/Max-/Opt-Formen. Das Format der Profilformen lautet "input_tensor_1:dim_1xdim_2x...,input_tensor_2:dim_3xdim_4x...,..." und diese drei Flags müssen alle bereitgestellt werden, um die explizite Profilform-Funktion zu aktivieren. Weitere Details finden Sie unter Expliziter Formbereich für dynamische Form-Eingabe und in der TRT-Dokumentation Optimierungsprofile.
Man kann Standardwerte überschreiben, indem man Umgebungsvariablen setzt. z. B. unter Linux
# Override default max workspace size to 2GB
export ORT_TENSORRT_MAX_WORKSPACE_SIZE=2147483648
# Override default maximum number of iterations to 10
export ORT_TENSORRT_MAX_PARTITION_ITERATIONS=10
# Override default minimum subgraph node size to 5
export ORT_TENSORRT_MIN_SUBGRAPH_SIZE=5
# Enable FP16 mode in TensorRT
export ORT_TENSORRT_FP16_ENABLE=1
# Enable INT8 mode in TensorRT
export ORT_TENSORRT_INT8_ENABLE=1
# Use native TensorRT calibration table
export ORT_TENSORRT_INT8_USE_NATIVE_CALIBRATION_TABLE=1
# Enable TensorRT engine caching
export ORT_TENSORRT_ENGINE_CACHE_ENABLE=1
# Please Note warning above. This feature is experimental.
# Engine cache files must be invalidated if there are any changes to the model, ORT version, TensorRT version or if the underlying hardware changes. Engine files are not portable across devices.
# Specify TensorRT cache path
export ORT_TENSORRT_CACHE_PATH="/path/to/cache"
# Dump out subgraphs to run on TensorRT
export ORT_TENSORRT_DUMP_SUBGRAPHS=1
# Enable context memory sharing between TensorRT subgraphs. Default 0 = false, nonzero = true
export ORT_TENSORRT_CONTEXT_MEMORY_SHARING_ENABLE=1
TensorRT EP Caches
Es gibt drei Haupt-TRT EP-Caches
- TRT Timing-Cache
- TRT Engine-Cache
- Eingebettetes Engine-Modell / EPContext-Modell
Caches können helfen, die Sitzungserstellungszeit von Minuten auf Sekunden zu reduzieren
Die folgenden Zahlen werden ab der Initialisierungssitzung mit TRT EP für das SD UNet-Modell gemessen.
- Kein Cache (Standard) – 384 Sekunden
- Der erste Lauf (Warmup) kann sehr lange dauern, da der Aufbau der Engine eine umfassende Profilerstellung für jeden Kernel beinhaltet, um den optimalen auszuwählen.
- Timing-Cache verwendet – 42 Sekunden
- Layer-Profiling-Informationen beibehalten und wiederverwenden, um die Erstellungszeit zu beschleunigen
- Timing-Cache kann über mehrere Modelle hinweg geteilt werden, wenn die Layer gleich sind
- Engine-Cache verwendet – 9 Sekunden
- Engine aus dem Speicher auf die Festplatte serialisieren für spätere Verwendung
- Den gesamten Engine-Aufbau überspringen und den Engine-Cache in den Speicher deserialisieren
- Eingebettete Engine verwendet (keine Builder-Instanziierung) - 1,9 Sekunden
- Der serialisierte Engine-Cache ist in ein ONNX-Modell eingepackt
- Es wird kein Builder instanziiert, noch wird eine Engine erstellt
- Engine schnell mit weniger benötigten Prozessen laden
So werden Caches eingerichtet
- Timing-Cache verwenden (.timing)
trt_timing_cache_enable = truetrt_timing_cache_path = .\trt_force_timing_cache = true (akzeptiert geringfügige GPU-Abweichungen innerhalb von CC)
- Engine-Cache verwenden (.engine)
trt_engine_cache_enable = truetrt_engine_cache_path = .\trt_engines
- Embed Engine verwenden (_ctx.onnx)
- Holen Sie sich das eingebettete Engine-Modell über einen Warmup-Lauf mit dem Originalmodell
trt_engine_cache_enable = truetrt_dump_ep_context_model = truetrt_ep_context_file_path = .\- Wird mit Eingaben/Ausgaben generiert, die mit dem Originalmodell identisch sind
- Führen Sie das eingebettete Engine-Modell wie das Originalmodell aus!
Die Ordnerstruktur der Caches
Mit dem folgenden Befehl wird das eingebettete Engine-Modell (model_ctx.onnx) zusammen mit dem Engine-Cache im selben Verzeichnis generiert.
Hinweis: Das Beispiel gibt trt_engine_cache_path nicht an, da onnxruntime_perf_test eine bestimmte Ordnerstruktur zum Ausführen der Inferenz benötigt. Wir empfehlen jedoch dennoch, trt_engine_cache_path anzugeben, um die Caches besser zu organisieren.
$./onnxruntime_perf_test -e tensorrt -r 1 -i "trt_engine_cache_enable|true trt_dump_ep_context_model|true" /model_database/transformer_model/model.onnx
Nach Abschluss der Inferenz wird das eingebettete Engine-Modell auf der Festplatte gespeichert. Benutzer können dieses Modell dann wie das Originalmodell ausführen, jedoch mit einer erheblich schnelleren Sitzungserstellungszeit.
$./onnxruntime_perf_test -e tensorrt -r 1 /model_database/transformer_model/model_ctx.onnx
Mehr über eingebettete Engine-Modelle / EPContext-Modelle
- Eine Einschränkung ist, dass das gesamte Modell TRT-fähig sein muss
- Beim Ausführen des eingebetteten Engine-Modells ist die Standardeinstellung
trt_ep_context_embed_mode=0, bei der der Engine-Cache-Pfad eingebettet ist und TRT EP den Engine-Cache auf der Festplatte sucht. Alternativ können Benutzertrt_ep_context_embed_mode=1einstellen, wodurch die gesamten Engine-Binärdaten als String im Modell eingebettet werden. Dieser Modus erhöht jedoch die Initialisierungszeit aufgrund der ORT-Graph-Optimierung, die den langen String hasht. Daher empfehlen wir die Verwendung vontrt_ep_context_embed_mode=0. - Der Standardname eines eingebetteten Engine-Modells hat
_ctx.onnxam Ende angehängt. Benutzer könnentrt_ep_context_file_path=my_ep_context_model.onnxangeben, um diesen Standardnamen zu überschreiben. - Wenn eine eingebettete Engine verwendet wird, ist die Bibliothek
nvinfer_builder_resourcevon TensorRT nicht erforderlich, welche mit Abstand die größte Bibliothek ist. Dies ermöglicht den Fall, dass ein minimaler Satz von Bibliotheken versendet wird, wenn eine feste Menge von Modellen verwendet wird, die als vorkompilierte Engine verpackt sind. - Neben allem, was eingebettete Engines ermöglichen, um die Ladezeit zu beschleunigen, ermöglichen sie auch das Verpacken einer extern kompilierten Engine, z. B. mit
trtexec. Ein Python-Skript, das eine solche vorkompilierte Engine in eine ONNX-Datei verpacken kann, ist in den Python-Tools enthalten.
Performance-Tuning
Informationen zum Performance-Tuning finden Sie auf dieser Seite: ONNX Runtime Perf Tuning
Wenn Sie onnxruntime_perf_test verwenden, verwenden Sie das Flag -e tensorrt. Siehe unten für ein Beispiel.
Shape-Inferenz für TensorRT-Subgraphen
Wenn einige Operatoren im Modell nicht von TensorRT unterstützt werden, partitioniert ONNX Runtime den Graphen und sendet nur unterstützte Teilgraphen an den TensorRT Execution Provider. Da TensorRT erfordert, dass alle Eingaben der Teilgraphen eine angegebene Form haben, gibt ONNX Runtime einen Fehler aus, wenn keine Eingabeform-Informationen vorhanden sind. In diesem Fall führen Sie zuerst die Shape-Inferenz für das gesamte Modell durch, indem Sie das Skript hier ausführen (siehe unten für ein Beispiel).
Unterstützung für TensorRT-Plugins
ORT TRT kann die TRT-Plugins nutzen, die mit der TRT-Plugin-Bibliothek in der offiziellen Version geliefert werden. Um TRT-Plugins zu verwenden, müssen Benutzer zuerst den benutzerdefinierten Knoten (eine Eins-zu-eins-Zuordnung zum TRT-Plugin) mit einem registrierten Plugin-Namen und der Domäne trt.plugins im ONNX-Modell erstellen. So kann ORT TRT diesen benutzerdefinierten Knoten erkennen und den Knoten zusammen mit dem Teilgraphen an TRT übergeben. Bitte sehen Sie das folgende Python-Beispiel, um einen neuen benutzerdefinierten Knoten im ONNX-Modell zu erstellen
Klicken Sie unten für ein Python-API-Beispiel
from onnx import TensorProto, helper
def generate_model(model_name):
nodes = [
helper.make_node(
"DisentangledAttention_TRT", # The registered name is from https://github.com/NVIDIA/TensorRT/blob/main/plugin/disentangledAttentionPlugin/disentangledAttentionPlugin.cpp#L36
["input1", "input2", "input3"],
["output"],
"DisentangledAttention_TRT",
domain="trt.plugins", # The domain has to be "trt.plugins"
factor=0.123,
span=128,
),
]
graph = helper.make_graph(
nodes,
"trt_plugin_custom_op",
[ # input
helper.make_tensor_value_info("input1", TensorProto.FLOAT, [12, 256, 256]),
helper.make_tensor_value_info("input2", TensorProto.FLOAT, [12, 256, 256]),
helper.make_tensor_value_info("input3", TensorProto.FLOAT, [12, 256, 256]),
],
[ # output
helper.make_tensor_value_info("output", TensorProto.FLOAT, [12, 256, 256]),
],
)
model = helper.make_model(graph)
onnx.save(model, model_name)
Hinweis: Wenn Benutzer TRT-Plugins verwenden möchten, die nicht in der TRT-Plugin-Bibliothek der offiziellen Version enthalten sind, lesen Sie bitte die ORT TRT Provider-Option trt_extra_plugin_lib_paths für weitere Details.
Timing-Cache
Das Aktivieren von trt_timing_cache_enable ermöglicht es ORT TRT, den TensorRT Timing-Cache zu verwenden, um die Build-Zeit einer Engine auf einem Gerät mit derselben Compute-Fähigkeit zu beschleunigen. Dies funktioniert über Modelle hinweg, da es einfach Kernel-Latenzen für bestimmte Konfigurationen und Cubins speichert (TRT 9.0+). Diese Dateien sind normalerweise sehr klein (nur wenige KB oder MB), was es sehr einfach macht, sie mit einer Anwendung zu versenden, um die Build-Zeit beim Benutzer zu beschleunigen.
Hinweis: Ein Timing-Cache kann über eine GPU-Compute-Fähigkeit hinweg verwendet werden, ähnlich wie eine Engine. Dennoch ist der bevorzugte Weg, einen pro GPU-Modell zu verwenden, aber die Praxis zeigt, dass die gemeinsame Nutzung über eine Compute-Fähigkeit in den meisten Fällen gut funktioniert.
Die folgenden Beispiele zeigen die Reduzierung der Build-Zeit mit dem Timing-Cache
| Modell | kein Cache | mit Cache |
|---|---|---|
| efficientnet-lite4-11 | 34,6 s | 7,7 s |
| yolov4 | 108,62 s | 9,4 s |
Klicken Sie unten für ein Python-Beispiel
import onnxruntime as ort
ort.set_default_logger_severity(0) # Turn on verbose mode for ORT TRT
sess_options = ort.SessionOptions()
trt_ep_options = {
"trt_timing_cache_enable": True,
}
sess = ort.InferenceSession(
"my_model.onnx",
providers=[
("TensorrtExecutionProvider", trt_ep_options),
"CUDAExecutionProvider",
],
)
# Once inference session initialization is done (assume no dynamic shape input, otherwise you must wait until inference run is done)
# you can find timing cache is saved in the 'trt_engine_cache_path' directory, e.g., TensorrtExecutionProvider_cache_cc75.timing, please note
# that the name contains information of compute capability.
sess.run(
None,
{"input_ids": np.zeros((1, 77), dtype=np.int32)}
)
Expliziter Wertebereich für dynamische Eingabeformen
ORT TRT ermöglicht es Ihnen, Min-/Max-/Opt-Formen für jede dynamische Eingabeform explizit über drei Provider-Optionen festzulegen: trt_profile_min_shapes, trt_profile_max_shapes und trt_profile_opt_shapes. Wenn diese drei Provider-Optionen nicht angegeben sind und das Modell eine dynamische Eingabeform hat, ermittelt ORT TRT die Min-/Max-/Opt-Formen für die dynamische Eingabeform basierend auf dem eingehenden Eingabe-Tensor. Die Min-/Max-/Opt-Formen sind für das TRT-Optimierungsprofil erforderlich (Ein Optimierungsprofil beschreibt einen Wertebereich von Dimensionen für jede TRT-Netzwerkeingabe und die Dimensionen, die der Autotuner für die Optimierung verwendet. Bei Verwendung von Laufzeitdimensionen müssen Sie mindestens ein Optimierungsprofil zur Build-Zeit erstellen).
Um die mit Optimierungsprofilen erstellte Engine, die durch explizite Formenbereiche angegeben wurden, zu verwenden, müssen Benutzer weiterhin diese drei Provider-Optionen sowie die Engine-Cache-Aktivierungsflag angeben. ORT TRT vergleicht zuerst die Formenbereiche dieser drei Provider-Optionen mit den im .profile-Datei gespeicherten Formenbereichen und baut die Engine dann neu auf, wenn die Formenbereiche nicht übereinstimmen.
Klicken Sie unten für ein Python-Beispiel
import onnxruntime as ort
ort.set_default_logger_severity(0) # Turn on verbose mode for ORT TRT
sess_options = ort.SessionOptions()
trt_ep_options = {
"trt_fp16_enable": True,
"trt_engine_cache_enable": True,
"trt_profile_min_shapes": "sample:2x4x64x64,encoder_hidden_states:2x77x768",
"trt_profile_max_shapes": "sample:32x4x64x64,encoder_hidden_states:32x77x768",
"trt_profile_opt_shapes": "sample:2x4x64x64,encoder_hidden_states:2x77x768",
}
sess = ort.InferenceSession(
"my_model.onnx",
providers=[
("TensorrtExecutionProvider", trt_ep_options),
"CUDAExecutionProvider",
],
)
batch_size = 1
unet_dim = 4
max_text_len = 77
embed_dim = 768
latent_height = 64
latent_width = 64
args = {
"sample": np.zeros(
(2 * batch_size, unet_dim, latent_height, latent_width), dtype=np.float32
),
"timestep": np.ones((1,), dtype=np.float32),
"encoder_hidden_states": np.zeros(
(2 * batch_size, max_text_len, embed_dim),
dtype=np.float32,
),
}
sess.run(None, args)
# you can find engine cache and profile cache are saved in the 'trt_engine_cache_path' directory, e.g.
# TensorrtExecutionProvider_TRTKernel_graph_torch_jit_1843998305741310361_0_0_fp16.engine and TensorrtExecutionProvider_TRTKernel_graph_torch_jit_1843998305741310361_0_0_fp16.profile.
Bitte beachten Sie, dass es eine Einschränkung bei der Verwendung dieser expliziten Formenbereichsfunktion gibt, d. h. alle dynamischen Eingabeformen müssen mit entsprechenden Min-/Max-/Opt-Formen angegeben werden.
Datenabhängige Form (DDS) Ops
Die DDS-Operationen – NonMaxSuppression, NonZero und RoiAlign – haben Ausgabeformen, die erst zur Laufzeit bestimmt werden.
Um sicherzustellen, dass DDS-Ops von TRT-EP/TRT anstelle von CUDA EP oder CPU EP ausgeführt werden, überprüfen Sie Folgendes
- Für TensorRT < 10.7: ORT mit dem onnx-tensorrt OSS Parser kompilieren und den Branch
10.X-GA-ORT-DDSverwenden. - Für TensorRT >= 10.7: Standardmäßig werden DDS-Ops von TRT ausgeführt.
- Für ORT: Standardmäßig verlässt sich ORT auf den TRT-Parser, um zu entscheiden, ob DDS-Ops mit TRT ausgeführt werden. Beachten Sie jedoch, dass ORT 1.20.1 und 1.20.2 DDS-Ops aufgrund eines bekannten Leistungsproblems nicht mit TRT ausführen.
Beispiele
Dieses Beispiel zeigt, wie das Faster R-CNN-Modell auf dem TensorRT Execution Provider ausgeführt wird.
-
Laden Sie das Faster R-CNN ONNX-Modell aus dem ONNX Model Zoo hier herunter.
- Formen im Modell inferieren, indem das Shape-Inferenz-Skript ausgeführt wird
python symbolic_shape_infer.py --input /path/to/onnx/model/model.onnx --output /path/to/onnx/model/new_model.onnx --auto_merge -
Um das Modell mit Beispiel-Eingaben zu testen und die Ausgaben zu verifizieren, führen Sie
onnx_test_runnerim ONNX Runtime Build-Verzeichnis aus.Modelle und der Ordner test_data_set_ müssen unter demselben Pfad gespeichert werden.
onnx_test_runnertestet alle Modelle unter diesem Pfad../onnx_test_runner -e tensorrt /path/to/onnx/model/ -
Um die Modellleistung zu testen, führen Sie
onnxruntime_perf_testmit Ihrem form-inferierten Faster-RCNN-Modell ausLaden Sie Beispiel-Testdaten mit dem Modell aus dem Model Zoo herunter und legen Sie den Ordner test_data_set neben Ihr inferiertes Modell.
# e.g. # -r: set up test repeat time # -e: set up execution provider # -i: set up params for execution provider options ./onnxruntime_perf_test -r 1 -e tensorrt -i "trt_fp16_enable|true" /path/to/onnx/your_inferred_model.onnx
Siehe dieses Notebook für ein Beispiel zum Ausführen eines Modells auf einer GPU mit ONNX Runtime über Azure Machine Learning Services.
Bekannte Probleme
- Der integrierte Parser von TensorRT 8.6 und der OSS-Parser von TensorRT verhalten sich unterschiedlich. Insbesondere kann der integrierte Parser einige benutzerdefinierte Plugin-Ops nicht erkennen, während der OSS-Parser dies kann. Siehe EfficientNMS_TRT fehlendes Attribut class_agnostic mit TensorRT 8.6.
- Es gibt ein Leistungsproblem bei TensorRT-Versionen 10.0 bis 10.5 beim Ausführen von Modellen wie Faster-RCNN, die
- datenabhängige Form (DDS) Operationen wie NonMaxSuppression, NonZero und RoiAlign enthalten und
- DDS-Ops mit TRT ausgeführt werden