Implanta no NVIDIA Jetson usando TensorRT e DeepStream SDK
Este guia explica como implantar um modelo treinado na plataforma NVIDIA Jetson e realizar a inferência usando TensorRT e DeepStream SDK. Aqui usamos TensorRT para maximizar o desempenho da inferência na plataforma Jetson.
Verificação de hardware
Testámos e verificámos este guia nos seguintes dispositivos Jetson
- Seeed reComputer J1010 construído com o módulo Jetson Nano
- Seeed reComputer J2021 construído com o módulo Jetson Xavier NX
Antes de começares
Certifica-te de que instalaste corretamente o JetPack SDK com todos os componentes SDK e o DeepStream SDK no dispositivo Jetson, uma vez que este inclui CUDA, TensorRT e DeepStream SDK, que são necessários para este guia.
O JetPack SDK fornece um ambiente de desenvolvimento completo para o desenvolvimento de IA de ponta acelerado por hardware. Todos os módulos Jetson e kits de desenvolvimento são suportados pelo JetPack SDK.
Existem dois métodos de instalação principais, incluindo,
- Método de imagem do cartão SD
- Método do NVIDIA SDK Manager
Podes encontrar um guia de instalação muito detalhado no site oficial da NVIDIA. Também podes encontrar guias correspondentes aos reComputer J1010 e reComputer J2021 acima mencionados.
Instala os pacotes necessários
- Passo 1. Acede ao terminal do dispositivo Jetson, instala o pip e actualiza-o
- Passo 2. Clona o seguinte repositório
- Passo 3. Abre o ficheiro requirements.txt
- Passo 5. Edita as linhas seguintes. Aqui tens de premir i primeiro para entrar no modo de edição. Carrega em ESC e depois escreve :wq para guardar e sair
Nota: torch e torchvision estão excluídos por agora porque serão instalados mais tarde.
- Passo 6. Instala a dependência abaixo
- Passo 7. Instala os pacotes necessários
Instala PyTorch e Torchvision
Não podemos instalar o PyTorch e o Torchvision a partir do pip porque eles não são compatíveis com a plataforma Jetson, que é baseada na arquitetura ARM aarch64. Portanto, precisamos instalar manualmente o PyTorch pip wheel pré-construído e compilar/instalar o Torchvision a partir da fonte.
Visita esta página para acederes a todas as ligações PyTorch e Torchvision.
Aqui estão algumas das versões suportadas pelo JetPack 4.6 e superior.
PyTorch v1.10.0
Suportado por JetPack 4.4 (L4T R32.4.3) / JetPack 4.4.1 (L4T R32.4.4) / JetPack 4.5 (L4T R32.5.0) / JetPack 4.5.1 (L4T R32.5.1) / JetPack 4.6 (L4T R32.6.1) com Python 3.6
- file_name: torch-1.10.0-cp36-cp36m-linux_aarch64.whl
- URL: https://nvidia.box.com/shared/static/fjtbno0vpo676a25cgvuqc1wty0fkkg6.whl
PyTorch v1.12.0
Suportado por JetPack 5.0 (L4T R34.1.0) / JetPack 5.0.1 (L4T R34.1.1) / JetPack 5.0.2 (L4T R35.1.0) com Python 3.8
- file_name: torch-1.12.0a0+2c916ef.nv22.3-cp38-cp38-linux_aarch64.whl
-
Passo 1. Instala torch de acordo com a tua versão do JetPack no seguinte formato
Por exemplo, aqui estamos a executar o JP4.6.1 e, por isso, escolhemos PyTorch v1 .10.0
cd ~
sudo apt-get install -y libopenblas-base libopenmpi-dev
wget https://nvidia.box.com/shared/static/fjtbno0vpo676a25cgvuqc1wty0fkkg6.whl -O torch-1.10.0-cp36-cp36m-linux_aarch64.whl
pip3 install torch-1.10.0-cp36-cp36m-linux_aarch64.whl
- Passo 2. Instala o torchvision de acordo com a versão de PyTorch que instalaste. Por exemplo, escolhemos PyTorch v1 .10.0, o que significa que tens de escolher Torchvision v0.11.1
sudo apt install -y libjpeg-dev zlib1g-dev
git clone --branch v0.11.1 https://github.com/pytorch/vision torchvision
cd torchvision
sudo python3 setup.py install
Segue-se uma lista da versão correspondente do torchvision que tens de instalar de acordo com a versão PyTorch :
- PyTorch v1.10 - torchvision v0.11.1
- PyTorch v1.12 - torchvision v0.13.0
Configuração do DeepStream para YOLOv5
- Passo 1. Clona o seguinte repositório
- Passo 2. Copia gen_wts_yoloV5.py do DeepStream-Yolo /utils para o yolov5 diretório
- Passo 3. Dentro do repositório yolov5 , transfere o ficheiro pt de YOLOv5 releases (exemplo para YOLOv5s 6.1)
- Passo 4. Gera os ficheiros cfg e wts
Nota: Para alterar o tamanho da inferência (predefinição: 640)
- Passo 5. Copia os ficheiros cfg e wts gerados para a pasta DeepStream-Yolo
- Passo 6. Abre a pasta DeepStream-Yolo e compila a biblioteca
cd ~/DeepStream-Yolo
CUDA_VER=11.4 make -C nvdsinfer_custom_impl_Yolo # for DeepStream 6.1
CUDA_VER=10.2 make -C nvdsinfer_custom_impl_Yolo # for DeepStream 6.0.1 / 6.0
- Passo 7. Edita o ficheiro config_infer_primary_yoloV5.txt de acordo com o teu modelo
- Passo 8. Edita o ficheiro deepstream_app_config
- Passo 9. Altera a fonte de vídeo no ficheiro deepstream_app_config. Aqui é carregado um ficheiro de vídeo por defeito, como podes ver abaixo
...
[source0]
...
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
Executa a inferência
O resultado acima está a ser executado no Jetson Xavier NX com FP32 e YOLOv5s 640x640. Podemos ver que o FPS é de cerca de 30.
Calibração INT8
Se quiseres utilizar a precisão INT8 para a inferência, tens de seguir os passos seguintes
- Passo 1. Instala o OpenCV
- Passo 2. Compila/recompila a biblioteca nvdsinfer_custom_impl_Yolo com suporte OpenCV
cd ~/DeepStream-Yolo
CUDA_VER=11.4 OPENCV=1 make -C nvdsinfer_custom_impl_Yolo # for DeepStream 6.1
CUDA_VER=10.2 OPENCV=1 make -C nvdsinfer_custom_impl_Yolo # for DeepStream 6.0.1 / 6.0
-
Passo 3. Para o conjunto de dados COCO, transfere o val2017, extrai-o e move-o para a pasta DeepStream-Yolo
-
Passo 4. Cria um novo diretório para as imagens de calibração
- Passo 5. Executa o seguinte para selecionar 1000 imagens aleatórias do conjunto de dados COCO para executar a calibração
Nota: A NVIDIA recomenda pelo menos 500 imagens para obteres uma boa precisão. Neste exemplo, foram escolhidas 1000 imagens para obter uma melhor precisão (mais imagens = mais precisão). Valores mais altos de INT8_CALIB_BATCH_SIZE resultarão em maior precisão e velocidade de calibração mais rápida. Define-o de acordo com a memória da tua GPU. Podes definir a partir de head -1000. Por exemplo, para 2000 imagens, define -2000. Este processo pode demorar muito tempo.
- Passo 6. Cria o ficheiro calibration.txt com todas as imagens seleccionadas
- Passo 7. Define as variáveis de ambiente
- Passo 8. Actualiza o ficheiro config_infer_primary_yoloV5.txt
De
Para
- Passo 9. Executa a inferência
O resultado acima está a correr no Jetson Xavier NX com INT8 e YOLOv5s 640x640. Podemos ver que o FPS é de cerca de 60.
Resultados de referência
A tabela seguinte resume o desempenho dos diferentes modelos no Jetson Xavier NX.
Nome do modelo | Precisão | Tamanho da inferência | Tempo de inferência (ms) | FPS |
---|---|---|---|---|
YOLOv5s | FP32 | 320x320 | 16.66 | 60 |
FP32 | 640x640 | 33.33 | 30 | |
INT8 | 640x640 | 16.66 | 60 | |
YOLOv5n | FP32 | 640x640 | 16.66 | 60 |
Adicional
Este tutorial foi escrito pelos nossos amigos da seeed @lakshanthad e pela Elaine