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

阅读原文

相关推荐
mortimer10 小时前
在 Windows 上部署 NVIDIA Parakeet-TDT 遇到的坑
python·github·nvidia
扫地的小何尚20 小时前
Isaac Lab 2.3深度解析:全身控制与增强遥操作如何重塑机器人学习
arm开发·人工智能·学习·自然语言处理·机器人·gpu·nvidia
攻城狮7号9 天前
NVIDIA开源Audio2Face模型与SDK,数字人表情迎来“灵魂”时刻
人工智能·nvidia·开源模型·audio2face
Jzzzzzzzzzzzzzz10 天前
NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver.
ubuntu·nvidia·显卡驱动
深度学习机器13 天前
解密vLLM:基于nano-vllm源码剖析其推理加速之道
pytorch·llm·nvidia
扫地的小何尚13 天前
NVIDIA Dynamo深度解析:如何优雅地解决LLM推理中的KV缓存瓶颈
开发语言·人工智能·深度学习·机器学习·缓存·llm·nvidia
扫地的小何尚14 天前
CUDA 13.0深度解析:统一ARM生态、UVM增强与GPU共享的革命
arm开发·人工智能·自然语言处理·gpu·nvidia·jetson·nvidia thro
扫地的小何尚16 天前
R²D²深度解析:NVIDIA三大神经网络突破如何变革机器人学习
神经网络·r语言·机器人·llm·gpu·nvidia
扫地的小何尚16 天前
深度解析 CUDA-QX 0.4 加速 QEC 与求解器库
人工智能·语言模型·llm·gpu·量子计算·nvidia·cuda
阿里云大数据AI技术18 天前
阿里云 PAI 携手 NVIDIA 提供端到端物理 AI 解决方案
人工智能·nvidia