Kubernetes GPU 调度机制

Kubernetes GPU 调度机制

Kubernetes 支持通过特定的调度机制实现对 GPU 资源的高效利用,具体来说可以通过 Device Plugin 的机制,让 Pod 可以访问类似 GPU 这类特殊的硬件功能特性。你安装了插件,你的集群就会暴露一个自定义可调度的资源,例如 amd.com/gpu 或 nvidia.com/gpu,之后就可以通过一些常用机制来满足调度需求。

值得说明的是,像 NVIDIA Device Plugin 都是以 DaemonSet 形式运行在 Node 上。

N 种调度模式

通过 Limits

你可以通过请求这个自定义的 GPU 资源在你的容器中使用这些 GPU,其请求方式与请求 CPU 或 Memory 时相同,在 limits 中指定

apiVersion: v1
kind: Pod
metadata:
  name: gpu-pod
spec:
  containers:
  - name: cuda-container
    image: nvidia/cuda:11.0-base
    resources:
      limits:
        nvidia.com/gpu: 1  # 请求 1 个 GPU

Kubernetes 的 GPU 调度流程包括以下几个步骤:

  1. 节点注册:每个节点上的 NVIDIA Device Plugin 会向 Kubernetes 报告可用的 GPU 资源。
  2. 资源请求:用户在 Pod 配置文件中声明所需的 GPU 资源。
  3. 调度器决策:Kubernetes 调度器根据节点的可用 GPU 资源和 Pod 的需求,选择合适的节点。
  4. 资源分配:调度器将 Pod 绑定到目标节点,并通过 Device Plugin 分配 GPU 资源。
  5. 容器启动:Pod 中的容器启动后,可以通过 CUDA 库访问分配的 GPU 资源。

通过亲和调度

你可以通过部署 Kubernetes Node Feature Discovery (NFD) 来自动发现所有启用 GPU 的节点并为其打标签,在调度的时候就可以通过 nodeSelector 实现亲和调度,从而将 Pod 调度到特定的 GPU 节点。

apiVersion: v1
kind: Pod
metadata:
  name: example-vector-add
spec:
  restartPolicy: OnFailure
  # 你可以使用 Kubernetes 节点亲和性将此 Pod 调度到提供其容器所需的那种 GPU 的节点上
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: "gpu.gpu-vendor.example/installed-memory"
            operator: Gt #(大于)
            values: ["40535"]
          - key: "feature.node.kubernetes.io/pci-10.present" # NFD 特性标签
            values: ["true"] #(可选)仅调度到具有 PCI 设备 10 的节点上
  containers:
    - name: example-vector-add
      image: "registry.example/example-vector-add:v42"
      resources:
        limits:
          gpu-vendor.example/example-gpu: 1 # 请求 1 个 GPU

GPU 资源监控

Kubernetes GPU 监控可以通过多种工具实现,包括 NVIDIA DCGM Exporter、Prometheus、Grafana 和 NVIDIA GPU Operator。这些工具可以帮助用户实时监控 GPU 资源的使用情况,优化资源分配,并快速定位性能问题。根据具体需求,用户可以选择合适的工具或组合使用多种工具,构建完整的 GPU 监控体系。

常见问题及优化方案

GPU Sharing

GPU 共享模式可以通过以下几种技术实现:

  1. 时间片轮转(Time-Slicing)
    原理:将 GPU 的计算资源按时间片分配给不同的任务。每个任务在指定的时间片内独占 GPU,时间片结束后切换到下一个任务。优点:实现简单,适用于任务计算量较小且对延迟不敏感的场景。缺点:任务切换会引入一定的开销,可能影响性能。

  2. 多实例 GPU(Multi-Instance GPU, MIG)
    原理:将物理 GPU 划分为多个独立的实例,每个实例可以分配给不同的任务。每个实例拥有独立的计算单元、显存和带宽。优点:资源隔离性好,适合需要严格资源隔离的场景(如多租户环境)。缺点:需要硬件支持(如 NVIDIA A100 GPU),且划分后的实例资源固定,灵活性较低。

  3. 虚拟化技术(GPU Virtualization)
    原理:通过虚拟化技术(如 NVIDIA vGPU、AMD MxGPU)将 GPU 资源虚拟化为多个虚拟 GPU,每个虚拟 GPU 可以分配给不同的虚拟机或容器。优点:支持多租户环境,资源分配灵活。缺点:需要特定的硬件和软件支持,且虚拟化会引入一定的性能开销。

实现 GPU Sharing 的工具平台

以下是一些支持 GPU 共享模式的工具和平台:

NVIDIA vGPU:适用于虚拟化环境,支持多用户共享 GPU。

NVIDIA MIG:适用于需要严格资源隔离的场景。

Kubernetes 与 Device Plugin:通过 Kubernetes 的调度机制实现 GPU 共享。

Slurm:在高性能计算环境中支持 GPU 资源共享。

相关说明

kubernetes gpu schedule
https://kubernetes.io/zh-cn/docs/tasks/manage-gpus/scheduling-gpus/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值