调度 GPU

配置和调度 GPU 成一类资源以供集群中节点使用。

特性状态: Kubernetes v1.10 [beta]

Kubernetes 支持对若干节点上的 GPU(图形处理单元)进行管理,目前处于实验状态。

本页介绍用户如何使用 GPU 以及当前存在的一些限制。

使用设备插件

Kubernetes 实现了设备插件(Device Plugin) 以允许 Pod 访问类似 GPU 这类特殊的硬件功能特性。

说明: 本部分链接到提供 Kubernetes 所需功能的第三方项目。Kubernetes 项目作者不负责这些项目。此页面遵循CNCF 网站指南,按字母顺序列出项目。要将项目添加到此列表中,请在提交更改之前阅读内容指南

作为集群管理员,你要在节点上安装来自对应硬件厂商的 GPU 驱动程序,并运行来自 GPU 厂商的对应设备插件。

一旦你安装了插件,你的集群就会暴露一个自定义可调度的资源,例如 amd.com/gpunvidia.com/gpu

你可以通过请求这个自定义的 GPU 资源在你的容器中使用这些 GPU,其请求方式与请求 cpumemory 时相同。 不过,在如何指定自定义设备的资源请求方面存在一些限制。

  • GPU 只能在 limits 部分指定,这意味着:
    • 你可以指定 GPU 的 limits 而不指定其 requests,因为 Kubernetes 将默认使用限制 值作为请求值。
    • 你可以同时指定 limitsrequests,不过这两个值必须相等。
    • 你不可以仅指定 requests 而不指定 limits

以下是一个 Pod 请求 GPU 的示例清单:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: example-vector-add
  5. spec:
  6. restartPolicy: OnFailure
  7. containers:
  8. - name: example-vector-add
  9. image: "registry.example/example-vector-add:v42"
  10. resources:
  11. limits:
  12. gpu-vendor.example/example-gpu: 1 # 请求 1 个 GPU

集群内存在不同类型的 GPU

如果集群内部的不同节点上有不同类型的 NVIDIA GPU, 那么你可以使用节点标签和节点选择器来将 Pod 调度到合适的节点上。

例如:

  1. # 为你的节点加上它们所拥有的加速器类型的标签
  2. kubectl label nodes node1 accelerator=example-gpu-x100
  3. kubectl label nodes node2 accelerator=other-gpu-k915

这个标签键 accelerator 只是一个例子;如果你愿意,可以使用不同的标签键。

自动节点标签

如果你在使用 AMD GPU,你可以部署 Node Labeller, 它是一个 控制器, 会自动给节点打上 GPU 设备属性标签。目前支持的属性:

  • 设备 ID (-device-id)
  • VRAM 大小 (-vram)
  • SIMD 数量(-simd-count)
  • 计算单位数量(-cu-count)
  • 固件和特性版本 (-firmware)
  • GPU 系列,两个字母的首字母缩写(-family)
    • SI - Southern Islands
    • CI - Sea Islands
    • KV - Kaveri
    • VI - Volcanic Islands
    • CZ - Carrizo
    • AI - Arctic Islands
    • RV - Raven
  1. kubectl describe node cluster-node-23
  1. Name: cluster-node-23
  2. Roles: <none>
  3. Labels: beta.amd.com/gpu.cu-count.64=1
  4. beta.amd.com/gpu.device-id.6860=1
  5. beta.amd.com/gpu.family.AI=1
  6. beta.amd.com/gpu.simd-count.256=1
  7. beta.amd.com/gpu.vram.16G=1
  8. kubernetes.io/arch=amd64
  9. kubernetes.io/os=linux
  10. kubernetes.io/hostname=cluster-node-23
  11. Annotations: node.alpha.kubernetes.io/ttl: 0

使用了 Node Labeller 的时候,你可以在 Pod 的规约中指定 GPU 的类型:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: cuda-vector-add
  5. spec:
  6. restartPolicy: OnFailure
  7. containers:
  8. - name: cuda-vector-add
  9. # https://github.com/kubernetes/kubernetes/blob/v1.7.11/test/images/nvidia-cuda/Dockerfile
  10. image: "registry.k8s.io/cuda-vector-add:v0.1"
  11. resources:
  12. limits:
  13. nvidia.com/gpu: 1
  14. affinity:
  15. nodeAffinity:
  16. requiredDuringSchedulingIgnoredDuringExecution:
  17. nodeSelectorTerms:
  18. matchExpressions:
  19. key: beta.amd.com/gpu.family.AI # Arctic Islands GPU 系列
  20. operator: Exist

这能够保证 Pod 能够被调度到你所指定类型的 GPU 的节点上去。