直接在 NVIDIA DRIVE AGX Orin 上运行 Docker 容器

这篇文章最初发表在 NVIDIA 技术博客上。

NGC 上的 NVIDIA DRIVE OS 主机端 Docker 容器为在主机开发机上安装 Debian 软件包提供了一种快速而简单的替代方案。

使用 NVIDIA DRIVE 平台的开发人员要求能够直接在 NVIDIA DRIVE AGX 硬件上运行 Docker 容器,以便快速设置环境以运行具有许多包依赖性的应用程序。

NVIDIA DRIVE OS 6.0.6 Linux 现在包括 NVIDIA Container Toolkit 运行时,作为闪存到板上的目标根文件系统( RFS )的一部分。它使开发人员能够直接在目标 NVIDIA DRIVE AGX 硬件上运行 Docker 容器。

本文介绍了如何在目标 NVIDIA DRIVE AGX 硬件上运行的 Docker 容器中运行一些示例应用程序。

安装程序

在主机上安装 NVIDIA DRIVE 操作系统,并对目标板进行闪存。详见 NVIDIA DRIVE OS 6.0 Installation Guide

使用 NVIDIA DRIVE OS 6.0.6 闪烁 NVIDIA DRIVE AGX Orin 后,您可以从 NGC 或 Docker Hub 提取目标侧 Docker 映像,并在目标上立即运行 GPU -- 加速容器。

在目标侧 Docker 容器内运行 CUDA 样本

RFS 使用 NVIDIA DRIVE OS 6.0.6 闪存到目标硬件上,在/usr/local/cuda-11.4/samples提供 CUDA 样本。矩阵乘法 CUDA 示例在 Ubuntu 20.04 Docker 容器中运行,以演示容器中 NVIDIA DRIVE AGX Orin 上 GPU 的可访问性。

shell 复制代码
$ cd /usr/local/cuda-11.4/samples/0_Simple/matrixMul && sudo make
$ sudo docker run --rm --runtime nvidia --gpus all -v $(pwd):$(pwd) -w $(pwd) ubuntu:20.04 ./matrixMul

以下输出显示 CUDA 示例的成功运行:

sql 复制代码
nvidia@tegra-ubuntu:/usr/local/cuda-11.4/samples/0_Simple/matrixMul$ sudo docker run --rm --runtime nvidia --gpus all -v $(pwd):$(pwd) -w $(pwd) ubuntu:20.04 ./matrixMul
[sudo] password for nvidia: 
[Matrix Multiply Using CUDA] - Starting...
GPU Device 0: "Ampere" with compute capability 8.7

MatrixA(320,320), MatrixB(640,320)
Computing result using CUDA Kernel...
done
Performance= 617.91 GFlop/s, Time= 0.212 msec, Size= 131072000 Ops, WorkgroupSize= 1024 threads/block
Checking computed result for correctness: Result = PASS

NOTE: The CUDA samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.

在目标端 Docker 容器中运行自定义应用程序

RFS 中提供的两个文件 -devices.csv 和 drivers.sv-are 闪存到板上,供 Docker 容器内的应用程序访问设备、驱动程序和共享库。这些文件都有一个设备、驱动程序和共享库的列表,这些列表是应用程序在 Docker 容器中成功运行所需的。

这些文件必须经过编辑,以反映应用程序在 Docker 容器中运行自定义应用程序所需的所有设备、驱动程序和共享库。要访问这两个文件,请参阅/etc/nvidia-container-runtime/host-files-for-container.d/

例如,与cudaNvSci样本不同, CUDA 样本cudaNvSci不会开箱即用。尝试在 Docker 容器内运行 CUDA 样本而不对 drivers.csv 进行任何更改,会导致以下错误:

bash 复制代码
nvidia@tegra-ubuntu:cd /usr/local/cuda-11.4/samples/0_Simple/cudaNvSci && sudo make
nvidia@tegra-ubuntu:/usr/local/cuda-11.4/samples/0_Simple/cudaNvSci$ sudo docker run --rm --runtime nvidia --gpus all -v $(pwd):$(pwd) -w $(pwd) ubuntu:20.04 ./cudaNvSci
./cudaNvSci: error while loading shared libraries: libnvscibuf.so.1: cannot open shared object file: No such file or directory

CUDA 样本确实在 Docker 容器之外工作。直接在目标上运行样本的输出如下所示:

typescript 复制代码
nvidia@tegra-ubuntu:/usr/local/cuda-11.4/samples/0_Simple/cudaNvSci$ ./cudaNvSci
1 GPUs found
Loaded './lenaRGB.ppm', 1024 x 1024 pixels
[cudaNvSciSignal] GPU Device 0: "Ampere" with compute capability 8.7
 
[cudaNvSciWait] GPU Device 0: "Ampere" with compute capability 8.7
 
created NvSciBufObj
created NvSciBufImageObj
created NvSciSyncObj
Wrote 'lenaRGB_out.ppm'

如果样本在 Docker 容器中运行,则应该会产生输出(如上)。相反,加载共享库libnvscibuf.so.1会导致错误。要修复此错误,请查看 drivers.csv 的内容:

javascript 复制代码
dir, /usr/lib/firmware/tegra23x
 
lib, /usr/lib/libcuda.so.1
lib, /usr/lib/libnvrm_gpu.so
lib, /usr/lib/libnvrm_mem.so
lib, /usr/lib/libnvrm_sync.so
lib, /usr/lib/libnvrm_host1x.so
lib, /usr/lib/libnvos.so
lib, /usr/lib/libnvsocsys.so
lib, /usr/lib/libnvtegrahv.so
lib, /usr/lib/libnvsciipc.so
lib, /usr/lib/libnvrm_chip.so
lib, /usr/lib/libnvcucompat.so

此列表不包括样本在 Docker 容器中运行所需的libnvscibuf.so.1

此时,lddobjdump 等工具可以帮助确定示例所需的共享库,以便可以编辑 drivers.csv 文件以包含它们。

cudaNvSci上运行ldd会产生以下输出:

typescript 复制代码
nvidia@tegra-ubuntu:/usr/local/cuda-11.4/samples/0_Simple/cudaNvSci$ ldd ./cudaNvSci
    	linux-vdso.so.1 (0x0000ffffa9f2b000)
    	libcuda.so.1 => /usr/lib/libcuda.so.1 (0x0000ffffa8933000)
    	libnvscibuf.so.1 => /usr/lib/libnvscibuf.so.1 (0x0000ffffa88c1000)
    	libnvscisync.so.1 => /usr/lib/libnvscisync.so.1 (0x0000ffffa888f000)
    	librt.so.1 => /lib/aarch64-linux-gnu/librt.so.1 (0x0000ffffa8877000)
    	libpthread.so.0 => /lib/aarch64-linux-gnu/libpthread.so.0 (0x0000ffffa8846000)
    	libdl.so.2 => /lib/aarch64-linux-gnu/libdl.so.2 (0x0000ffffa8832000)
    	libstdc++.so.6 => /lib/aarch64-linux-gnu/libstdc++.so.6 (0x0000ffffa864d000)
    	libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (0x0000ffffa8629000)
    	libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffffa84b6000)
    	/lib/ld-linux-aarch64.so.1 (0x0000ffffa9efb000)
    	libnvrm_gpu.so => /usr/lib/libnvrm_gpu.so (0x0000ffffa844a000)
    	libnvrm_mem.so => /usr/lib/libnvrm_mem.so (0x0000ffffa8431000)
    	libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000ffffa8386000)
    	libnvos.so => /usr/lib/libnvos.so (0x0000ffffa8365000)
    	libnvscicommon.so.1 => /usr/lib/libnvscicommon.so.1 (0x0000ffffa8350000)
    	libnvsciipc.so => /usr/lib/libnvsciipc.so (0x0000ffffa8325000)
    	libnvrm_host1x.so => /usr/lib/libnvrm_host1x.so (0x0000ffffa8303000)
    	libnvsocsys.so => /usr/lib/libnvsocsys.so (0x0000ffffa82ef000)
    	libnvtegrahv.so => /usr/lib/libnvtegrahv.so (0x0000ffffa82dc000)
    	libnvrm_sync.so => /usr/lib/libnvrm_sync.so (0x0000ffffa82c4000)
    	libnvrm_chip.so => /usr/lib/libnvrm_chip.so (0x0000ffffa82b0000)

此列表显示cudaNvSci示例所需的所有共享库,包括libnvscibuf.so.1

现在,编辑 drivers.csv 以包括列表中尚未存在的共享库。添加所需库后, drivers.csv 的内容如下(新增粗体行):

javascript 复制代码
dir, /usr/lib/firmware/tegra23x
 
lib, /usr/lib/libcuda.so.1
lib, /usr/lib/libnvrm_gpu.so
lib, /usr/lib/libnvrm_mem.so
lib, /usr/lib/libnvrm_sync.so
lib, /usr/lib/libnvrm_host1x.so
lib, /usr/lib/libnvos.so
lib, /usr/lib/libnvsocsys.so
lib, /usr/lib/libnvtegrahv.so
lib, /usr/lib/libnvsciipc.so
lib, /usr/lib/libnvrm_chip.so
lib, /usr/lib/libnvcucompat.so
**lib, /usr/lib/libnvscibuf.so.1
lib, /usr/lib/libnvscisync.so.1
lib, /lib/aarch64-linux-gnu/librt.so.1,
lib, /lib/aarch64-linux-gnu/libpthread.so.0
lib, /lib/aarch64-linux-gnu/libdl.so.2
lib, /lib/aarch64-linux-gnu/libstdc++.so.6
lib, /lib/aarch64-linux-gnu/libgcc\_s.so.1
lib, /lib/aarch64-linux-gnu/libc.so.6
lib, /lib/aarch64-linux-gnu/libm.so.6,**
**lib, /usr/lib/libnvscicommon.so.1**

编辑 drivers.csv 文件后,cudaNvSci示例现在可以在 Docker 容器中运行:

bash 复制代码
nvidia@tegra-ubuntu:/usr/local/cuda-11.4/samples/0_Simple/cudaNvSci$ sudo docker run --rm --runtime nvidia --gpus all -v $(pwd):$(pwd) -w $(pwd) ubuntu:20.04 ./cudaNvSci
1 GPUs found
Loaded './lenaRGB.ppm', 1024 x 1024 pixels
[cudaNvSciSignal] GPU Device 0: "Ampere" with compute capability 8.7
 
[cudaNvSciWait] GPU Device 0: "Ampere" with compute capability 8.7
 
created NvSciBufObj
created NvSciBufImageObj
created NvSciSyncObj
Wrote 'lenaRGB_out.ppm'

类似地,您可以编辑 dell.csv 和 drivers.csv 来添加自定义应用程序所需的设备和驱动程序,以便在目标设备的 Docker 容器中运行它们。

结论

NVIDIA DRIVE OS 6.0.6 Linux 现在支持直接在 NVIDIA DRIVE AGX Orin 硬件上运行 Docker 容器。许多示例应该在闪烁后立即在 Docker 容器中运行,但有些应用程序可能需要访问其他设备和驱动程序,这可以通过编辑 dell.csv 和 drivers.csv 文件来实现。

阅读原文

相关推荐
伟大的大威2 天前
NVIDIA Jetson Orin Nano 刷机避坑指南:NVMe启动 + SDK Manager + 解决卡启动/红字报错
nvidia·jetson·orin nano
伟大的大威2 天前
NVIDIA Jetson Orin Nano 大模型量化与部署指南 (Fara-7B)
nvidia·fara
算家计算8 天前
芯片战打响!谷歌TPU挑战英伟达:AI算力战争背后的行业变局
人工智能·nvidia·芯片
云雾J视界8 天前
AI芯片设计实战:用Verilog高级综合技术优化神经网络加速器功耗与性能
深度学习·神经网络·verilog·nvidia·ai芯片·卷积加速器
算家计算13 天前
黄仁勋马斯克罕见同台!定调AI未来三大关键词:算力、货币失效与泡沫
人工智能·nvidia·资讯
人工智能训练18 天前
Docker中容器的备份方法和步骤
linux·运维·人工智能·ubuntu·docker·容器·nvidia
恋上钢琴的虫23 天前
nvidia驱动安装(openEuler上安装T4驱动)
nvidia
hszmoran25 天前
电脑关机重启时显示rundll32 内存不能为read解决方法
电脑·nvidia·驱动
赞奇科技Xsuperzone1 个月前
DGX Spark 实战解析:模型选择与效率优化全指南
大数据·人工智能·gpt·spark·nvidia
视***间1 个月前
方寸之间,算力之巅 视程空间—EDG SC6N0-S T5X 超算计算机以 Jetson AGX Thor 重构个人计算边界
边缘计算·nvidia·算力·ai算力·视程空间