
So verwenden Sie Tensorrt C ++ API für Hochleistungs-GPU-Maschinenlern-Inferenz.
Unterstützt Modelle mit einzelnen / mehreren Eingängen und Einzel- / Mehrfachausgängen mit Charge.
Projektübersicht Video. Code Deep-Dive-Video
Dieses Projekt sucht aktiv nach Betreuer, um sein Wachstum und die Verbesserung zu leiten. Wenn Sie sich für dieses Projekt begeistern und an einem Beitrag interessiert sind, würde ich gerne von Ihnen hören!
Bitte wenden Sie sich bitte über LinkedIn, um zu besprechen, wie Sie sich engagieren können.
Ich habe alle Nvidia Tensorrt -Dokumente gelesen, damit Sie es nicht müssen!
Dieses Projekt zeigt, wie die Tensorrt C ++ - API für Hochleistungs -GPU -Inferenz für Bilddaten verwendet wird. Es behandelt, wie man Folgendes macht:
In den folgenden Anweisungen werden Ubuntu 20.04 oder 22.04 verwendet. Sie müssen Ihr eigenes ONNX -Modell für diesen Beispielcode angeben oder das Beispielmodell herunterladen (siehe Abschnitt "Senty Check unten).
sudo apt install build-essentialsudo snap install cmake --classicsudo apt install libspdlog-dev libfmt-dev (zur Protokollierung)build_opencv.sh in ./scripts/ aus.CUDNN_INCLUDE_DIR und CUDNN_LIBRARY im Skript ändern.CMakeLists.txt und ersetzen Sie den TODO durch den Pfad zu Ihrer Tensorrt -Installation.mkdir buildcd buildcmake ..make -j$(nproc)./run_inference_benchmark --onnx_model ../models/yolov8n.onnx./run_inference_benchmark --trt_model ../models/yolov8n.engine.NVIDIAGeForceRTX3080LaptopGPU.fp16.1.1YOLOv8n -Modell von hier herunter.pip3 install ultralytics zuerst durchführen. from ultralytics import YOLO
model = YOLO ( "./yolov8n.pt" )
model . fuse ()
model . info ( verbose = False ) # Print model information
model . export ( format = "onnx" , opset = 12 ) # Export the model to onnx using opset 12yolov8n.onnx , im Verzeichnis ./models/ ../inputs/team.jpg sollte den folgenden Feature -Vektor erzeugen: 3.41113 16.5312 20.8828 29.8984 43.7266 54.9609 62.0625 65.8594 70.0312 72.9531 ...
Durch die Aktivierung von INT8 -Präzision kann die Inferenz auf Kosten der Genauigkeitsreduzierung aufgrund des verringerten Dynamikbereichs weiter beschleunigt werden. Für die Int8 -Präzision muss der Benutzer Kalibrierungsdaten liefern, die für reale Daten repräsentativ sind, die das Modell angezeigt wird. Es wird empfohlen, 1K+ Kalibrierungsbilder zu verwenden. Um das Inferenz von INT8 mit dem Yolov8 -Vernunft -Check -Modell zu ermöglichen, müssen die folgenden Schritte unternommen werden:
options.precision = Precision::FP16; an options.precision = Precision::INT8; in main.cppoptions.calibrationDataDirectoryPath = ""; Muss in main.cpp geändert werden, um den Pfad anzugeben, der Kalibrierungsdaten enthält.wget http://images.cocodataset.org/zips/val2017.zip heruntergeladen werden kannInt8EntropyCalibrator2::getBatch -Methode in engine.cpp (siehe TODO ) für Ihr Modell korrekt ist..calibration ), damit er nach nachfolgenden Modelloptimierungen wiederverwendet werden kann. Wenn Sie die Kalibrierungsdaten regenerieren möchten, müssen Sie diese Cache -Datei löschen.Options.calibrationBatchSize reduzieren.Benchmarks laufen auf RTX 3050 Ti Laptop GPU, 11. Gen Intel (R) Core (TM) I9-11900H @ 2,50 GHz.
| Modell | Präzision | Chargengröße | AVG Inferenzzeit |
|---|---|---|---|
| yolov8n | FP32 | 1 | 4,732 ms |
| yolov8n | FP16 | 1 | 2,493 ms |
| yolov8n | Int8 | 1 | 2.009 ms |
| yolov8x | FP32 | 1 | 76,63 ms |
| yolov8x | FP16 | 1 | 25.08 ms |
| yolov8x | Int8 | 1 | 11,62 ms |
Sie fragen sich, wie Sie diese Bibliothek in Ihr Projekt integrieren können? Oder wie man die Ausgänge des Yolov8 -Modells liest, um sinnvolle Informationen zu extrahieren? Wenn ja, sehen Sie sich meine beiden neuesten Projekte Yolov8-Tensorrt-CPP und Yolov9-Tensorrt-CPP an, die demonstrieren, wie die Tensorrt C ++ API zur Ausführung von Yolov8/9-Inferenz verwendet wird (unterstützt die Objekterkennung, semantische Segmentierung und die Schätzung der Körperbelastung). Sie nutzen dieses Projekt im Backend!
project-root/
├── include/
│ ├── engine/
│ │ ├── EngineRunInference.inl
│ │ ├── EngineUtilities.inl
│ │ └── EngineBuildLoadNetwork.inl
│ ├── util/...
│ ├── ...
├── src/
| ├── ...
│ ├── engine.cpp
│ ├── engine.h
│ └── main.cpp
├── CMakeLists.txt
└── README.mdinclude/engine . Ich habe im gesamten Code viele Kommentare geschrieben, die es leicht machen sollten zu verstehen, was los ist.include/engine/EngineRunInference.inl .include/engine/EngineBuildLoadNetwork.inl . Die Implementierung verwendet die spdlog -Bibliothek zur Protokollierung. Sie können die Protokollebene ändern, indem Sie die Umgebungsvariable LOG_LEVEL auf einen der folgenden Werte einstellen: trace , debug , info , warn , error , critical , off .
Wenn Sie Probleme haben, die Tensorrt-Engine-Datei aus dem ONNX-Modell zu erstellen, sollten Sie die Umgebungsvariable LOG_LEVEL so festlegen, dass sie die Anwendung trace und erneut ausführen. Dies sollte Ihnen weitere Informationen darüber geben, wo genau der Erstellungsprozess fehlschlägt.
Wenn dieses Projekt für Sie hilfreich wäre, würde ich mich freuen, wenn Sie es einen Stern geben könnten. Dies wird mich ermutigen, sicherzustellen, dass es auf dem neuesten Stand ist und Probleme schnell lösen. Ich mache auch Beratungsarbeiten, wenn Sie genauere Hilfe benötigen. Verbinde dich mit mir auf LinkedIn.
Loic Tetrel | Thomaskleiven | Wicyyn |
V6.0
V5.0
Engine -Klasse wurde so geändert, dass ein Vorlagenparameter angewendet wird, der den Ausgangsdatentyp der Modelle angibt. Die Implementierung unterstützt nun Ausgänge vom Typ float , __half , int8_t , int32_t , bool und uint8_t .Options für Ihr Modell korrekt einstellen (beispielsweise, wenn Ihr Modell für FP32 kompiliert wurde, aber Sie versuchen, die FP16-Inferenz auszuführen, fällt dies möglicherweise ohne einen ausführlichen Fehler aus).V4.1
V4.0
V3.0
IExecutionContext::enqueueV3() ) zu verwenden.driver in run_inference_benchmark umbenannt und muss nun als Befehlszeilenargument an das ONNX -Modell übergeben werden.Options.doesSupportDynamicBatchSize . Implementierung nun automatische Erkennungen unterstützte Stapelgrößen.Options.maxWorkspaceSize . Die Implementierung begrenzt nun nicht den GPU -Speicher während der Modellkonstruktionen, sodass die Implementierung so viel Speicherpool verwendet, wie für Zwischenschichten verfügbar sind.v2.2
V2.1
V2.0
Options.optBatchSizes wurde entfernt, ersetzt durch Options.optBatchSize .Vielen Dank an diese wunderbaren Menschen (Emoji -Schlüssel):
Dieses Projekt folgt der All-Contributors-Spezifikation. Beiträge jeglicher Art willkommen!