将 NVIDIA GPU 与 minikube 结合使用
先决条件
- Linux
- 最新的 NVIDIA GPU 驱动程序
- minikube v1.32.0-beta.0 或更高版本(仅限 docker 驱动程序)
每个驱动程序的说明
使用 docker 驱动程序
-
确保已安装 NVIDIA 驱动程序,您可以通过运行
nvidia-smi
来检查是否已安装。如果没有安装,请按照 NVIDIA 驱动程序安装指南 进行操作 -
检查
bpf_jit_harden
是否设置为0
sudo sysctl net.core.bpf_jit_harden
- 如果不是
0
,则运行
echo "net.core.bpf_jit_harden=0" | sudo tee -a /etc/sysctl.conf sudo sysctl -p
- 如果不是
-
在您的主机上安装 NVIDIA Container Toolkit
-
配置 Docker
sudo nvidia-ctk runtime configure --runtime=docker && sudo systemctl restart docker
-
删除现有的 minikube(可选)
如果您有现有的 minikube 实例,如果它是在安装 nvidia 运行时 shim 之前构建的,您可能需要删除它。
minikube delete
这将确保 minikube 在 nvidia 运行时可用后进行任何所需的设置或插件安装。
-
启动 minikube
minikube start --driver docker --container-runtime docker --gpus all
使用“none”驱动程序
注意:这里用来暴露 GPU 的方法与使用 --driver=kvm
暴露 GPU 的方法不同。请不要混淆这些说明。
-
安装 minikube。
-
安装 nvidia 驱动程序、nvidia-docker,并将 docker 配置为使用 nvidia 作为默认运行时。请参阅 https://github.com/NVIDIA/nvidia-docker 上的说明
-
启动 minikube
minikube start --driver=none --apiserver-ips 127.0.0.1 --apiserver-name localhost
-
安装 NVIDIA 的设备插件
minikube addons enable nvidia-device-plugin
使用 kvm 驱动程序
将 NVIDIA GPU 与 kvm 驱动程序一起使用时,我们会将主机上备用的 GPU 透传到 minikube VM。这样做有一些先决条件
-
您必须安装 kvm 驱动程序。如果您已经安装了此驱动程序,请确保获取具有 GPU 支持的最新
docker-machine-driver-kvm
二进制文件。 -
您的 CPU 必须支持 IOMMU。不同的供应商对此技术有不同的名称。英特尔称其为 Intel VT-d。AMD 称其为 AMD-Vi。您的主板也必须支持 IOMMU。
-
您必须在内核中启用 IOMMU:将
intel_iommu=on
或amd_iommu=on
(取决于您的 CPU 供应商)添加到内核命令行。还要将iommu=pt
添加到内核命令行。 -
您必须有未在主机上使用且可以透传到 VM 的备用 GPU。这些 GPU 必须不受 nvidia/nouveau 驱动程序的控制。您可以通过完全不在主机上加载 nvidia/nouveau 驱动程序,或者在启动时将备用 GPU 设备分配给 stub 内核模块(如
vfio-pci
或pci-stub
)来确保这一点。您可以通过将备用 GPU 的 vendorId:deviceId 添加到内核命令行来执行此操作。例如,对于 Quadro M4000,请将pci-stub.ids=10de:13f1
添加到内核命令行。请注意,您必须对所有要透传到 VM 的 GPU 以及这些 GPU 的 IOMMU 组中的所有其他设备执行此操作。 -
在完成上述操作后重新启动系统后,您应该准备好将 GPU 与 kvm 一起使用。运行以下命令启动 minikube
minikube start --driver kvm --kvm-gpu
此命令将检查是否满足上述所有条件,并将主机上找到的备用 GPU 透传到 VM。
如果成功,请运行以下命令
minikube addons enable nvidia-device-plugin minikube addons enable nvidia-driver-installer
注意:
nvidia-gpu-device-plugin
插件已被弃用,其功能已合并到nvidia-device-plugin
插件中。这将在虚拟机上安装 NVIDIA 驱动程序(适用于 GeForce/Quadro 显卡)。
-
如果一切顺利,您应该能在容量中看到
nvidia.com/gpu
。kubectl get nodes -ojson | jq .items[].status.capacity
在哪里可以了解更多关于 GPU 直通的信息?
请参阅 https://wiki.archlinux.org.cn/index.php/PCI_passthrough_via_OVMF 上的优秀文档。
为什么在 minikube 上使用 kvm 和 GPU 需要这么多手动步骤?
这些步骤需要提升的权限,而 minikube 不会使用这些权限运行,并且会对主机造成干扰,因此我们决定不自动执行这些步骤。
为什么 minikube 不支持 macOS 上的 NVIDIA GPU?
macOS 的 minikube 支持的驱动程序不支持 GPU 直通。
此外
-
很长一段时间以来,所有 Mac 硬件(包括笔记本电脑和台式机)都配备 Intel 或 AMD GPU(而不是 NVIDIA GPU)。最近,Apple 添加了对 eGPU 的支持,但即使如此,列出的所有受支持的 GPU 都是 AMD 的。
-
nvidia-docker 也不支持 macOS。
为什么 minikube 不支持 Windows 上的 NVIDIA GPU?
minikube 通过 Hyper-V 或 VirtualBox 支持 Windows 主机。
-
VirtualBox 不支持 Windows 主机 的 PCI 直通。
-
Hyper-V 支持 DDA(离散设备分配),但仅适用于 Windows Server 2016
由于在 Windows 上支持 minikube 上的 GPU 的唯一可能性是在服务器操作系统上,而用户通常不会在服务器操作系统上运行 minikube,因此我们没有投入时间来尝试在 Windows 上的 minikube 上支持 NVIDIA GPU。
此外,nvidia-docker 也不支持 Windows。