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
。
此時,ldd
和objdump
等工具可以幫助確定示例所需的共享庫,以便可以編輯 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 文件來實現。
?