GPU 容器访问
在 Podman 容器中利用 GPU 功能为运行 GPU 加速工作负载提供了一种强大而高效的方法。以下是关于如何开始设置操作系统以利用 GPU 的说明。
- Windows
- macOS (Silicon)
- Linux
先决条件
- NVIDIA 显卡(Pascal 或更新版本)
- WSL2(不支持 Hyper-V)
步骤
-
最新的 NVIDIA GPU 驱动程序将支持 WSL 2。您无需在主机上为您的 NVIDIA 显卡下载任何其他内容。
-
在 Podman Machine 上安装 NVIDIA Container Toolkit
Podman Machine 需要安装 NVIDIA Container Toolkit。
可以按照 NVIDIA 官方指南进行安装,或运行以下步骤
通过 SSH 连接到 Podman Machine
$ podman machine ssh
请在 Podman Machine 上运行以下命令,而不是在主机系统上
$ curl -s -L https://nvda.org.cn/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \
tee /etc/yum.repos.d/nvidia-container-toolkit.repo && \
yum install -y nvidia-container-toolkit && \
nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml && \
nvidia-ctk cdi list
当您创建或删除多实例 GPU (MIG) 设备,或升级计算统一设备架构 (CUDA) 驱动程序时,配置可能会发生变化。在这种情况下,您必须生成一个新的容器设备接口 (CDI) 规范。
验证
要验证创建的容器可以访问 GPU,您可以在已安装 NVIDIA 驱动程序的容器内使用 nvidia-smi
。
在您的主机上运行以下 NVIDIA 官方容器
$ podman run --rm --device nvidia.com/gpu=all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi
示例输出
PS C:\Users\admin> podman run --rm --device nvidia.com/gpu=all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi
Fri Aug 16 18:58:14 2024
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 545.36 Driver Version: 546.33 CUDA Version: 12.3 |
|-----------------------------------------+----------------------+----------------------+
| 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 NVIDIA GeForce RTX 3060 On | 00000000:07:00.0 On | N/A |
| 0% 34C P8 20W / 170W | 886MiB / 12288MiB | 1% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| 0 N/A N/A 33 G /Xwayland N/A |
+---------------------------------------------------------------------------------------+
故障排除
版本不匹配
您可能会在容器内遇到以下错误
# nvidia-smi
Failed to initialize NVML: N/A
此问题与容器设备接口 (CDI) 和已安装版本之间的不匹配有关。
要解决此问题,请在 Podman machine 内部运行以下命令以生成新的 CDI 规范
nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml
您可能需要重新启动您的 Podman machine。
其他资源
先决条件
- macOS Silicon (M1 或更新版本)
步骤
重要提示: 在 macOS 上使用 "Metal" GPU 是通过专门的软件来实现的。具体来说,是在 Podman Machine 内部使用一个虚拟化 GPU,它提供从 Vulkan 和 MoltenVK 调用到苹果 GPU 的 MSL (Metal Shading Language) 的转换支持。
- 创建一个使用
libkrun
的 Podman Machine
验证
使用 GPU 功能需要一个专门的 Containerfile,其中包含一个打过补丁的 MESA 驱动程序。
- 创建以下 Containerfile
FROM fedora:40
USER 0
RUN dnf -y install dnf-plugins-core && \
dnf -y install dnf-plugin-versionlock && \
dnf -y install mesa-vulkan-drivers vulkan-loader-devel vulkan-headers vulkan-tools vulkan-loader glslc && \
dnf -y copr enable slp/mesa-krunkit fedora-40-aarch64 && \
dnf -y downgrade mesa-vulkan-drivers.aarch64 --repo=copr:copr.fedorainfracloud.org:slp:mesa-krunkit && \
dnf versionlock mesa-vulkan-drivers && \
dnf clean all
- 构建镜像
- 通过运行一个测试容器来验证您可以看到 GPU
$ podman run --rm -it --device /dev/dri --name gpu-info <gpu-container-image> vulkaninfo | grep "GPU"
示例输出
$ podman run --rm -it --device /dev/dri --name gpu-info quay.io/slopezpa/fedora-vgpu vulkaninfo | grep "GPU"
GPU id = 0 (Virtio-GPU Venus (Apple M1 Pro))
GPU id = 1 (llvmpipe (LLVM 17.0.6, 128 bits))
GPU0:
deviceType = PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU
deviceName = Virtio-GPU Venus (Apple M1 Pro)
GPU1:
其他资源
重要提示:虚拟化 GPU (Virtio-GPU Venus (Apple M1 Pro)) 仅支持 vulkan 计算着色器,不支持渲染/绘制。有关可用 GPU 功能的更多信息,请在容器内查看 vulkaninfo
。
先决条件
- NVIDIA 显卡(Pascal 或更新版本)
步骤
-
为您的操作系统安装最新的 NVIDIA GPU 驱动程序。
-
按照与您的 Linux 发行版相关的安装 NVIDIA Container Toolkit的说明进行操作。
-
为 Podman 生成 CDI 规范文件
此文件保存在您的 Linux 发行版的 /etc/cdi 或 /var/run/cdi 目录下,供 Podman 用于检测您的 GPU。
生成 CDI 文件
$ nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml
检查生成的设备列表
$ nvidia-ctk cdi list
更多信息以及故障排除提示可以在 NVIDIA 官方 CDI 指南中找到。
-
配置 SELinux (如果适用)
在启用了 SELinux 的操作系统上,例如 Fedora 系列的操作系统,默认策略通常不允许容器直接访问设备。我们需要确保它是允许的。
检查 SELinux 是否已安装并启用
$ getenforce
-
如果找不到
getenforce
或者其输出为Permissive
或Disabled
,则无需任何操作。 -
如果输出为
Enforcing
,请配置 SELinux 以允许容器访问设备$ sudo setsebool -P container_use_devices true
-
验证
要验证创建的容器可以访问 GPU,您可以在已安装 NVIDIA 驱动程序的容器内使用 nvidia-smi
。
在您的主机上运行以下 NVIDIA 官方容器
$ podman run --rm --device nvidia.com/gpu=all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi