
Como usar a API do Tensorrt C ++ para inferência de aprendizado de máquina GPU de alto desempenho.
Suporta modelos com entradas únicas / múltiplas e saídas únicas / múltiplas com lote.
Visão geral do projeto Vídeo. Código de vídeo de mergulho profundo
Este projeto está buscando ativamente os mantenedores para ajudar a orientar seu crescimento e melhoria. Se você é apaixonado por esse projeto e interessado em contribuir, eu adoraria ouvir você!
Sinta -se à vontade para entrar em contato via LinkedIn para discutir como você pode se envolver.
Eu li todos os documentos da Nvidia Tensorrt para que você não precise!
Este projeto demonstra como usar a API Tensorrt C ++ para inferência de GPU de alto desempenho nos dados da imagem. Abrange como fazer o seguinte:
As instruções a seguir assumem que você está usando o Ubuntu 20.04 ou 22.04. Você precisará fornecer seu próprio modelo ONNX para este código de exemplo ou pode baixar o modelo de amostra (consulte a seção de verificação de sanidade abaixo).
sudo apt install build-essentialsudo snap install cmake --classicsudo apt install libspdlog-dev libfmt-dev (para registro)build_opencv.sh fornecido em ./scripts/ .CUDNN_INCLUDE_DIR e CUDNN_LIBRARY no script.CMakeLists.txt e substitua o TODO pelo caminho para a instalação do 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 a partir daqui.pip3 install ultralytics primeiro. 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 , no diretório ./models/ ../inputs/team.jpg deve produzir o seguinte vetor de recurso: 3.41113 16.5312 20.8828 29.8984 43.7266 54.9609 62.0625 65.8594 70.0312 72.9531 ...
A ativação da precisão INT8 pode acelerar ainda mais a inferência ao custo da redução da precisão devido à faixa dinâmica reduzida. Para precisão INT8, o usuário deve fornecer dados de calibração representativos dos dados reais que o modelo verá. É recomendável usar imagens de calibração 1K+. Para ativar a inferência INT8 no modelo de verificação de sanidade Yolov8, as seguintes etapas devem ser tomadas:
options.precision = Precision::FP16; para options.precision = Precision::INT8; em main.cppoptions.calibrationDataDirectoryPath = ""; deve ser alterado no main.cpp para especificar o caminho contendo dados de calibração.wget http://images.cocodataset.org/zips/val2017.zipInt8EntropyCalibrator2::getBatch no engine.cpp (consulte TODO ) está correto para o seu modelo..calibration ) para que, nas otimizações subsequentes do modelo, ele possa ser reutilizado. Se você deseja regenerar os dados de calibração, exclua este arquivo de cache.Options.calibrationBatchSize para que todo o lote possa caber na sua memória GPU.Os benchmarks são executados na GPU de laptop RTX 3050 TI, núcleo de 11ª geração Intel (R) (TM) I9-11900H @ 2.50GHz.
| Modelo | Precisão | Tamanho do lote | Tempo de inferência AVG |
|---|---|---|---|
| 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 |
Quer saber como integrar esta biblioteca ao seu projeto? Ou talvez como ler as saídas do modelo Yolov8 para extrair informações significativas? Nesse caso, confira meus dois projetos mais recentes, Yolov8-Tensorrt-CPP e YOLOV9-TENSORRT-CPP, que demonstram como usar a API Tensorrt C ++ para executar a inferência Yolov8/9 (suporta a detecção de objetos, a segmentação semântica e a estimativa de pose do corpo). Eles fazem uso deste projeto no back -end!
project-root/
├── include/
│ ├── engine/
│ │ ├── EngineRunInference.inl
│ │ ├── EngineUtilities.inl
│ │ └── EngineBuildLoadNetwork.inl
│ ├── util/...
│ ├── ...
├── src/
| ├── ...
│ ├── engine.cpp
│ ├── engine.h
│ └── main.cpp
├── CMakeLists.txt
└── README.mdinclude/engine . Escrevi muitos comentários em todo o código, o que deve facilitar a compreensão do que está acontecendo.include/engine/EngineRunInference.inl .include/engine/EngineBuildLoadNetwork.inl . A implementação usa a biblioteca spdlog para registro. Você pode alterar o nível de log definindo a variável de ambiente LOG_LEVEL em um dos seguintes valores: trace , debug , info , warn , error , critical , off .
Se você tiver problemas para criar o arquivo de mecanismo Tensorrt a partir do modelo ONNX, considere definir a variável de ambiente LOG_LEVEL para trace e executar novamente o aplicativo. Isso deve fornecer mais informações sobre onde exatamente o processo de construção está falhando.
Se este projeto fosse útil para você, eu apreciaria se você pudesse dar uma estrela. Isso me encorajará a garantir que esteja atualizado e resolva problemas rapidamente. Eu também faço trabalho de consultoria se você precisar de ajuda mais específica. Conecte -se comigo no LinkedIn.
Tetrel de loic | Thomaskleiven | Wicyn |
V6.0
V5.0
Engine foi modificada para pegar um parâmetro de modelo que especifica o tipo de dados de saída de modelos. A implementação agora suporta saídas do tipo float , __half , int8_t , int32_t , bool e uint8_t .Options foram definidas corretamente para o seu modelo (por exemplo, se o seu modelo foi compilado para FP32, mas você tentar executar a inferência FP16, ele falhará, potencialmente sem um erro detalhado).V4.1
V4.0
V3.0
IExecutionContext::enqueueV3() ).driver para run_inference_benchmark e agora deve ser transmitido para o modelo ONNX como argumento da linha de comando.Options.doesSupportDynamicBatchSize . Implementação agora detecta automaticamente os tamanhos de lote suportados.Options.maxWorkspaceSize . A implementação agora não limita a memória da GPU durante as construções do modelo, permitindo que a implementação use o máximo de pool de memória disponível para camadas intermediárias.v2.2
V2.1
V2.0
Options.optBatchSizes foi removido, substituído pelo Options.optBatchSize .Obrigado a essas pessoas maravilhosas (key emoji):
Este projeto segue a especificação de todos os contribuintes. Contribuições de qualquer tipo de boas -vindas!