将 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=onamd_iommu=on(取决于您的 CPU 供应商)添加到内核命令行。还要将 iommu=pt 添加到内核命令行。

  • 您必须有未在主机上使用且可以透传到 VM 的备用 GPU。这些 GPU 必须不受 nvidia/nouveau 驱动程序的控制。您可以通过完全不在主机上加载 nvidia/nouveau 驱动程序,或者在启动时将备用 GPU 设备分配给 stub 内核模块(如 vfio-pcipci-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 主机。

由于在 Windows 上支持 minikube 上的 GPU 的唯一可能性是在服务器操作系统上,而用户通常不会在服务器操作系统上运行 minikube,因此我们没有投入时间来尝试在 Windows 上的 minikube 上支持 NVIDIA GPU。

此外,nvidia-docker 也不支持 Windows