在 Kubernetes 上部署扩散模型,在处理标准 CPU 工作负载之外,会带来一些特定要求。去噪过程的计算密集型特性要求使用专用硬件,主要是图形处理单元(GPU)。仅仅在集群节点中拥有 GPU 硬件是不够的;Kubernetes 需要一种方式来识别、管理并将这些资源分配给需要它们的 Pod。启用 GPU 感知:设备插件框架原生的 Kubernetes 不自带感知供应商专用硬件,如 GPU。为了解决此问题,Kubernetes 提供了一个设备插件框架。此框架允许硬件供应商(如 NVIDIA 或 AMD)或第三方开发插件,这些插件运行在每个节点上,检测特定硬件资源(例如 GPU),向 Kubelet(主要节点代理)报告其可用性,并管理其对容器的分配。对于 NVIDIA GPU,最常用的方案是适用于 Kubernetes 的 NVIDIA 设备插件。此插件自动识别节点上可用的 NVIDIA GPU 数量和类型,并将其作为 Kubernetes 集群内的可调度资源暴露。安装 NVIDIA 设备插件安装通常涉及部署一个 DaemonSet。DaemonSet 确保设备插件 Pod 的一个副本在集群中的每个(或选定子集)节点上运行。这使得每个能够运行 GPU 工作负载的节点都能报告其 GPU 资源。安装方式会因您的集群环境(如 EKS、GKE、AKS 等托管式云 Kubernetes,或自管理集群)而略有差异,但通常是应用 NVIDIA 提供的 YAML 清单。例如,使用 kubectl:# 示例命令,请参考 NVIDIA 官方文档获取最新的清单 kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.15.1/nvidia-device-plugin.yml在安装插件之前,请确保您的 GPU 节点主机操作系统上已安装相应的 NVIDIA 驱动程序。设备插件依赖于这些驱动程序与硬件通信。主机操作系统、容器镜像中使用的 CUDA 工具包版本以及 GPU 硬件本身的驱动程序兼容性是一个重要方面。在 Pod 规范中请求 GPU 资源一旦设备插件运行并已向 Kubernetes API 服务器注册了 GPU 资源,您就可以在 Pod 规范中请求 GPU,这很像请求 CPU 或内存。资源名称通常是供应商专有的,对于 NVIDIA GPU,它是 nvidia.com/gpu。这里是一个 Deployment 清单的示例片段,它为其容器请求一个 NVIDIA GPU:apiVersion: apps/v1 kind: Deployment metadata: name: diffusion-worker spec: replicas: 3 selector: matchLabels: app: diffusion-worker template: metadata: labels: app: diffusion-worker spec: containers: - name: diffusion-container image: your-registry/your-diffusion-app:latest resources: limits: nvidia.com/gpu: 1 # 请求 1 个 NVIDIA GPU requests: nvidia.com/gpu: 1 # 可选,但如果设置了 limits,则建议也设置 requests # ... 其他容器配置 (端口、环境变量等)当此 Pod 被调度时,Kubernetes 调度器将只考虑拥有至少一个 nvidia.com/gpu 资源且该资源可用且未分配的节点。所选节点上的 Kubelet 通过与设备插件协作,会将一个特定的 GPU 设备分配给容器,并使其在容器环境中可用(通常通过设备挂载)。隔离 GPU 工作负载:标签、污点和容忍度在许多生产环境中,将特定节点专门用于 GPU 工作负载是一种期望的做法,以提升资源利用率并降低成本,并阻止非 GPU 工作负载占用昂贵的 GPU 实例上的资源。Kubernetes 为此提供了多种方式:节点标签: 您可以为您的 GPU 节点应用自定义标签。例如:kubectl label node <您的 GPU 节点名称> hardware-type=nvidia-gpu。节点选择器/亲和性: 在您的 Pod 规范中,您可以使用 nodeSelector 或更复杂的 nodeAffinity 规则,以确保您的扩散模型 Pod 只被调度到带有 hardware-type=nvidia-gpu 标签的节点上。# 使用 nodeSelector 的示例 spec: nodeSelector: hardware-type: nvidia-gpu containers: # ... 容器规范如上污点和容忍度: 为避免非 GPU 工作负载被调度到昂贵的 GPU 节点上,您可以为 GPU 节点“标记污点”。污点会排斥 Pod,除非 Pod 具有匹配的“容忍度”。标记 GPU 节点污点:kubectl taint nodes <您的 GPU 节点名称> nvidia.com/gpu=present:NoSchedule为您的 GPU Pod 规范添加容忍度:spec: tolerations: - "nvidia.com/gpu" operator: "Exists" effect: "NoSchedule" containers: # ... 容器规范如上,包括 GPU 请求这种组合确保只有明确请求 GPU 并 容忍 nvidia.com/gpu 污点的 Pod 才会被调度到 GPU 节点上。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="Arial", fontsize=10, color="#adb5bd", fontcolor="#495057"]; edge [fontname="Arial", fontsize=9, color="#868e96"]; subgraph cluster_kube { label = "Kubernetes 控制平面"; bgcolor="#e9ecef"; Scheduler [label="调度器"]; APIServer [label="API 服务器"]; } subgraph cluster_nodes { label = "工作节点"; bgcolor="#e9ecef"; subgraph cluster_gpu_node { label = "GPU 节点\n标签: hardware-type=nvidia-gpu\n污点: nvidia.com/gpu=present:NoSchedule"; bgcolor="#d0bfff"; // violet shade Kubelet_GPU [label="Kubelet"]; DevicePlugin [label="NVIDIA 设备插件", shape=cylinder, color="#7048e8"]; // Darker violet GPU [label="GPU 硬件", shape=component, color="#9775fa"]; // Lighter violet Pod_GPU [label="扩散 Pod\n请求: nvidia.com/gpu: 1\n容忍: nvidia.com/gpu", color="#7048e8", fontcolor="#ffffff"]; // Darker violet Kubelet_GPU -> DevicePlugin [label="管理"]; DevicePlugin -> GPU [label="检测与分配"]; DevicePlugin -> Kubelet_GPU [label="报告资源"]; Kubelet_GPU -> Pod_GPU [label="分配 GPU"]; } subgraph cluster_cpu_node { label = "CPU 节点"; bgcolor="#a5d8ff"; // blue shade Kubelet_CPU [label="Kubelet"]; Pod_CPU [label="其他 Pod", color="#1c7ed6", fontcolor="#ffffff"]; // Darker blue Kubelet_CPU -> Pod_CPU [label="管理"]; } } Scheduler -> Kubelet_GPU [label="分配 GPU Pod(容忍污点,匹配选择器)"]; Scheduler -> Kubelet_CPU [label="分配 CPU Pod"]; Kubelet_GPU -> APIServer [label="报告状态"]; Kubelet_CPU -> APIServer [label="报告状态"]; label="Kubernetes GPU 节点管理"; fontsize=12; fontcolor="#495057"; }此图描绘了 Kubernetes 调度器如何根据 GPU 需求、节点标签、污点和容忍度分配 Pod,并由 NVIDIA 设备插件提供支持。GPU 节点管理的注意事项驱动一致性: 请确保主机节点上的 NVIDIA 驱动程序与容器内使用的 CUDA 版本以及设备插件版本兼容。不匹配是导致问题的原因之一。资源监控: 使用与设备插件兼容的工具(例如,使用 dcgm-exporter 的 Prometheus)监控节点上的 GPU 利用率、内存使用情况和温度。这对于识别性能瓶颈和支持自动扩缩容决策很有帮助。多实例 GPU (MIG): 对于较新的 NVIDIA 架构(如 A100),MIG 支持将单个物理 GPU 划分为多个更小、完全隔离的 GPU 实例。NVIDIA 设备插件支持 MIG,从而实现更细粒度的资源分配,适用于不需要整个 GPU 的工作负载,有望提高利用率并降低成本。配置时需要特定的节点设置和 Pod 规范中相应的资源请求(例如,nvidia.com/mig-1g.5gb: 1)。更新与维护: 更新 GPU 驱动程序或设备插件通常需要仔细协调,可能涉及排空节点,以减少对正在运行的推理服务的影响。在 Kubernetes 中有效管理 GPU 节点,对于可靠且高效地部署扩散模型来说非常重要。通过使用设备插件、资源请求、标签、污点和容忍度,您可以对调度进行精确控制,以确保您的计算密集型生成工作负载能够获取所需硬件资源,同时优化集群利用率。这为构建可扩展且高效益的推理基础设施创造了条件。