Salta para o conteúdo

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

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,

  1. Método de imagem do cartão SD
  2. 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
sudo apt update
sudo apt install -y python3-pip
pip3 install --upgrade pip
  • Passo 2. Clona o seguinte repositório
git clone https://github.com/ultralytics/yolov5
  • Passo 3. Abre o ficheiro requirements.txt
cd yolov5
vi 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
# torch>=1.8.0
# torchvision>=0.9.0

Nota: torch e torchvision estão excluídos por agora porque serão instalados mais tarde.

  • Passo 6. Instala a dependência abaixo
sudo apt install -y libfreetype6-dev
  • Passo 7. Instala os pacotes necessários
pip3 install -r requirements.txt

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

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

wget <URL> -O <file_name>
pip3 install <file_name>

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
cd ~
git clone https://github.com/marcoslucianops/DeepStream-Yolo
  • Passo 2. Copia gen_wts_yoloV5.py do DeepStream-Yolo /utils para o yolov5 diretório
cp DeepStream-Yolo/utils/gen_wts_yoloV5.py yolov5
  • Passo 3. Dentro do repositório yolov5 , transfere o ficheiro pt de YOLOv5 releases (exemplo para YOLOv5s 6.1)
cd yolov5
wget https://github.com/ultralytics/yolov5/releases/download/v6.1/yolov5s.pt
  • Passo 4. Gera os ficheiros cfg e wts
python3 gen_wts_yoloV5.py -w yolov5s.pt

Nota: Para alterar o tamanho da inferência (predefinição: 640)

-s SIZE
--size SIZE
-s HEIGHT WIDTH
--size HEIGHT WIDTH

Example for 1280:

-s 1280
or
-s 1280 1280
  • Passo 5. Copia os ficheiros cfg e wts gerados para a pasta DeepStream-Yolo
cp yolov5s.cfg ~/DeepStream-Yolo
cp yolov5s.wts ~/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
[property]
...
custom-network-config=yolov5s.cfg
model-file=yolov5s.wts
...
  • Passo 8. Edita o ficheiro deepstream_app_config
...
[primary-gie]
...
config-file=config_infer_primary_yoloV5.txt
  • 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

deepstream-app -c deepstream_app_config.txt
YOLOv5 com deepstream FP32

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
sudo apt-get install libopencv-dev
  • 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

mkdir calibration
  • Passo 5. Executa o seguinte para selecionar 1000 imagens aleatórias do conjunto de dados COCO para executar a calibração
for jpg in $(ls -1 val2017/*.jpg | sort -R | head -1000); do \
    cp ${jpg} calibration/; \
done

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
realpath calibration/*jpg > calibration.txt
  • Passo 7. Define as variáveis de ambiente
export INT8_CALIB_IMG_PATH=calibration.txt
export INT8_CALIB_BATCH_SIZE=1
  • Passo 8. Actualiza o ficheiro config_infer_primary_yoloV5.txt

De

...
model-engine-file=model_b1_gpu0_fp32.engine
#int8-calib-file=calib.table
...
network-mode=0
...

Para

...
model-engine-file=model_b1_gpu0_int8.engine
int8-calib-file=calib.table
...
network-mode=1
...
  • Passo 9. Executa a inferência
deepstream-app -c deepstream_app_config.txt
YOLOv5 com deepstream INT8

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



Criado em 2023-11-12, Atualizado em 2024-01-07
Autores: glenn-jocher (5)

Comentários