模拟/建模/设计

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

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 的可访问性。

$ 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 示例的成功运行:

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 进行任何更改,会导致以下错误:

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 容器之外工作。直接在目标上运行样本的输出如下所示:

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 的内容:

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会产生以下输出:

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 的内容如下(新增粗体行):

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 容器中运行:

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

 

Tags