
如何使用Tensorrt C ++ API進行高性能GPU機器學習推理。
支持具有單個 /多個輸入的模型和帶有批處理的單個 /多個輸出。
項目概述視頻。代碼深度參考視頻
該項目正在積極尋求維護者,以幫助指導其增長和改進。如果您對這個項目充滿熱情並且對貢獻感興趣,我很想听聽您的來信!
請隨時通過LinkedIn與您聯繫,以討論如何參與其中。
我讀了所有的nvidia tensorrt文檔,所以您不必這樣做!
該項目演示瞭如何使用Tensorrt C ++ API作為圖像數據上的高性能GPU推斷。它涵蓋瞭如何執行以下操作:
以下說明假定您使用的是Ubuntu 20.04或22.04。您將需要為此示例代碼提供自己的ONNX模型,或者可以下載示例模型(請參見下面的SANITY檢查部分)。
sudo apt install build-essentialsudo snap install cmake --classicsudo apt install libspdlog-dev libfmt-dev (用於記錄)./scripts/中提供的build_opencv.sh腳本。CUDNN_INCLUDE_DIR和CUDNN_LIBRARY變量。CMakeLists.txt文件,然後用Tensorrt安裝的路徑替換TODO 。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模型。pip3 install ultralytics 。 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 (在./models/目錄中)放置。./inputs/team.jpg中的圖像運行推理應產生以下功能向量: 3.41113 16.5312 20.8828 29.8984 43.7266 54.9609 62.0625 65.8594 70.0312 72.9531 ...
啟用INT8精度可以進一步加速推斷,以減少動態範圍而導致的準確性降低成本。對於INT8精度,用戶必須提供校準數據,該數據代表了該模型將看到的真實數據。建議使用1K+校準圖像。要使用Yolov8 Sanity檢查模型啟用INT8推斷,必須採取以下步驟:
options.precision = Precision::FP16; to options.precision = Precision::INT8;在main.cpp中options.calibrationDataDirectoryPath = "";必須在main.cpp中更改以指定包含校準數據的路徑。wget http://images.cocodataset.org/zips/val2017.zip下載該數據集。Int8EntropyCalibrator2::getBatch方法中的engine.cpp (請參閱TODO )中的調整代碼適合您的模型。.calibration擴展),以便在隨後的模型優化下可以重複使用。如果您想重新生成校準數據,則必須刪除此緩存文件。Options.calibrationBatchSize ,以便整個批次可以適合您的GPU內存。基准在RTX 3050 Ti筆記本電腦GPU上運行,第11代英特爾(R)Core(TM)I9-11900H @ 2.50GHz。
| 模型 | 精確 | 批量大小 | AVG推理時間 |
|---|---|---|---|
| Yolov8n | fp32 | 1 | 4.732毫秒 |
| Yolov8n | FP16 | 1 | 2.493毫秒 |
| Yolov8n | INT8 | 1 | 2.009毫秒 |
| yolov8x | fp32 | 1 | 76.63毫秒 |
| yolov8x | FP16 | 1 | 25.08 ms |
| yolov8x | INT8 | 1 | 11.62毫秒 |
想知道如何將該庫集成到您的項目中?或者也許如何讀取Yolov8模型的輸出以提取有意義的信息?如果是這樣,請查看我的兩個最新項目,即Yolov8-Tensorrt-CPP和Yolov9-Tensorrt-CPP,這些項目演示瞭如何使用Tensorrt C ++ API運行Yolov8/9推斷(支持對象檢測,語義段,身體姿勢估計和身體姿勢估計)。他們在後端使用了這個項目!
project-root/
├── include/
│ ├── engine/
│ │ ├── EngineRunInference.inl
│ │ ├── EngineUtilities.inl
│ │ └── EngineBuildLoadNetwork.inl
│ ├── util/...
│ ├── ...
├── src/
| ├── ...
│ ├── engine.cpp
│ ├── engine.h
│ └── main.cpp
├── CMakeLists.txt
└── README.mdinclude/engine中。我在整個代碼中都寫了很多評論,這應該使您很容易理解發生了什麼。include/engine/EngineRunInference.inl中。include/engine/EngineBuildLoadNetwork.inl中。該實現使用spdlog庫進行記錄。您可以通過將環境變量LOG_LEVEL設置為以下值之一來更改日誌級別: trace , debug , info , warn , error , critical , off 。
如果您從ONNX模型中創建Tensorrt引擎文件的問題,請考慮設置環境變量LOG_LEVEL以trace並重新運行應用程序。這應該為您提供有關構建過程失敗的何處的更多信息。
如果這個項目對您有所幫助,我將不勝感激,如果您能給它一個明星。這將鼓勵我確保它是最新的,並迅速解決問題。如果您需要更多的具體幫助,我也會做諮詢工作。在LinkedIn上與我聯繫。
Loic Tetrel | Thomaskleiven | 威辛 |
v6.0
v5.0
Engine類以使用模板參數,該參數指定了模型輸出數據類型。現在,該實現支持類型float , __half , int8_t , int32_t , bool和uint8_t的輸出。Options為模型設置(例如,如果您的模型已針對FP32編譯為FP32,但是您嘗試運行FP16推斷,它將失敗,可能沒有雜語錯誤)。v4.1
v4.0
v3.0
IExecutionContext::enqueueV3() )。driver已重命名為run_inference_benchmark ,現在必須以命令行參數為ONNX模型。Options.doesSupportDynamicBatchSize 。doessupportdynamicbatchsize。現在實現自動檢測支持的批量大小。Options.maxWorkspaceSize 。現在,實現在模型構建過程中不限制GPU內存,從而允許實現使用與中間層可用的盡可能多的內存池。v2.2
v2.1
v2.0
Options.optBatchSizes已被刪除,由Options.optBatchSize替換。謝謝這些好人(表情符號鑰匙):
該項目遵循全企業規範。歡迎任何形式的貢獻!