Nvidia Jetson Xavier NX/AGX docker
- WHY
- 镜像地址
- 使用方法
- docker常用命令备忘
- jtop安装
- 关于保存容器镜像
- 关于使用dockerfile构建
- 关于映射外部路径让容器访问外部文件
- 关于性能
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的使用情况不同,带宽算力使用情况不同,结果可能会不太一样,具体还是得测试,不能一概而论。