调度 GPU

配置和调度 GPU,以便在集群中的节点上将其用作资源。
功能状态: Kubernetes v1.26 [稳定]

Kubernetes 包含对跨集群中不同节点管理 AMD 和 NVIDIA GPU(图形处理单元)的稳定支持,使用 设备插件

本页描述了用户如何使用 GPU,并概述了实现中的一些限制。

使用设备插件

Kubernetes 实现设备插件,允许 Pod 访问诸如 GPU 之类的专用硬件功能。

作为管理员,您必须从相应的硬件供应商处在节点上安装 GPU 驱动程序,并运行来自 GPU 供应商的相应设备插件。以下是一些指向供应商说明的链接

安装插件后,您的集群会公开一个可调度的自定义资源,例如 amd.com/gpunvidia.com/gpu

您可以通过请求自定义 GPU 资源来在容器中使用这些 GPU,就像您请求 cpumemory 一样。但是,在指定自定义设备的资源需求时,存在一些限制。

GPU 应该仅指定在 limits 部分中,这意味着

  • 您可以指定 GPU limits 而不指定 requests,因为 Kubernetes 默认会将限制作为请求值使用。
  • 您可以在 limitsrequests 中都指定 GPU,但这两个值必须相等。
  • 您不能在不指定 limits 的情况下指定 GPU requests

这是一个请求 GPU 的 Pod 清单示例

apiVersion: v1
kind: Pod
metadata:
  name: example-vector-add
spec:
  restartPolicy: OnFailure
  containers:
    - name: example-vector-add
      image: "registry.example/example-vector-add:v42"
      resources:
        limits:
          gpu-vendor.example/example-gpu: 1 # requesting 1 GPU

管理具有不同类型 GPU 的集群

如果集群中的不同节点具有不同类型的 GPU,则可以使用 节点标签和节点选择器 将 Pod 调度到适当的节点。

例如

# Label your nodes with the accelerator type they have.
kubectl label nodes node1 accelerator=example-gpu-x100
kubectl label nodes node2 accelerator=other-gpu-k915

该标签键 accelerator 只是一个示例;如果您愿意,可以使用不同的标签键。

自动节点标记

作为管理员,您可以通过部署 Kubernetes 节点功能发现 (NFD) 来自动发现和标记所有启用了 GPU 的节点。NFD 检测 Kubernetes 集群中每个节点上可用的硬件功能。通常,NFD 配置为将这些功能作为节点标签进行宣传,但 NFD 也可以添加扩展资源、注释和节点污点。NFD 与所有 受支持的 Kubernetes 版本 兼容。默认情况下,NFD 创建 功能标签 用于检测到的功能。管理员可以利用 NFD 还可以使用特定功能对节点进行污点标记,以便只有请求这些功能的 Pod 才能被调度到这些节点上。

您还需要一个 NFD 插件,该插件为您的节点添加适当的标签;这些标签可以是通用的,也可以是供应商特定的。您的 GPU 供应商可能会提供 NFD 的第三方插件;请查阅他们的文档以获取更多详细信息。

apiVersion: v1
kind: Pod
metadata:
  name: example-vector-add
spec:
  restartPolicy: OnFailure
  # You can use Kubernetes node affinity to schedule this Pod onto a node
  # that provides the kind of GPU that its container needs in order to work
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: "gpu.gpu-vendor.example/installed-memory"
            operator: Gt # (greater than)
            values: ["40535"]
          - key: "feature.node.kubernetes.io/pci-10.present" # NFD Feature label
            values: ["true"] # (optional) only schedule on nodes with PCI device 10
  containers:
    - name: example-vector-add
      image: "registry.example/example-vector-add:v42"
      resources:
        limits:
          gpu-vendor.example/example-gpu: 1 # requesting 1 GPU

GPU 供应商实现

此页面上的项目引用了提供 Kubernetes 所需功能的第三方产品或项目。Kubernetes 项目作者不对这些第三方产品或项目负责。请参阅 CNCF 网站指南 以获取更多详细信息。

在提出添加额外的第三方链接的更改之前,您应该阅读 内容指南

上次修改时间:2024 年 9 月 20 日下午 8:33 PST:更新 AMD GPU 设备插件的链接 (8f2d5571cc)