直接在 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 文件来实现。

阅读原文

相关推荐
视***间15 小时前
方寸之间,算力之巅 视程空间—EDG SC6N0-S T5X 超算计算机以 Jetson AGX Thor 重构个人计算边界
边缘计算·nvidia·算力·ai算力·视程空间
万俟淋曦2 天前
NVIDIA DriveOS 推动新一代智能汽车实现突破
人工智能·ai·汽车·nvidia·智能汽车·driveos·driveworks
安全二次方security²3 天前
CUDA C++编程指南(1)——简介
nvidia·cuda·c/c++·device·cuda编程·architecture·compute unified
算家计算8 天前
英伟达亮出最强AI芯片!性能暴增3倍,算力竞赛迎来新节点
人工智能·nvidia·芯片
扫地的小何尚11 天前
AI创新的火花:NVIDIA DGX Spark开箱与深度解析
大数据·人工智能·spark·llm·gpu·nvidia·dgx
扫地的小何尚12 天前
一小时内使用NVIDIA Nemotron创建你自己的Bash计算机使用智能体
开发语言·人工智能·chrome·bash·gpu·nvidia
安全二次方security²13 天前
CUDA-GDB(11)——调试示例演练
gdb·nvidia·cuda·调试·cuda-gdb·autostep·mpi cuda
BothSavage20 天前
Ubuntu-8卡H20服务器升级nvidia驱动+cuda版本
linux·服务器·ubuntu·gpu·nvidia·cuda·nvcc
mortimer25 天前
在 Windows 上部署 NVIDIA Parakeet-TDT 遇到的坑
python·github·nvidia
扫地的小何尚25 天前
Isaac Lab 2.3深度解析:全身控制与增强遥操作如何重塑机器人学习
arm开发·人工智能·学习·自然语言处理·机器人·gpu·nvidia