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

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 über UpdateTensorRTProviderOptions, sondern nur über UpdateTensorRTProviderOptionsWithValue gesetzt 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.

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_enable auf True gesetzt ist, oder den Pfad für die INT8-Kalibrierungstabelle, wenn trt_int8_enable auf True gesetzt ist.
trt_engine_cache_prefix
  • Beschreibung: Passt das Präfix des Engine-Caches an, wenn trt_engine_cache_enable auf True gesetzt ist.
    • ORT-TRT wird nur bestehende Engine-Cache-Dateien mit angepasstem Präfix wiederverwenden, wenn dasselbe Präfix in trt_engine_cache_prefix zugewiesen wird. Wenn diese Option leer ist, wird ein neuer Engine-Cache mit dem Standardpräfix generiert.
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.onnx und der Überprüfung der Ausgaben des Parsers.
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.
trt_timing_cache_path
  • Beschreibung: Gibt den Pfad für den TensorRT Timing-Cache an, wenn trt_timing_cache_enable auf True gesetzt ist.
    • Wenn kein trt_timing_cache_path angegeben wird, wird das Arbeitsverzeichnis verwendet.
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 --sparsity in den Kommandozeilenargumenten von trtexec: Details.
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 --builderOptimizationLevel in den Kommandozeilenargumenten von trtexec: 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 --maxAuxStreams in den Kommandozeilenargumenten von trtexec: 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.
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.
trt_engine_hw_compatible
  • Beschreibung: Aktiviert die Ampere+-Hardwarekompatibilität, wenn trt_engine_cache_enable aktiviert 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.

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.
  • 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)
  • ORT_TENSORRT_CACHE_PATH: Gibt den Pfad für TensorRT-Engine- und Profil-Dateien an, wenn ORT_TENSORRT_ENGINE_CACHE_ENABLE auf 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. mit trtexec --onnx my_model.onnx und 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 --sparsity in den Kommandozeilenargumenten von trtexec: 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 --builderOptimizationLevel in den Kommandozeilenargumenten von trtexec: 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 --maxAuxStreams in den Kommandozeilenargumenten von trtexec: 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_SHAPES und ORT_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

image

So werden Caches eingerichtet

  • Timing-Cache verwenden (.timing)
    • trt_timing_cache_enable = true
    • trt_timing_cache_path = .\
    • trt_force_timing_cache = true (akzeptiert geringfügige GPU-Abweichungen innerhalb von CC)
  • Engine-Cache verwenden (.engine)
    • trt_engine_cache_enable = true
    • trt_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 = true
    • trt_dump_ep_context_model = true
    • trt_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

image

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 Benutzer trt_ep_context_embed_mode=1 einstellen, 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 von trt_ep_context_embed_mode=0.
  • Der Standardname eines eingebetteten Engine-Modells hat _ctx.onnx am Ende angehängt. Benutzer können trt_ep_context_file_path=my_ep_context_model.onnx angeben, um diesen Standardnamen zu überschreiben.
  • Wenn eine eingebettete Engine verwendet wird, ist die Bibliothek nvinfer_builder_resource von 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-DDS verwenden.
  • 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.

  1. Laden Sie das Faster R-CNN ONNX-Modell aus dem ONNX Model Zoo hier herunter.

  2. 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
    
  3. Um das Modell mit Beispiel-Eingaben zu testen und die Ausgaben zu verifizieren, führen Sie onnx_test_runner im ONNX Runtime Build-Verzeichnis aus.

    Modelle und der Ordner test_data_set_ müssen unter demselben Pfad gespeichert werden. onnx_test_runner testet alle Modelle unter diesem Pfad.

     ./onnx_test_runner -e tensorrt /path/to/onnx/model/
    
  4. Um die Modellleistung zu testen, führen Sie onnxruntime_perf_test mit Ihrem form-inferierten Faster-RCNN-Modell aus

    Laden 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