Saltar al contenido

Implanta en NVIDIA Jetson utilizando TensorRT y DeepStream SDK

馃摎 Esta gu铆a explica c贸mo desplegar un modelo entrenado en la plataforma NVIDIA Jetson y realizar la inferencia utilizando TensorRT y DeepStream SDK. Aqu铆 utilizamos TensorRT para maximizar el rendimiento de la inferencia en la plataforma Jetson.

Verificaci贸n del hardware

Hemos probado y verificado esta gu铆a en los siguientes dispositivos Jetson

Antes de empezar

Aseg煤rate de haber instalado correctamente el SDK JetPack con todos los componentes del SDK y el SDK DeepStream en el dispositivo Jetson, ya que incluye CUDA, TensorRT y el SDK DeepStream, necesarios para esta gu铆a.

JetPack SDK proporciona un entorno de desarrollo completo para el desarrollo de IA acelerada por hardware. Todos los m贸dulos y kits de desarrollo Jetson son compatibles con JetPack SDK.

Existen dos m茅todos principales de instalaci贸n

  1. M茅todo de imagen de tarjeta SD
  2. M茅todo NVIDIA SDK Manager

Puedes encontrar una gu铆a de instalaci贸n muy detallada en el sitio web oficial de NVIDIA. Tambi茅n puedes encontrar gu铆as correspondientes a los mencionados reComputer J1010 y reComputer J2021.

Instala los paquetes necesarios

  • Paso 1. Accede al terminal del dispositivo Jetson, instala pip y actual铆zalo
sudo apt update
sudo apt install -y python3-pip
pip3 install --upgrade pip
  • Paso 2. Clona el siguiente repositorio
git clone https://github.com/ultralytics/yolov5
  • Paso 3. Abre requirements.txt
cd yolov5
vi requirements.txt
  • Paso 5. Edita las siguientes l铆neas. Aqu铆 tienes que pulsar primero i para entrar en el modo de edici贸n. Pulsa ESC, luego escribe :wq para guardar y salir
# torch>=1.8.0
# torchvision>=0.9.0

Nota: torch y torchvision est谩n excluidos por ahora porque se instalar谩n m谩s adelante.

  • Paso 6. instala la siguiente dependencia
sudo apt install -y libfreetype6-dev
  • Paso 7. Instala los paquetes necesarios
pip3 install -r requirements.txt

Instala PyTorch y Torchvision

No podemos instalar PyTorch y Torchvision desde pip porque no son compatibles para ejecutarse en la plataforma Jetson, basada en la arquitectura ARM aarch64. Por lo tanto, tenemos que instalar manualmente PyTorch pip wheel y compilar/instalar Torchvision desde el c贸digo fuente.

Visita esta p谩gina para acceder a todos los enlaces de PyTorch y Torchvision.

脡stas son algunas de las versiones compatibles con JetPack 4.6 y superiores.

PyTorch v1.10.0

Compatible con 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) con Python 3.6

PyTorch v1.12.0

Compatible con JetPack 5.0 (L4T R34.1.0) / JetPack 5.0.1 (L4T R34.1.1) / JetPack 5.0.2 (L4T R35.1.0) con Python 3.8

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

Por ejemplo, aqu铆 estamos ejecutando JP4.6.1, y por lo tanto elegimos 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
  • Paso 2. Instala Torchvision en funci贸n de la versi贸n de PyTorch que tengas instalada. Por ejemplo, hemos elegido PyTorch v1 .10.0, lo que significa que tenemos que elegir 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

Aqu铆 tienes una lista de la versi贸n correspondiente de torchvision que necesitas instalar seg煤n la versi贸n PyTorch :

  • PyTorch v1.10 - torchvision v0.11.1
  • PyTorch v1.12 - torchvision v0.13.0

Configuraci贸n de DeepStream para YOLOv5

  • Paso 1. Clona el siguiente repositorio
cd ~
git clone https://github.com/marcoslucianops/DeepStream-Yolo
  • Paso 2. Copia gen_wts_yoloV5.py de DeepStream-Yolo /utils en yolov5 directorio
cp DeepStream-Yolo/utils/gen_wts_yoloV5.py yolov5
  • Paso 3. Dentro del repo yolov5 , descarga el archivo pt de las versiones YOLOv5 (ejemplo para YOLOv5s 6.1)
cd yolov5
wget https://github.com/ultralytics/yolov5/releases/download/v6.1/yolov5s.pt
  • Paso 4. Genera los archivos cfg y wts
python3 gen_wts_yoloV5.py -w yolov5s.pt

Nota: Para cambiar el tama帽o de inferencia (por defecto: 640)

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

Example for 1280:

-s 1280
or
-s 1280 1280
  • Paso 5. Copia los archivos cfg y wts generados en la carpeta DeepStream-Yolo
cp yolov5s.cfg ~/DeepStream-Yolo
cp yolov5s.wts ~/DeepStream-Yolo
  • Paso 6. Abre la carpeta DeepStream-Yolo y compila la 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
  • Paso 7. Edita el archivo config_infer_primary_yoloV5.txt seg煤n tu modelo
[property]
...
custom-network-config=yolov5s.cfg
model-file=yolov5s.wts
...
  • Paso 8. Edita el archivo deepstream_app_config
...
[primary-gie]
...
config-file=config_infer_primary_yoloV5.txt
  • Paso 9. Cambia la fuente de v铆deo en el archivo deepstream_app_config. Aqu铆 se carga un archivo de v铆deo por defecto como puedes ver a continuaci贸n
...
[source0]
...
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4

Ejecuta la inferencia

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

El resultado anterior se ejecuta en Jetson Xavier NX con FP32 y YOLOv5s 640x640. Podemos ver que los FPS rondan los 30.

Calibraci贸n INT8

Si quieres utilizar la precisi贸n INT8 para la inferencia, debes seguir los siguientes pasos

  • Paso 1. Instala OpenCV
sudo apt-get install libopencv-dev
  • Paso 2. Compila/recompila la biblioteca nvdsinfer_custom_impl_Yolo con soporte 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
  • Paso 3. Para el conjunto de datos COCO, descarga el val2017, extr谩elo y mu茅velo a la carpeta DeepStream-Yolo

  • Paso 4. Crea un nuevo directorio para las im谩genes de calibraci贸n

mkdir calibration
  • Paso 5. Ejecuta lo siguiente para seleccionar 1000 im谩genes aleatorias del conjunto de datos COCO para realizar la calibraci贸n
for jpg in $(ls -1 val2017/*.jpg | sort -R | head -1000); do \
    cp ${jpg} calibration/; \
done

Nota: NVIDIA recomienda al menos 500 im谩genes para obtener una buena precisi贸n. En este ejemplo, se han elegido 1000 im谩genes para obtener una mayor precisi贸n (m谩s im谩genes = m谩s precisi贸n). Valores m谩s altos de INT8_CALIB_BATCH_SIZE dar谩n como resultado m谩s precisi贸n y mayor velocidad de calibraci贸n. Aj煤stalo en funci贸n de la memoria de tu GPU. Puedes ajustarlo desde head -1000. Por ejemplo, para 2000 im谩genes, la cabeza -2000. Este proceso puede llevar mucho tiempo.

  • Paso 6. Crea el archivo calibraci贸n.txt con todas las im谩genes seleccionadas
realpath calibration/*jpg > calibration.txt
  • Paso 7. Establece las variables de entorno
export INT8_CALIB_IMG_PATH=calibration.txt
export INT8_CALIB_BATCH_SIZE=1
  • Paso 8. Actualiza el archivo config_infer_primary_yoloV5.txt

En

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

A

...
model-engine-file=model_b1_gpu0_int8.engine
int8-calib-file=calib.table
...
network-mode=1
...
  • Paso 9. Ejecuta la inferencia
deepstream-app -c deepstream_app_config.txt
YOLOv5 con deepstream INT8

El resultado anterior se ejecuta en Jetson Xavier NX con INT8 y YOLOv5s 640x640. Podemos ver que los FPS rondan los 60.

Resultados de la evaluaci贸n comparativa

La tabla siguiente resume el rendimiento de los distintos modelos en Jetson Xavier NX.

Nombre del modelo Precisi贸n Tama帽o de la inferencia Tiempo de inferencia (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 est谩 escrito por nuestros amigos de seeed @lakshanthad y Elaine



Creado 2023-11-12, Actualizado 2024-01-07
Autores: glenn-jocher (5)

Comentarios