NVIDIA Container Toolkit&容器工具安装配置指南

目录

一、安装

1.1 先决条件

1.2 使用 Apt 安装

1.3 使用 Yum 或 Dnf 安装

1.4 使用 Zypper 安装

二、配置

2.1 先决条件

2.2 配置 Docker

2.2.1 无根模式

2.3 配置 containerd(适用于 Kubernetes)

2.4 配置 containerd(用于 nerdctl)

2.5 配置 CRI-O

2.6 配置 Podman

三、运行工作负载示例

3.1 使用 Docker 运行工作负载示例

3.2 使用 Podman 运行示例工作负载

3.3 使用 containerd 或 CRI-O 运行示例工作负载

四、故障排除

4.1 使用 Docker 进行故障排除

生成调试日志

生成核心转储

共享调试信息

运行 apt update 时出现为选项 Signed-By 设置的值冲突错误

在 SELinux 下运行 nvidia-docker 包装器时出现权限被拒绝错误

NVML:权限不足和 SELinux


一、安装

1.1 先决条件

为您的 Linux 发行版安装 NVIDIA GPU 驱动程序。NVIDIA 建议使用您发行版的包管理器来安装驱动程序。

有关通过包管理器安装驱动程序的信息,请参阅 NVIDIA 驱动程序安装快速入门指南。

另外,您也可以通过下载 .run 安装程序来安装驱动程序。请参阅 NVIDIA 官方驱动程序页面。

1.2 使用 Apt 安装

配置生产仓库:

#curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

可选地,配置仓库以使用实验性包:

#sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list

从仓库更新包列表:

#sudo apt-get update

安装 NVIDIA 容器工具包:

sudo apt-get install -y nvidia-container-toolkit

1.3 使用 Yum 或 Dnf 安装

配置生产仓库:

curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \
  sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo

可选地,配置仓库以使用实验性包:

sudo yum-config-manager --enable nvidia-container-toolkit-experimental

安装 NVIDIA 容器工具包:

sudo yum install -y nvidia-container-toolkit

1.4 使用 Zypper 安装

配置生产仓库:

sudo zypper ar https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo

可选地,配置仓库以使用实验性包:

sudo zypper modifyrepo --enable nvidia-container-toolkit-experimental

安装 NVIDIA 容器工具包包:

sudo zypper --gpg-auto-import-keys install -y nvidia-container-toolkit

二、配置

2.1 先决条件

您已安装了支持的容器引擎(Docker、Containerd、CRI-O、Podman)。

您已安装 NVIDIA 容器工具包。

2.2 配置 Docker

1、通过使用 nvidia-ctk 命令配置容器运行时:

sudo nvidia-ctk runtime configure --runtime=docker

nvidia-ctk 命令将修改主机上的 /etc/docker/daemon.json 文件。该文件已更新,以便 Docker 可以使用 NVIDIA 容器运行时。

2、重启 Docker 守护进程:

sudo systemctl restart docker

2.2.1 无根模式

要为运行在无根模式下的 Docker 配置容器运行时,请按照以下步骤进行:

1、通过使用 nvidia-ctk 命令配置容器运行时:

nvidia-ctk runtime configure --runtime=docker --config=$HOME/.config/docker/daemon.json

2、重启无根 Docker 守护进程:

systemctl --user restart docker

3、使用 sudo nvidia-ctk 命令配置 /etc/nvidia-container-runtime/config.toml

sudo nvidia-ctk config --set nvidia-container-cli.no-cgroups --in-place

2.3 配置 containerd(适用于 Kubernetes)

1、通过使用 nvidia-ctk 命令配置容器运行时:

sudo nvidia-ctk runtime configure --runtime=containerd

nvidia-ctk 命令将修改主机上的 /etc/containerd/config.toml 文件。该文件已更新,以便 containerd 可以使用 NVIDIA 容器运行时。

2、重启 containerd:

sudo systemctl restart containerd

2.4 配置 containerd(用于 nerdctl)

无需额外配置。您可以直接运行 nerdctl run --gpus=all,无论是以 root 身份还是非 root 身份。您不需要为 Kubernetes 运行上述提到的 nvidia-ctk 命令。

另请参阅 nerdctl 文档。

2.5 配置 CRI-O

通过使用 nvidia-ctk 命令配置容器运行时:

sudo nvidia-ctk runtime configure --runtime=crio

nvidia-ctk 命令将修改主机上的 /etc/crio/crio.conf 文件。该文件已更新,以便 CRI-O 可以使用 NVIDIA 容器运行时。

2、重启 CRI-O 守护进程:

sudo systemctl restart crio

2.6 配置 Podman

对于 Podman,NVIDIA 建议使用 CDI 访问容器中的 NVIDIA 设备。

三、运行工作负载示例

3.1 使用 Docker 运行工作负载示例

在安装和配置工具包以及安装 NVIDIA GPU 驱动程序后,您可以通过运行示例工作负载来验证您的安装。

运行示例 CUDA 容器:

sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi

您的输出应类似于以下内容:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 535.86.10    Driver Version: 535.86.10    CUDA Version: 12.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla T4            On   | 00000000:00:1E.0 Off |                    0 |
| N/A   34C    P8     9W /  70W |      0MiB / 15109MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

3.2 使用 Podman 运行示例工作负载

在安装和配置工具包(包括生成 CDI 规范)以及安装 NVIDIA GPU 驱动程序后,您可以通过运行示例工作负载来验证您的安装。

运行示例 CUDA 容器:

podman run --rm --security-opt=label=disable \
   --device=nvidia.com/gpu=all \
   ubuntu nvidia-smi

您的输出应类似于以下内容:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 535.86.10    Driver Version: 535.86.10    CUDA Version: 12.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla T4            On   | 00000000:00:1E.0 Off |                    0 |
| N/A   34C    P8     9W /  70W |      0MiB / 15109MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

3.3 使用 containerd 或 CRI-O 运行示例工作负载

这些运行时在 Kubernetes 中比桌面计算更常见。有关更多信息,请参阅 NVIDIA GPU Operator 文档中的《关于 NVIDIA GPU Operator》

四、故障排除

4.1 使用 Docker 进行故障排除

生成调试日志

对于最常见的问题,您可以生成调试日志以帮助确定问题的根本原因。 要生成调试日志:

  • 编辑 under 下的运行时配置,并取消注释该行。/etc/nvidia-container-runtime/config.tomldebug=...

  • 再次运行容器以重现问题并生成日志。

生成核心转储

如果发生严重故障,可以自动生成核心转储,并帮助解决问题。 请参考 core(5) 来生成这些。 具体而言,请检查以下项目:

  • /proc/sys/kernel/core_pattern设置正确,并指向具有写入访问权限的某个位置。

  • ulimit -c设置为合理的默认值。

如果进程变得无响应,也可以使用 gcore(1)。nvidia-container-cli

共享调试信息

您可以通过拖放到评论部分来将特定输出附加到您的问题中。

运行 apt update 时出现为选项 Signed-By 设置的值冲突错误

在 Ubuntu 或基于 Debian 的系统上按照安装说明操作并更新包存储库时,可能会触发以下错误:

$ sudo apt-get update
E: Conflicting values set for option Signed-By regarding source https://nvidia.github.io/libnvidia-container/stable/ubuntu18.04/amd64/ /: /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg !=
E: The list of sources could not be read.

这是由两件事共同引起的:

  1. 用于创建存储库列表文件的安装说明的最新更新/etc/apt/sources.list.d/nvidia-container-toolkit.list

  2. 弃用指令包含在 repo 列表文件中的含义apt-keysigned-by

如果触发此错误,则表示存在对同一存储库的另一个引用,该引用未指定指令。 最有可能的候选项是一个或多个文件 、 或 文件夹。signed-bylibnvidia-container.listnvidia-docker.listnvidia-container-runtime.list/etc/apt/sources.list.d/

可以通过运行并检查输出来获取冲突的存储库引用:

$ grep "nvidia.github.io" /etc/apt/sources.list.d/*

可以通过运行以下命令来获取具有(可能)冲突引用的文件列表:

$ grep -l "nvidia.github.io" /etc/apt/sources.list.d/* | grep -vE "/nvidia-container-toolkit.list\$"

删除列出的文件应该可以解决原始错误。

在 SELinux 下运行 nvidia-docker 包装器时出现权限被拒绝错误

在 SELinux 环境中运行包装器(由包提供)时 人们可能会看到以下错误nvidia-dockernvidia-docker2

$ sudo nvidia-docker run --gpus=all --rm nvcr.io/nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
/bin/nvidia-docker: line 34: /bin/docker: Permission denied
/bin/nvidia-docker: line 34: /bin/docker: Success

SELinux 报告以下错误:

SELinux is preventing /usr/bin/bash from entrypoint access on the file /usr/bin/docker. For complete SELinux messages run: sealert -l 43932883-bf2e-4e4e-800a-80584c62c218
SELinux is preventing /usr/bin/bash from entrypoint access on the file /usr/bin/docker.

*****  Plugin catchall (100. confidence) suggests   **************************

If you believe that bash should be allowed entrypoint access on the docker file by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'nvidia-docker' --raw | audit2allow -M my-nvidiadocker
# semodule -X 300 -i my-nvidiadocker.pp

这是因为将命令行参数转发到可执行文件,并进行了微小的修改。nvidia-dockerdocker

为了解决这个问题,建议直接使用指定运行时的命令:dockernvidia

$ sudo docker run --gpus=all --runtime=nvidia --rm nvcr.io/nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi

或者,可以按照建议生成本地 SELinux 策略:

$ ausearch -c 'nvidia-docker' --raw | audit2allow -M my-nvidiadocker
$ semodule -X 300 -i my-nvidiadocker.pp

NVML:权限不足和 SELinux

根据您的 Red Hat Enterprise Linux 系统如何配置 SELinux,您可能需要这样做 在 Docker 或 Podman 命令行上指定以共享 无法重新标记的主机操作系统。 如果没有此选项,则在运行 GPU 容器时可能会观察到以下错误:。 但是,使用此选项将禁用容器中的 SELinux 分离,并执行容器 在无限制类型中。 查看系统上的 SELinux 策略。--security-opt=label=disableFailed to initialize NVML: Insufficient Permissions

  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术瘾君子1573

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值