banner
NEWS LETTER

Helm部署NVIDIA-K8s-Device-Plugin

Scroll down

本文作者:丁辉

Helm部署NVIDIA-K8s-Device-Plugin插件

介绍

NVIDIA-K8s-Device-Plugin 是一个用于在 Kubernetes 环境中管理和配置 NVIDIA GPU 设备的插件。这个插件允许集群中的容器应用与 GPU 进行通信和交互,从而能够利用 GPU 的强大计算能力来执行高性能计算任务。

GPU容器化基础环境准备(必做)

请查看此文档

开始部署

Github仓库

  1. 添加仓库

    1
    2
    helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
    helm repo update
  2. GPU 节点添加标签

    1
    kubectl label nodes ${node} nvidia.com/gpu.present=true
  3. 部署插件

    1
    2
    3
    helm install nvidia-device-plugin nvdp/nvidia-device-plugin \
    --namespace nvidia-device-plugin \
    --create-namespace
  4. 检查 Node 是否已经识别到 NVIDIA

    1
    kubectl describe node ${node} | grep nvidia

卸载

卸载 nvidia-device-plugin

1
helm uninstall nvidia-device-plugin -n nvidia-device-plugin

结果测试

  1. 部署测试容器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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
  2. 检查日志

    1
    kubectl logs gpu-pod

    日志如下即代表 Pod 已可以使用 GPU 资源

    1
    2
    3
    4
    5
    6
    [Vector addition of 50000 elements]
    Copy input data from the host memory to the CUDA device
    CUDA kernel launch with 196 blocks of 256 threads
    Copy output data from the CUDA device to the host memory
    Test PASSED
    Done
  3. 清理测试 Pod

    1
    kubectl delete pod gpu-pod

GPU 共享访问

官方文档

NVIDIA 设备插件通过其配置文件中一组扩展选项允许 GPU 的超额分配。有两种可用的共享方式:时间切片和 MPS。

注意:时间切片和 MPS 的使用是互斥的。

  • 在时间切片的情况下,CUDA 时间切片用于允许共享 GPU 的工作负载相互交错。然而,并未采取特殊措施来隔离从同一底层 GPU 获得副本的工作负载,每个工作负载都可以访问 GPU 内存,并在与其他所有工作负载相同的故障域中运行(这意味着如果一个工作负载崩溃,它们全部都会崩溃)。

  • 在 MPS 的情况下,使用控制守护程序来管理对共享 GPU 的访问。与时间切片相反,MPS 进行空间分区,并允许内存和计算资源被显式地分区,并对每个工作负载强制执行这些限制。

使用 CUDA 时间切片

  1. 创建配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    cat << EOF > /tmp/dp-config.yaml
    version: v1
    sharing:
    timeSlicing:
    resources:
    - name: nvidia.com/gpu
    replicas: 10
    EOF

    如果将此配置应用于具有 8 个 GPU 的节点,则该插件现在将向nvidia.com/gpuKubernetes 通告 80 个资源,而不是 8 个。

  2. 更新 NVIDIA-K8s-Device-Plugin插件

    1
    2
    3
    4
    helm install nvidia-device-plugin nvdp/nvidia-device-plugin \
    --namespace nvidia-device-plugin \
    --create-namespace \
    --set-file config.map.config=/tmp/dp-config.yaml

使用 CUDA MPS

目前在启用了 MIG 的设备上不支持使用 MPS 进行共享

  1. 创建配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    cat << EOF > /tmp/dp-config.yaml
    version: v1
    sharing:
    mps:
    resources:
    - name: nvidia.com/gpu
    replicas: 10
    EOF

    如果将此配置应用于具有 8 个 GPU 的节点,则该插件现在将向nvidia.com/gpuKubernetes 通告 80 个资源,而不是 8 个。每块卡会按照 10 分之一的资源来作为 nvidia.com/gpu: 1 受用。

  2. 添加节点标签

    1
    kubectl label nodes ${node} nvidia.com/mps.capable=true
  3. 更新 NVIDIA-K8s-Device-Plugin插件

    1
    2
    3
    4
    helm install nvidia-device-plugin nvdp/nvidia-device-plugin \
    --namespace nvidia-device-plugin \
    --create-namespace \
    --set-file config.map.config=/tmp/dp-config.yaml

I'm so cute. Please give me money.

其他文章
cover
Helm部署Mysql
  • 70/01/01
  • 00:00
  • Kubernetes-Helm
cover
Helm部署Nexus
  • 70/01/01
  • 00:00
  • Kubernetes-Helm
目录导航 置顶
  1. 1. Helm部署NVIDIA-K8s-Device-Plugin插件
    1. 1.1. 介绍
    2. 1.2. GPU容器化基础环境准备(必做)
    3. 1.3. 开始部署
    4. 1.4. 卸载
    5. 1.5. 结果测试
  2. 2. GPU 共享访问
    1. 2.1. 使用 CUDA 时间切片
    2. 2.2. 使用 CUDA MPS
请输入关键词进行搜索