跳至内容

使用TensorRT 和 DeepStream SDK 在英伟达 Jetson 上部署

本指南介绍如何将训练好的模型部署到英伟达 Jetson 平台,并使用TensorRT 和 DeepStream SDK 执行推理。在这里,我们使用TensorRT 来最大限度地提高 Jetson 平台上的推理性能。

硬件验证

我们已在以下 Jetson 设备上测试并验证了本指南

开始之前

确保在 Jetson 设备上正确安装了JetPack SDK 以及所有SDK 组件DeepStreamSDK,因为这包括本指南所需的 CUDA、TensorRT 和 DeepStream SDK。

JetPack SDK 为硬件加速的人工智能边缘开发提供了一个完整的开发环境。JetPack SDK 支持所有 Jetson 模块和开发人员工具包。

主要有两种安装方法,包括

  1. SD 卡图像方法
  2. 英伟达™ SDK 管理器方法

你可以在英伟达官方网站上找到非常详细的安装指南。你还可以找到与上述reComputer J1010reComputer 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

我们无法通过 pip 安装PyTorch 和 Torchvision,因为它们与基于ARM aarch64 架构的 Jetson 平台不兼容。因此,我们需要手动安装预编译的PyTorch pip wheel,并从源代码编译/安装 Torchvision。

访问此页面可访问所有PyTorch 和火炬视觉链接。

以下是 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

受Python 3.8 的 JetPack 5.0 (L4T R34.1.0) / JetPack 5.0.1 (L4T R34.1.1) / JetPack 5.0.2 (L4T R35.1.0) 支持

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.根据已安装的PyTorch 版本安装 torchvision。例如,我们选择了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

根据PyTorch 版本,这里列出了您需要安装的相应 torchvision 版本:

  • 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.pyDeepStream-Yolo/utils 复制到 yolov5目录
cp DeepStream-Yolo/utils/gen_wts_yoloV5.py yolov5
  • 第 3 步在yolov5 软件仓库中,从YOLOv5 版本中下载pt 文件(以 YOLOv5s 6.1 为例)
cd yolov5
wget https://github.com/ultralytics/yolov5/releases/download/v6.1/yolov5s.pt
  • 步骤 4.生成cfgwts文件
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 步将生成的cfgwts文件复制到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 使用深流 FP32

上述结果在配备FP32YOLOv5s 640x640Jetson Xavier NX上运行。我们可以看到,FPS约为30

INT8 校准

如果要使用 INT8 精度进行推理,需要按照以下步骤操作

  • 步骤 1.安装 OpenCV
sudo apt-get install libopencv-dev
  • 步骤 2.编译/重新编译支持 OpenCV 的nvdsinfer_custom_impl_Yolo
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.运行以下程序,从 COCO 数据集中随机选择 1000 张图像进行校准
for jpg in $(ls -1 val2017/*.jpg | sort -R | head -1000); do \
    cp ${jpg} calibration/; \
done

注:英伟达建议至少使用 500 张图像才能获得较高的精度。在本示例中,我们选择了 1000 张图像来获得更高的精度(更多图像 = 更高精度)。INT8_CALIB_BATCH_SIZE 值越高,精度越高,校准速度越快。请根据 GPU 内存情况进行设置。可以从头-1000 设置。例如,如果要校准 2000 张图像,则设置为-2000。这个过程可能需要很长时间。

  • 步骤 6.创建包含所有选定图像的校准.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

上述结果在配备INT8YOLOv5s 640x640Jetson Xavier NX上运行。我们可以看到,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 和 Elaine 撰写。



创建于 2023-11-12,更新于 2024-01-07
作者:glenn-jocher(5)

评论