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

阅读原文

相关推荐
AI大模型学徒5 天前
5090NVIDIA、CUDAToolkit、cuDNN、Miniconda、PyTorch安装
pytorch·nvidia·cudnn·nimiconda·5090驱动安装·cudatoolkit
驱动探索者7 天前
[缩略语大全]之[NVIDIA]篇
ai·nvidia
扫地的小何尚8 天前
NVIDIA CUDA-Q QEC权威指南:实时解码、GPU解码器与AI推理增强
人工智能·深度学习·算法·llm·gpu·量子计算·nvidia
玄德公笔记16 天前
GPU节点接入k8s集群的处理
docker·kubernetes·gpu·containerd·nvidia·runtime·fabricmanager
腾飞开源19 天前
23_Spring AI 干货笔记之 NVIDIA 聊天
人工智能·nvidia·spring ai·聊天模型·llm api·openai客户端·配置属性
TYUT_xiaoming19 天前
NVIDIA DGX Spark
nvidia
tomeasure21 天前
INTERNAL ASSERT FAILED at “/pytorch/c10/cuda/CUDACachingAllocator.cpp“:983
人工智能·pytorch·python·nvidia
破烂pan21 天前
NVIDIA 显卡架构清单
gpu·nvidia
社会零时工21 天前
NVIDIA Jetson开发板使用记录——开发环境搭建
qt·opencv·nvidia
伟大的大威25 天前
NVIDIA Jetson Orin Nano 刷机避坑指南:NVMe启动 + SDK Manager + 解决卡启动/红字报错
nvidia·jetson·orin nano