一台 8 卡机器,训练任务排队到天亮,推理服务却只吃掉半张卡——这是典型的调度失效,不是算力不足。按整卡分配是最简单的策略,也是浪费最严重的策略:单卡利用率常常只有 40%,剩下 60% 被”占着不用”。
为什么整卡分配会浪费一半算力?
因为负载的形状和卡的形状不匹配。训练任务通常能吃满整卡,但推理服务、数据预处理、小模型微调这些任务的资源需求是碎片化的:可能只需要 8GB 显存、2 个 CPU 核、偶尔一次前向计算。按整卡分配时,这些任务各占一张卡,卡上其余部分闲置。
结果就是:集群看起来卡都分配出去了,实际算力利用率却很低。监控面板上”GPU 已分配 100%”和”GPU 实际利用 40%”同时成立,这不是矛盾,是分配粒度过粗。
切分方案怎么选?
四种常见粒度,适合不同场景,代价各不相同。
| 方案 | 隔离强度 | 适用场景 | 主要代价 |
|---|---|---|---|
| 整卡独占 | 最强 | 大模型训练、对延迟敏感的推理 | 利用率低 |
| MIG 硬件切分 | 强 | 多租户推理、稳定的小模型服务 | 切分粒度固定,不能动态调整 |
| 显存切分(软件) | 弱 | 开发调试、短任务 | 故障会扩散到同卡其他任务 |
| 时间片轮转 | 中 | 批处理任务 | 上下文切换开销,延迟不稳定 |
实践中常见组合是:训练走整卡或 MIG 大切片,推理走 MIG 小切片,开发环境用软件切分但限制在独立节点上。
切分带来的隔离风险有多严重?
比多数人预期的严重。软件层显存切分只是”约定”,不是硬件强制:一个任务显存越界,可能触发整卡重置,同卡其他任务全部中断。这在多租户环境里是不可接受的。
三层隔离要一起做:硬件层用 MIG 做物理切分,边界由硬件保证;系统层用 cgroup 限制 CPU、内存与进程数;驱动层开启错误隔离,让单个进程的异常不扩散。缺任何一层,故障都会穿透到邻居。
调度策略应该怎么定?
- 按实测性能分级,不按型号:同型号卡因散热与功耗墙差异,实测性能可能差 15%。建基准表,按实测值分配。
- 给碎片任务设专用池:不要让小任务和大训练抢同一批卡,物理隔离比调度算法更可靠。
- 设置抢占与回收:低优先级任务可被高优先级抢占,但要有检查点机制,避免抢占等于重跑。
- 把利用率作为考核指标:只看”分配率”会掩盖浪费,必须同时看实际计算利用率与显存占用率。
小规模集群(十台以内)需要做这么复杂吗?
不需要全套,但两件事值得做:一是开启 MIG 把推理和训练物理隔开,二是建立任务排队与优先级,避免”谁先提交谁占卡”。十台以内的集群,管理成本主要来自人的协调,而不是技术复杂度。
利用率提到多少算合理?
视负载结构而定。以推理为主、切分合理的集群,实际计算利用率做到 60% 到 70% 是可达的;以训练为主则通常低于 50%,因为训练本身存在数据加载与通信等待。低于 30% 说明分配粒度过粗或存在资源囤积,需要排查。
发表回复