您现在的位置是:首页 >学无止境 >【Nvidia Jetson Xavier NX/AGX/NANO】上用docker跑pytorch等cv推理应用网站首页学无止境

【Nvidia Jetson Xavier NX/AGX/NANO】上用docker跑pytorch等cv推理应用

喵喵扫描仪 2024-06-17 10:43:26
简介【Nvidia Jetson Xavier NX/AGX/NANO】上用docker跑pytorch等cv推理应用

WHY

在jetson上使用docker跑opencv和pytorch其实主要是要找对镜像,docker官方的hub里并没有适合的能直接跑的镜像,但是nvidia自己提供了L4T的pytorch和ML镜像。

镜像地址

单独pytorch的镜像:
https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-pytorch
整合了opencv,pytorch,tensorflow的ML镜像:
https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-ml
如果不是嫌大推荐直接使用ML的镜像,包含了opencv,要在pytorch的镜像中安装编译opencv太慢了,jetson的cpu都不太行,除非对opencv的版本有特殊需求。

如果对opencv的版本有特殊需求,建议还是找一下jetpack有没有对应的版本直接刷机对应的jetpack然后使用对应的docker镜像。

使用方法

先查看当前jetson设备的jetpack版本,例如我的是4.6版本,找到对应的镜像的编号,从tag里找到镜像地址
在这里插入图片描述
在这里插入图片描述
然后pull下来就行了

sudo docker pull nvcr.io/nvidia/l4t-ml:r32.6.1-py3

然后就可以进docker使用了

sudo docker run -it --rm --runtime nvidia --network host nvcr.io/nvidia/l4t-ml:r32.6.1-py3

docker常用命令备忘

sudo docker images #查看现有的镜像
sudo docker ps #查看现在运行的容器
#运行docker并把本地的work目录挂在容器的/workspace目录
sudo docker run -it --gpus all --restart always --name torch1 -p 6013:6013 -w /workspace -v /home/nvidia/work/:/workspace  repo001:pth1.9-cu102-py3.6 /bin/bash 
sudo docker exec -it 1dd3379af334 /bin/bash #进入容器命令交互
sudo docker stop 1dd3379af334 #停止容器

jtop安装

要查看jetson的运行状态,我们可以安装jtop

sudo apt-get update
sudo apt-get install python3-pip
sudo -H pip3 install jetson-stats

然后重启jetson,就可以在命令行里使用jtop命令来查看系统资源使用情况了。

在这里插入图片描述
按7查看具体的jetson的信息和jetpack版本号
在这里插入图片描述

关于保存容器镜像

cuda版本还有pytorch版本的问题可以在上述容器中进行相应的更新和修改,然后把容器保存为离线image供后续使用(不使用dockerfile构建)

先查看一下做过改动的容器的container ID(比如在容器里pip install了或者apt install了其他内容)

sudo docker ps #查看此容器的container ID

假设container id是1dd4687afdr4,然后使用

sudo docker commit 1dd4687afdr4 repo001:pth1.9-cu102-py3.6

这边repo001就是自定的repo名称,pth1.9-cu102-py3.6是自定义的镜像名称
然后就可以使用了,如果要保存为本地文件,

sudo docker save -o repo001.pth1.9.tar repo001:pth1.9-cu102-py3.6

后续到其他的jetson上就可以使用命令来读取镜像直接使用

sudo docker load -i epo001.pth1.9.tar

关于使用dockerfile构建

除了挂载外部文件外,我们可以在打包镜像的时候直接把应用文件打到镜像中,直接运行

Dockerfile

FROM repo001:xxxxx

ENV LC_ALL=C.UTF-8
ENV LANG=C.UTF-8

RUN apt-get update
RUN apt-get install python3-tk
RUN pip3 install --upgrade pip
RUN pip3 install pandas
RUN pip3 install pydantic[dotenv]

RUN mkdir /myworkspace/myapp

# Copy the application files
COPY . /myworkspace/myapp

WORKDIR /myworkspace/myapp

# Run the application
CMD ["python3","myapp.py"]

打完直接build镜像

sudo docker build -t repo001:xxxx -f /xxx/Dockerfile /myapppath

创建容器,运行app

sudo docker run -d --gpus all -p 8001:80001 repo001:xxxx

然后app运行起来以后可以查看运行日志

sudo docker logs -f 1dd3379af334 #查看容器日志

关于映射外部路径让容器访问外部文件

有时候应用也许不是完全无状态的,例如应用需要调取宿主机的文件路径,这时候我们run docker的时候把相关路径挂载进去就行了,和宿主机名称保持一致

sudo docker run -d --gpus all -v /home/nvidia/images:/home/nvidia/images -p 8001:80001 repo001:xxxx

这样如果调用myapp的时候传了一个/home/nvidia/images/1.jpg这样的参数在容器里也能同样访问到

关于性能

使用docker在容器中跑带有yolo和opencv的应用比起直接在原生环境中跑在jetson xavier NX上并不一定能见到明显的性能下降,容器化性能和很多因素有关,特别是应用对于cpu,gpu的使用情况不同,带宽算力使用情况不同,结果可能会不太一样,具体还是得测试,不能一概而论。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。