15

NVIDIA Jetson 系列文章(5):使用Docker容器的入门技巧

上一篇内容为大家介绍了从 NVIDIA NGC 下载 DeepStream 6.1 的容器版镜像到本地在 Jetson 上设备的基础指令,不过在正式使用容器版 DeepStream 6.1 之前,我们还是需要为入门用户提供基本的使用方式与一些小技巧。

Jetson Orin 开发套件内置 64GB EMMC 存储,并且很容易扩充 64G 甚至更大的 NVME 存储设备,可以有非常充沛的空间,在这种情况下就非常推荐使用 Docker 容器技术,能有效简化应用软件的安装与调试工作,非常适合用来开发与部署较为复杂的多功能智能应用,并且在 NVIDIA NGC 上提供了非常丰富的 Docker 版本应用镜像文件,用户只要一条指令便可轻松下载使用,这是边缘计算非常重要的一项应用技术。

Docker 是一种比较新的 “容器” 技术,是 NVIDIA 近年来非常大力推广的应用重点,越来越多的 GPU 开发环境都以 Docker 镜像(或称为 “仓” )形式提供,具备以下的优点与特性:

1、轻量级:这是相较于虚拟机的比对,容器内不需要独立操作系统,它是基于主机上的操作系统,透过一些映射指令去指向资源路径。大部分的容器镜像都在数十 MB 到数 GB 大小规模。

2、硬件调度能力:这是 NVIDIA 非常喜欢 Docker 容器技术的重点之一,虚拟机环境对 GPU 支持能力并不好,得透过底层穿透(pass through)方式调用,但容易影响系统稳定性。Docker 容器直接与操作系统交互运作,只要主机上操作系统装好 NVIDIA GPU 的驱动,甚至不需要安装 CUDA 开发包,在 Docker 容器内就能轻松用上 GPU 并行计算的功能。

3、封装完整:相较于 conda 或 virtualenv 这类环境虚拟技术而言,Docker 容器的封装更为完整而且独立,这在开发 Python 相关应用时更加明显,因为 Python 版本升级太频繁,相关依赖包之间的版本牵动关系复杂,而 Docker 容器的封装就显得非常有效,并且移植十分简便。

Docker 作为一个开源的应用容器引擎,允许开发者很方便地打包应用程序和依赖库到可移植的容器中,然后发布到任何流行的 Linux 设备上,Docker 完全使用沙箱机制,容器之间相互独立,不存在任何接口,因此,允许开发者在同一台机器上,运行不同环境的应用程序与服务,大大简化应用程序(或者服务)的运维操作,同时也提高了开发与测试效率。

对于 CUDA 设备的调用,需要 NVIDIA 自行开发的 nvidia-docker2 指令转换插件的协助,在 x86 设备上都需要自行安装 Docker 管理机制与 nvidia-docker2 界面,不过 JetPack 都为 Jetson 安装好了这两个元件,我们只要使用就可以。

现在就开始教大家如何使用 Docker 容器,以及从 NVIDIA NGC 中心下载可以在 Jetson 设备上使用的镜像。

1、检查 Docker 环境与修改储存路径:

用 JetPack 安装好系统之后,直接输入以下指令,就能检查目前系统中 Docker 的所有状态信息:

sudo  docker  info

可以看到一长串关于 Docker 环境的内容,由于信息量较大就不在这里单独列出所有内容。如果要单纯查看版本号,只要执行以下指令就可以:

sudo  docker  version

现在会看到如下版本信息,包括用户(Client)端与服务(Server)端:

图片1.jpg

如果要看最简单的版本信息,那么下面指令是最适合的:

sudo  docker  version

要检查目前 Docker 系统放置镜像文件的路径,可以执行以下指令:

sudo  docker  info  |  grep  -i  root

系统预设的存放路径为 /var/lib/docker,如果有自己添加的额外 NVME 存储设备,可以在 /etc/docker/daemon.json 文件中添加以下指令,调整存放路径:

# 文件 /etc/docker/daemon.json
{
"data-root": "<自己指定路径>",
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

修改完后执行以下指令,让新的设定值生效:

sudo  systemctl  daemon-reload
sudo  systemctl  restart  docker.service

现在可以检查看看存储的路径是否更新。

2、简化 Docker 指令:

这个应用完全依赖指令操作,在 Ubuntu 操作系统时又需要 “sudo” 取得操作权限,例如执行 “docker info” 指令,会出现下面信息,表示权限不足。

图片2.jpg

我们可以执行以下步骤,在执行 Docker 指令时可以不需要使用 “sudo”:

sudo  groupadd  docker
sudo  gpasswd  -a  ${USER}  docker
sudo  service  docker  restart
newgrp  -  docker

当然,这只是简化权限的问题,仅提供一个参考。

3、从 NGC 寻找合适的镜像文件:

访问 http://ngc.nvidia.com/ 会出现如下画面,在左上方 “搜索栏(漏斗图标)” 中输入 “l4t” 关键字,就会列出能在 Jetson 上运行的镜像列表。

图片3.jpg

目前已经提供近 20 个容器镜像,分为以下 6 大类别:

(1)基础类:

(2)深度学习类:

(3)视觉类:

(4)对话类:

(5)教学类:

(6)医疗类:专属于 Clara AGX 的应用容器镜像。

4、下载 NVIDIA L4T ML 镜像并创建容器

这是能在 Jetson 设备上执行的最完整的机器学习(Machine Learning)软件栈镜像,访问 https://catalog.ngc.nvidia.co... 之后就能看到容器内所包含的内容,以 l4t-ml:r32.6.1-py3 版本为例,其打包的工具与功能库如下:

  • TensorFlow 1.15.5
  • PyTorch v1.9.0
  • torchvision v0.10.0
  • torchaudio v0.9.0
  • onnx 1.8.0
  • CuPy 9.2.0
  • numpy 1.19.5
  • numba 0.53.1
  • OpenCV 4.5.0 (with CUDA)
  • pandas 1.1.5
  • scipy 1.5.4
  • scikit-learn 0.23.2
  • JupyterLab 2.2.9

这已经涵盖我们所需要的绝大部分内容,只要下载镜像后生成执行的容器,就能直接使用里面的开发环境,这样能节省非常大量的安装与调试的时间。

点击页面右上角 “Pull Tag” 按钮,会列出目前可下载版本的镜像文件,最好选择配合目前 JetPack 版本的镜像,例如用 JetPack 5.0 DP 安装的 Jetson Orin 开发套件,其 L4T 版本为 34.1.1,就用下面指令下载 r34.1.1-py3 镜像:

docker  pull  nvcr.io/nvidia/l4t-ml:r34.1.1-py3

下载完成之后可以用以下指令检查:

docker  images

如果出现以下信息,则表示下载完成。

REPOSITORY        TAG           IMAGE ID       CREATED      SIZE
nvcr.io/nvidia/l4t-ml   r34.1.1-py3   93c715e8751b   6 weeks ago   16.2GB

这个方法可以用在任何 L4T 版本镜像文件上。

下一篇文章我们将进一步带着大家用这个镜像文件去创建容器,并且开始执行演示或开发的内容。

推荐阅读
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息