调度 GPU
Kubernetes v1.26 [stable]
Kubernetes 通过使用设备插件,提供了稳定支持,用于管理集群中不同节点上的 AMD 和 NVIDIA GPU(图形处理器)。
本页面描述了用户如何使用 GPU,并概述了实现中的一些限制。
使用设备插件
Kubernetes 实现设备插件是为了让 Pod 能够访问 GPU 等专用硬件特性。
作为管理员,你必须在节点上安装相应硬件供应商提供的 GPU 驱动程序,并运行 GPU 供应商提供的相应设备插件。以下是一些供应商说明的链接:
安装插件后,你的集群会暴露一个自定义的可调度资源,例如 amd.com/gpu
或 nvidia.com/gpu
。
你可以通过请求自定义 GPU 资源来在容器中使用这些 GPU,就像你请求 cpu
或 memory
一样。然而,在指定自定义设备的资源需求方面存在一些限制。
GPU 只能在 limits
部分中指定,这意味着:
- 你可以在不指定
requests
的情况下指定 GPUlimits
,因为 Kubernetes 默认会将 limit 用作 request 的值。 - 你可以在
limits
和requests
中都指定 GPU,但这两个值必须相等。 - 你不能在不指定
limits
的情况下指定 GPUrequests
。
以下是一个请求 GPU 的 Pod 的 manifest 示例:
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 网站指南。
在提出添加额外第三方链接的更改之前,你应该阅读内容指南。