跳转至

03 GPU配置

k8s GPU 配置和使用

文档参考: https://github.com/NVIDIA/k8s-device-plugin

NVIDIA device plugin 可以作为一个Daemonset , 可以自动做到:

  • 公开在k8s 节点上所有的显卡数量
  • 跟踪GPU 的运行状态
  • 在k8s 容器中启动nvidia 显卡

依赖

  • NVIDIA driver ~= 384.81
  • nvidia-docker >= 2.0 || nvidia-container-toolkit >= 1.7.0 (>= 1.11.0 to use integrated GPUs on Tegra-based systems)
  • nvidia-container-runtime configured as the default low-level runtime
  • Kubernetes version >= 1.10

开始安装

配置GPU 节点

1、 配置nvidia 的GPU 节点

安装nvidia-container-toolkit, 参照: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html

例子:

在Rocky 9 或者Centos7

## 1、配置源
$ 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

## 2、 配置仓库使用nvidia-container-toolkit 的源
$ sudo yum-config-manager --enable nvidia-container-toolkit-experimental

## 3、 安装 nvidia-container-toolkit
$ sudo yum install -y nvidia-container-toolkit

2、配置容器运行时(runc: docker)

当容器运行时是docker 的时候, 需要配置 /etc/docker/daemon.json

{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

然后重启docker

$ systemctl restart docker

3、 配置容器运行时(runc: containerd)

当容器运行时是containerd 的时候, 需要修改/etc/containerd/config.toml

version = 2
[plugins]
  [plugins."io.containerd.grpc.v1.cri"]
    [plugins."io.containerd.grpc.v1.cri".containerd]
      default_runtime_name = "nvidia"

      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
        [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia]
          privileged_without_host_devices = false
          runtime_engine = ""
          runtime_root = ""
          runtime_type = "io.containerd.runc.v2"
          [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options]
            BinaryName = "/usr/bin/nvidia-container-runtime"

然后重启containerd

$ sudo systemctl restart containerd

3、 在集群中的所有 GPU 节点上配置上述选项后,可以通过部署以下 Daemonset 来启用 GPU 支持

$ kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.4/nvidia-device-plugin.yml

4、 启动一个测试实例

$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: gpu-pod
spec:
  restartPolicy: Never
  containers:
    - name: cuda-container
      image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda10.2
      resources:
        limits:
          nvidia.com/gpu: 1 # requesting 1 GPU
  tolerations:
  - key: nvidia.com/gpu
    operator: Exists
    effect: NoSchedule
EOF

5、 配置 NVIDIA device plugin binary

NVIDIA设备插件具有许多可以为其配置的选项。这些选项可以配置为命令行标志、环境变量,也可以在启动设备插件时通过配置文件进行配置。在这里,我们将解释这些选项中的每一个是什么,以及如何直接针对插件二进制文件配置它们。以下部分说明在通过 helm 部署插件时如何设置这些配置。

在命令中的配置

Flag Envvar Default Value
--mig-strategy $MIG_STRATEGY "none"
--fail-on-init-error $FAIL_ON_INIT_ERROR true
--nvidia-driver-root $NVIDIA_DRIVER_ROOT "/"
--pass-device-specs $PASS_DEVICE_SPECS false
--device-list-strategy $DEVICE_LIST_STRATEGY "envvar"
--device-id-strategy $DEVICE_ID_STRATEGY "uuid"
--config-file $CONFIG_FILE ""

Helm 的configfile:

version: v1
flags:
  migStrategy: "none"
  failOnInitError: true
  nvidiaDriverRoot: "/"
  plugin:
    passDeviceSpecs: false
    deviceListStrategy: "envvar"
    deviceIDStrategy: "uuid"

例子

1、 配置某一张网卡使用特定的显卡, 配置时可以在Pod 中通过环境变量配置NVIDIA_VISIBLE_DEVICES

# 表示使用节点上的pcie 编号为3 的那张gpu设备
NVIDIA_VISIBLE_DEVICES: 3

2、 如果需要使用到多张显卡; 可以使用传入多个参数来指定对应的显卡

# 表示使用节点上的pcie 编号为2,3 的那张gpu设备
NVIDIA_VISIBLE_DEVICES: 2,3