
고성능 GPU 기계 학습 추론을 위해 Tensorrt C ++ API를 사용하는 방법.
단일 / 다중 입력 및 배치가있는 단일 / 다중 출력이있는 모델을 지원합니다.
프로젝트 개요 비디오. 코드 딥 다이빙 비디오
이 프로젝트는 성장과 개선을 안내하기 위해 유지 관리자를 적극적으로 찾고 있습니다. 이 프로젝트에 대한 열정이 있고 기여에 관심이 있다면, 나는 당신의 의견을 듣고 싶습니다!
LinkedIn을 통해 연락하여 어떻게 참여할 수 있는지 논의하십시오.
나는 당신이 필요하지 않도록 모든 nvidia tensorrt 문서를 읽었습니다!
이 프로젝트는 이미지 데이터에서 고성능 GPU 추론을 위해 Tensorrt C ++ API를 사용하는 방법을 보여줍니다. 다음을 수행하는 방법을 다룹니다.
다음 지침은 Ubuntu 20.04 또는 22.04를 사용하고 있다고 가정합니다. 이 샘플 코드에 대해 자신의 ONNX 모델을 제공하거나 샘플 모델을 다운로드 할 수 있습니다 (아래의 Sanity Check 섹션 참조).
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 파일로 이동하여 TODO Tensorrt 설치 경로로 바꾸십시오.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 Precision의 경우, 사용자는 모델이 볼 수있는 실제 데이터를 대표하는 교정 데이터를 공급해야합니다. 1K+ 교정 이미지를 사용하는 것이 좋습니다. Yolov8 Sanity Check 모델에 대한 Int8 추론을 가능하게하려면 다음 단계를 수행해야합니다.
options.precision = Precision::FP16; options.precision = Precision::INT8; main.cppoptions.calibrationDataDirectoryPath = ""; 교정 데이터를 포함하는 경로를 지정하려면 main.cpp 에서 변경해야합니다.wget http://images.cocodataset.org/zips/val2017.zip 으로 다운로드 할 수있는 Coco Validation Dataset을 사용하는 것이 좋습니다.engine.cpp Int8EntropyCalibrator2::getBatch method의 getbatch 메서드 ( TODO 참조)의 크기 조정 코드가 모델에 맞는지 확인하십시오..calibration Extension)에 기록되어 후속 모델 최적화에서 재사용 할 수 있습니다. 교정 데이터를 재생하려면이 캐시 파일을 삭제해야합니다.Options.calibrationBatchSize 줄여야합니다.벤치 마크는 RTX 3050 Ti Laptop GPU, 11 번째 Gen Intel (R) 코어 (TM) I9-11900H @ 2.50GHz에서 실행됩니다.
| 모델 | 정도 | 배치 크기 | AVG 추론 시간 |
|---|---|---|---|
| yolov8n | FP32 | 1 | 4.732ms |
| yolov8n | FP16 | 1 | 2.493 MS |
| yolov8n | int8 | 1 | 2.009ms |
| yolov8x | FP32 | 1 | 76.63 MS |
| yolov8x | FP16 | 1 | 25.08ms |
| yolov8x | int8 | 1 | 11.62ms |
이 라이브러리를 프로젝트에 통합하는 방법이 궁금하십니까? 아니면 의미있는 정보를 추출하기 위해 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 | Wicyn |
v6.0
v5.0
Engine 클래스는 모델 출력 데이터 유형을 지정하는 템플릿 매개 변수를 가져 오도록 수정되었습니다. 구현은 이제 float 유형, __half , int8_t , int32_t , bool 및 uint8_t 의 출력을 지원합니다.Options 올바르게 설정되었음을 직접 확인해야합니다 (예 : FP32에 대해 모델이 컴파일되었지만 FP16 추론을 실행하려고 시도하면 잠재적으로 장라 오류없이 실패합니다).v4.1
v4.0
v3.0
IExecutionContext::enqueueV3() ).driver 에서 run_inference_benchmark 로 이름 바뀌 었으며 이제 명령 줄 인수로 ONNX 모델로의 경로를 전달해야합니다.Options.doesSupportDynamicBatchSize 제거되었습니다. 구현은 이제 자동 감지 지원 배치 크기입니다.Options.maxWorkspaceSize .maxworkspacesize. 구현은 이제 모델 구성 중에 GPU 메모리를 제한하지 않으므로 구현은 중간 계층에 사용할 수있는만큼 많은 메모리 풀을 사용할 수 있습니다.v2.2
v2.1
v2.0
Options.optBatchSizes 제거되어 Options.optBatchSize 으로 대체되었습니다.이 멋진 사람들에게 감사합니다 (이모티콘 키) :
이 프로젝트는 All-Contritors 사양을 따릅니다. 모든 종류의 공헌을 환영합니다!