GPU集群基础:GPU集群架构、资源类型与任务类型

在讨论任务优先级调度之前,必须先建立对GPU集群底层模型的统一认知。调度器面对的不是抽象的“算力”,而是由异构硬件、分层资源、多样任务共同构成的复杂系统。本节从三个维度拆解GPU集群:物理架构如何组织、资源以何种粒度被描述与分配、任务以何种形态被提交与执行。

2.1 GPU集群的物理与逻辑架构

一个生产级GPU集群通常采用“接入层—计算层—存储层”的三层物理拓扑,但在调度视角下,更关键的是其逻辑分层结构。调度器并不直接操作GPU硬件,而是通过集群管理框架(如Kubernetes + Device Plugin、Slurm + GPU插件)与节点上的代理进程交互。

核心分层(自下而上):

  1. GPU设备层:物理GPU(如A100、H800、L40S),通过NVLink/NVSwitch连接形成GPU域。
  2. 节点层:一台物理服务器,包含若干GPU、CPU、内存、本地NVMe盘。节点是资源分配的最小边界单位。
  3. 分区/资源池层:由多个节点组成的逻辑集合,用于隔离不同业务线或不同SLA等级的任务。
  4. 集群调度层:全局调度器维护集群视图,执行排队、抢占、亲和性判断。
GPU集群逻辑分层架构与调度视图 GPU设备层 GPU 0 GPU 1 GPU 2 GPU 3 NVLink GPU 4 GPU 5 GPU 6 … 节点层(Node) CPU 核 96 vCPU 内存 1 TB DDR5 NVMe 盘 3.2 TB GPU 设备组(8卡) NVLink 全互联 / 域内带宽 600 GB/s node: gpu-01 分区 / 资源池层 分区A:在线推理池 分区B:训练开发池 分区C:高优紧急池 分区D:弹性抢占池 全局调度器(Scheduler) 队列管理 · 优先级裁决 · 抢占决策 · 亲和性调度 调度器视图: 节点资源总量 + 已分配量 + 排队任务 + 抢占候选

调度器维护的集群视图包含每个节点的可分配资源量、已分配资源量以及当前运行任务列表。当新任务到达时,调度器通过过滤(Filtering)找到满足资源需求的节点集合,再通过打分(Scoring)选出最优节点。这一过程发生在毫秒级,但决策质量直接影响集群整体吞吐。

2.2 资源类型:从整卡到细粒度切片

GPU集群中的资源描述经历了从“整卡分配”到“细粒度可分割”的演进。当前主流调度系统支持以下资源粒度:

资源粒度 描述方式 典型场景 调度复杂度
整卡(1 GPU) nvidia.com/gpu: 1 单卡训练、小模型推理 低
多卡整卡(N GPU) nvidia.com/gpu: 8 分布式训练(DDP/FSDP) 中(需考虑NVLink拓扑)
GPU切片(MIG / vGPU) nvidia.com/mig-1g.5gb: 2 推理服务隔离、开发调试 中高(需匹配实例类型)
显存+算力细分 显存: 20Gi + 算力: 30% 多租户共享、资源超卖 高(需隔离机制保障)

关键认知:在调度优先级设计中,资源粒度决定了“抢占”的代价。抢占一张整卡任务只需杀死进程;而抢占一个MIG切片可能需要先等待其上的推理请求排空,代价差异可达数量级。因此,优先级调度策略必须感知资源粒度。

除了GPU本身,调度器还需管理关联资源:CPU核数、内存大小、临时存储(用于checkpoint)、以及网络带宽(特别是多机训练时的RDMA/InfiniBand带宽)。一个常见的调度错误是只考虑GPU显存而忽略CPU内存配比,导致任务因CPU资源不足而长期排队。

2.3 任务类型:从交互式调试到长期训练

GPU集群上的任务形态差异极大,不同任务对调度器的要求截然不同。按生命周期和资源占用模式,可将任务分为以下四类:

  • 交互式调试任务(Interactive):用户通过Jupyter或SSH直接连接,生命周期从几分钟到几小时,资源占用波动大,需要快速启动,通常使用低优先级队列。
  • 批量训练任务(Batch Training):运行数小时到数天,资源占用稳定,需要多卡甚至多机,对抢占敏感(中途杀死会导致训练进度丢失)。
  • 在线推理任务(Online Inference):7×24小时常驻,对延迟极其敏感,资源占用相对稳定但存在毛刺,通常绑定固定资源并设置高优先级。
  • 弹性/Spot任务(Elastic/Spot):可随时被抢占,用于超参数搜索、数据预处理等容错场景,通常以极低优先级运行,填补集群碎片资源。

任务属性标签示例(调度器视角):

task-group: "llm-finetune"
  priority: 200          # 数值越大优先级越高
  preemptable: false     # 是否允许被抢占
  gpu-required: 32       # 需要32张GPU
  gpu-type: "A100-80G"
  node-affinity: "rack: r1"   # 机架亲和,减少跨机通信
  max-wait-time: 3600    # 最大排队时间(秒)
  checkpoint-interval: 600

调度器根据这些标签将任务放入不同队列,并决定其优先级。例如,在线推理任务通常具有最高优先级且不可抢占,而批量训练任务优先级中等但可被高优任务抢占(配合checkpoint机制恢复)。

2.4 案例:一个典型的多租户集群配置

假设某公司有一个32节点(每节点8张A100)的GPU集群,需要同时支持算法团队的训练任务、线上推理服务以及临时开发调试。合理的资源规划如下:

  1. 分区划分:将24个节点划入“训练分区”,4个节点划入“推理分区”,4个节点划入“开发分区”(其中2个节点同时允许被训练任务借用)。
  2. 队列配置:训练分区内设置“高优训练队列”(优先级500)和“普通训练队列”(优先级200);推理分区设置“在线推理队列”(优先级800,不可抢占)。
  3. 资源预留:推理分区保留30%的GPU算力作为突发流量缓冲,不参与调度分配。
  4. 抢占规则:当高优训练任务到达且资源不足时,允许抢占普通训练队列中运行超过2小时且已保存checkpoint的任务。

通过上述配置,集群在保障推理服务稳定性的同时,最大化训练资源的利用率。调度器每天处理的调度决策超过10万次,其中约15%涉及优先级比较或抢占判断。

2.5 常见误区与设计复盘

误区一:将所有GPU视为同质资源。实际集群中可能混有A100、H800、L40S等不同型号,其算力、显存、NVLink带宽差异巨大。若调度器不感知GPU型号,可能导致高优任务被调度到性能较差的GPU上,造成资源浪费。

误区二:忽略“资源碎片”对优先级的影响。一个高优任务需要8卡,但集群中只剩下3个节点各有2张空闲卡。此时即使该任务优先级很高,也只能等待。调度器应支持“碎片整理”或“等待-合并”策略,而非盲目按优先级插队。

误区三:抢占策略过于激进。某些团队为了保障高优任务,设置了“任何低优任务都可被抢占”的规则。结果导致大量训练任务频繁被杀,实际有效训练时间反而下降。合理的做法是设置最小运行时间保护(例如运行不足30分钟的任务不可被抢占),并配合checkpoint机制。