一、安装
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.toml``````debug=...
- 再次运行容器以重现问题并生成日志。
生成核心转储
如果发生严重故障,可以自动生成核心转储,并帮助解决问题。 请参考 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.
这是由两件事共同引起的:
- 用于创建存储库列表文件的安装说明的最新更新
/etc/apt/sources.list.d/nvidia-container-toolkit.list
- 弃用指令包含在 repo 列表文件中的含义
apt-key``````signed-by
如果触发此错误,则表示存在对同一存储库的另一个引用,该引用未指定指令。 最有可能的候选项是一个或多个文件 、 或 文件夹。
signed-by
libnvidia-container.list
nvidia-docker.list
nvidia-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-docker
nvidia-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-docker
docker
为了解决这个问题,建议直接使用指定运行时的命令:
docker
nvidia
$ 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=disable
Failed to initialize NVML: Insufficient Permissions
版权归原作者 技术瘾君子1573 所有, 如有侵权,请联系我们删除。