Nvidia Jetson开发板Docker部署

本文档介绍了如何用Docker在Jetson开发板上部署PaddleX模型,通过Docker的方式部署,用户可以有效的避免可能因为系统环境导致编译或者运行的错误

提供了在Jeston上用于编译或者运行PaddleX部署代码的Docker,主要有如下功能:

  • 编译PaddleX部署代码:用户可以通过Docker编译PaddleX部署代码
  • 部署PaddleX模型:通过Docker使用编译好的可执行文件部署

注意:NVIDIA JetPack在v4.2.1版本以上(含v4.2.1)才能支持通过Docker部署

准备工作

在编译与运行之前的准备工作,主要是下载Docker与创建容器

Step1: 下载Jetson开发板Docker

运行如下命令下载Docker

sudo docker pull paddlex/jetson:1.0

下载成功后,通过如下命令查看docker的镜像

sudo docker images

可以看到,存在一个REPOSITORY为paddlex/jetson、TAG为1.0的docker镜像 ../../_images/images.png

Step2: 容器创建

创建容器之前,需要先准备好需要编译的部署代码与训练好的PaddleX部署模型

建议用户在HOME目录下创建infer文件夹,将需要部署的代码与模型拷贝到该目录下用于挂载到容器内

本文档以PaddleX提供的jetson部署代码为示例:

#通过如下命令下载代码,Jetson部署代码在 `PaddleX/deploy/cpp` 目录下面

git clone https://github.com/PaddlePaddle/PaddleX.git cd PaddleX git checkout release/1.3


#在HOME目录下创建infer文件夹,将cpp文件夹拷贝到infer目录下面
mkdir ~/infer
cp -r PaddleX/deploy/cpp ~/infer/

创建容器:通过如下命令创建容器,同时将HOME目录下包含部署代码的infer文件夹挂载到容器内

sudo docker create -it -v ~/infer/:/infer -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY --net=host --name paddlex --runtime nvidia paddlex/jetson:1.0 /bin/bash

查看创建的容器

sudo docker ps -a

../../_images/container.png

创建好容器后需要运行容器

sudo docker start paddlex

编译

通过如下命令可以编译infer文件夹内的部署代码

sudo docker exec -it paddlex /bin/bash -c 'cd /infer/cpp && sh scripts/jetson_build.sh'

注意

  • cd /infer/cpp表示进入到部署代码目录,用户需要根据实际情况自己修改

部署

对于图片预测,编译的可执行文件在/infer/cpp/build/demo/detector/infer/cpp/build/demo/classifier/infer/cpp/build/demo/segmenter,其主要命令参数说明如下:

参数 说明
model_dir 导出的预测模型所在路径
image 要预测的图片文件路径
image_list 按行存储图片路径的.txt文件
use_gpu 是否使用 GPU 预测, 支持值为0或1(默认值为0)
use_trt 是否使用 TensorRT 预测, 支持值为0或1(默认值为0)
gpu_id GPU 设备ID, 默认值为0
save_dir 保存可视化结果的路径, 默认值为"output",classfier无该参数
batch_size 预测的批量大小,默认为1
thread_num 预测的线程数,默认为cpu处理器个数

对于视频预测,编译的可执行文件在/infer/cpp/build/demo/video_detector/infer/cpp/build/demo/video_classifier/infer/cpp/build/demo/video_segmenter,其主要命令参数说明如下:

参数 说明
model_dir 导出的预测模型所在路径
use_camera 是否使用摄像头预测,支持值为0或1(默认值为0)
camera_id 摄像头设备ID,默认值为0
video_path 视频文件的路径
use_gpu 是否使用 GPU 预测, 支持值为0或1(默认值为0)
use_trt 是否使用 TensorRT 预测, 支持值为0或1(默认值为0)
gpu_id GPU 设备ID, 默认值为0
show_result 对视频文件做预测时,是否在屏幕上实时显示预测可视化结果(因加入了延迟处理,故显示结果不能反映真实的帧率),支持值为0或1(默认值为0)
save_result 是否将每帧的预测可视结果保存为视频文件,支持值为0或1(默认值为1)
save_dir 保存可视化结果的路径, 默认值为"output"

设置show_result为1之前请执行如下命令确保容器有显示权限

sudo xhost +

注意:若系统无GUI,则不要将show_result设置为1。当使用摄像头预测时,按ESC键可关闭摄像头并推出预测程序。

对于使用用户编译的可执行文件进行部署的命令如下:

sudo docker exec -it paddlex /bin/bash -c 'cd [部署代码目录] && .build/demo/[可执行文件名] [命令参数]'

样例

在用户编译完部署代码后,可按如下流程运行测试模型样例

  • 1)下载PaddleX预训练模型及测试图片下载地址,本文档下载了YOLOv3-MobileNetV1模型与测试图片
  • 2)将模型导出为部署模型格式 导出部署模型步骤
  • 3)将部署模型和测试图片copy到~/infer文件夹
  • 4)使用如下命令,通过容器进行预测
sudo docker exec -it paddlex /bin/bash -c 'cd /infer/cpp && ./build/demo/detector --model_dir /infer/yolov3_mobilenetv1_coco --image /infer/yolov3_mobilenetv1_coco/test.jpg --use_gpu 1'