Перейти к содержимому

Развертывание на NVIDIA Jetson с помощью TensorRT и DeepStream SDK

📚 В этом руководстве рассказывается, как развернуть обученную модель на платформе NVIDIA Jetson и выполнить вывод с помощью TensorRT и DeepStream SDK. Здесь мы используем TensorRT , чтобы максимизировать производительность вычислений на платформе Jetson.

Проверка аппаратного обеспечения

Мы протестировали и проверили это руководство на следующих устройствах Jetson

Прежде чем начать

Убедись, что ты правильно установил JetPack SDK со всеми SDK-компонентами и DeepStream SDK на устройство Jetson, так как они включают в себя CUDA, TensorRT и DeepStream SDK, которые необходимы для этого руководства.

JetPack SDK предоставляет полноценную среду разработки для аппаратного ускорения разработок в области искусственного интеллекта. Все модули и наборы разработчика Jetson поддерживаются JetPack SDK.

Существует два основных способа установки, включая,

  1. Метод изображения на SD-карте
  2. Метод NVIDIA SDK Manager

Очень подробное руководство по установке ты можешь найти на официальном сайте NVIDIA. Там же можно найти руководства, соответствующие вышеупомянутым reComputer J1010 и reComputer J2021.

Установи необходимые пакеты

  • Шаг 1. Зайди в терминал устройства Jetson, установи pip и обнови его
sudo apt update
sudo apt install -y python3-pip
pip3 install --upgrade pip
  • Шаг 2. Клонируй следующее репо
git clone https://github.com/ultralytics/yolov5
  • Шаг 3. Открой файл requirements.txt
cd yolov5
vi requirements.txt
  • Шаг 5. Отредактируй следующие строки. Здесь тебе нужно сначала нажать i, чтобы войти в режим редактирования. Нажми ESC, затем набери :wq, чтобы сохранить и выйти из игры.
# torch>=1.8.0
# torchvision>=0.9.0

Примечание: torch и torchvision пока исключены, потому что они будут установлены позже.

  • Шаг 6. Установи следующие зависимости
sudo apt install -y libfreetype6-dev
  • Шаг 7. Установи необходимые пакеты
pip3 install -r requirements.txt

Установи PyTorch и Torchvision

Мы не можем установить PyTorch и Torchvision из pip, потому что они не совместимы для работы на платформе Jetson, которая основана на архитектуре ARM aarch64. Поэтому нам нужно вручную установить предварительно собранный PyTorch pip wheel и скомпилировать/установить Torchvision из исходников.

Посети эту страницу, чтобы получить доступ ко всем ссылкам PyTorch и Torchvision.

Вот некоторые из версий, поддерживаемых JetPack 4.6 и выше.

PyTorch v1.10.0

Поддерживается 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) с Python 3.6.

PyTorch v1.12.0

Поддерживается JetPack 5.0 (L4T R34.1.0) / JetPack 5.0.1 (L4T R34.1.1) / JetPack 5.0.2 (L4T R35.1.0) с Python 3.8.

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

Например, здесь мы используем JP4.6.1, поэтому выбираем 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
  • Шаг 2. Установи torchvision в зависимости от версии PyTorch , которая у тебя установлена. Например, мы выбрали PyTorch v1.10.0, значит, нам нужно выбрать 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

Здесь список соответствующих версий torchvision, которые тебе нужно установить в соответствии с версией PyTorch :

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

Конфигурация DeepStream для YOLOv5

  • Шаг 1. Клонируй следующее репо
cd ~
git clone https://github.com/marcoslucianops/DeepStream-Yolo
  • Шаг 2. Скопируй файл gen_wts_yoloV5.py из DeepStream-Yolo /utils в yolov5 каталог .
cp DeepStream-Yolo/utils/gen_wts_yoloV5.py yolov5
  • Шаг 3. Внутри репо yolov5 скачай pt-файл из релизов YOLOv5 (пример для YOLOv5s 6.1).
cd yolov5
wget https://github.com/ultralytics/yolov5/releases/download/v6.1/yolov5s.pt
  • Шаг 4. Создай файлы cfg и wts
python3 gen_wts_yoloV5.py -w yolov5s.pt

Примечание: Чтобы изменить размер вывода (по умолчанию: 640)

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

Example for 1280:

-s 1280
or
-s 1280 1280
  • Шаг 5. Скопируй сгенерированные файлы cfg и wts в папку DeepStream-Yolo.
cp yolov5s.cfg ~/DeepStream-Yolo
cp yolov5s.wts ~/DeepStream-Yolo
  • Шаг 6. Открой папку DeepStream-Yolo и скомпилируй библиотеку.
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
  • Шаг 7. Отредактируй файл config_infer_primary_yoloV5.txt в соответствии с твоей моделью
[property]
...
custom-network-config=yolov5s.cfg
model-file=yolov5s.wts
...
  • Шаг 8. Отредактируй файл deepstream_app_config
...
[primary-gie]
...
config-file=config_infer_primary_yoloV5.txt
  • Шаг 9. Измени источник видео в файле deepstream_app_config. Здесь загружен видеофайл по умолчанию, как ты можешь видеть ниже
...
[source0]
...
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4

Выполни умозаключение

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

Приведенный выше результат запущен на Jetson Xavier NX с FP32 и YOLOv5s 640x640. Мы видим, что FPS составляет около 30.

Калибровка INT8

Если ты хочешь использовать точность INT8 для выводов, то тебе нужно выполнить следующие шаги

  • Шаг 1. Установи OpenCV
sudo apt-get install libopencv-dev
  • Шаг 2. Скомпилируй/перекомпилируй библиотеку nvdsinfer_custom_impl_Yolo с поддержкой 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
  • Шаг 3. Для набора данных COCO скачай файл val2017, извлеки его и перемести в папку DeepStream-Yolo.

  • Шаг 4. Создай новую директорию для калибровочных изображений

mkdir calibration
  • Шаг 5. Выполни следующие действия, чтобы выбрать 1000 случайных изображений из набора данных COCO для проведения калибровки
for jpg in $(ls -1 val2017/*.jpg | sort -R | head -1000); do \
    cp ${jpg} calibration/; \
done

Примечание: NVIDIA рекомендует использовать не менее 500 изображений, чтобы получить хорошую точность. В данном примере выбрано 1000 изображений, чтобы добиться большей точности (больше изображений = больше точность). Более высокие значения INT8_CALIB_BATCH_SIZE приведут к большей точности и скорости калибровки. Установи его в соответствии с памятью твоего GPU. Ты можешь установить его в диапазоне head -1000. Например, для 2000 изображений - head -2000. Этот процесс может занять много времени.

  • Шаг 6. Создай файл calibration.txt со всеми выбранными изображениями
realpath calibration/*jpg > calibration.txt
  • Шаг 7. Установи переменные окружения
export INT8_CALIB_IMG_PATH=calibration.txt
export INT8_CALIB_BATCH_SIZE=1
  • Шаг 8. Обновите файл config_infer_primary_yoloV5.txt

С сайта

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

На

...
model-engine-file=model_b1_gpu0_int8.engine
int8-calib-file=calib.table
...
network-mode=1
...
  • Шаг 9. Выполни умозаключение
deepstream-app -c deepstream_app_config.txt
YOLOv5 с глубоким потоком INT8

Приведенный выше результат запущен на Jetson Xavier NX с INT8 и YOLOv5s 640x640. Мы видим, что FPS составляет около 60.

Результаты бенчмарка

В следующей таблице приведены данные о том, как разные модели работают на Jetson Xavier NX.

Название модели Точность Размер умозаключения Время вывода (мс) FPS
YOLOv5s FP32 320x320 16.66 60
FP32 640x640 33.33 30
INT8 640x640 16.66 60
YOLOv5n FP32 640x640 16.66 60

Дополнительные

Этот туториал написан нашими друзьями из Seeed @lakshanthad и Элейн.



Создано 2023-11-12, Обновлено 2024-01-07
Авторы: glenn-jocher (5)

Комментарии