大模型推理在线与离线混部与算力复用落地

日期:2026-08-28

一、项目背景

我们在线推理白天吃满 GPU,后半夜空转;离线批处理训练式推理另起炉灶排队等卡。两边各买各的卡,财务一看利用率报表就皱眉。我们进场时,在线和离线是两套资源池,谁也不借谁,整体利用率常年三成出头。

更尴尬的是预算博弈。在线团队怕峰值不够,按最高水位买卡;离线团队怕排不上,也按自己的峰值买。两边峰值错开,加起来买的卡远超实际并发需求,机房电费和折旧却实打实。财务说,你们这叫重复建设,钱花在闲置上。

二、落地场景

我们把在线和离线推理塞进同一个资源池,在线拿高优先级,离线当填充。在线高峰时离线任务被抢占驱逐,低谷时离线碎片任务把空卡填满。配额按部门隔离,离线显存设上限,不让它挤爆在线。混部稳定性靠隔离和监控兜底。

运营端能看实时混部大盘,在线占用、离线填充、空闲三块颜色分明。离线团队提交任务时标优先级,系统自动挑碎片时段塞。资源紧张时,低优先级离线自动挂起,等在线松了再续。财务终于有了一张能解释钱花哪了的报表。

三、关键技术挑战与解决思路

混部最怕互相踩。我们试过直接共享,离线碎片任务把显存打满,在线推理一上来没地方放,尾延迟飙了三倍。后来给离线显存设硬上限,在线永远留足余量才稳。抢占驱逐也有讲究,不能一刀切,我们按优先级分级,只驱逐最低优先级离线,且给优雅退出时间,避免任务半途废掉重算。隔离层面,我们用 cgroup 加显存配额双保险,监控实时看在线尾延迟,一旦越线立刻收紧离线。

离线任务的碎片填充也不能太碎。早期把离线切成极小块塞缝,结果调度开销比计算还大,离线吞吐没起来反而更慢。我们后来设了最小粒度,只填大于阈值的空闲窗口,调度开销可控。驱逐后的状态保存也重要,离线任务挂起要能从中断点续,否则反复重算抵消了混部收益。

案例片段(已脱敏): 混部配额与抢占的核心配置:yaml pool:  unified: true  online_priority: high  offline_fill: true quota:  offline_max_vram_ratio: 0.4  online_reserve_vram: always preempt:  level: priority  graceful_exit_sec: 30  min_fill_granularity: medium monitor:  online_p99_latency_alert: true上线后整体 GPU 利用率从约三成五升到六成五,离线吞吐因为填了碎片时段反而涨了约四成,在线尾延迟只比独占时高约一成,驱逐频率控制在每天个位数。

四、效果数据

整体 GPU 利用率从约三成五升到六成五,空转的钱省回来了。离线吞吐因为填了碎片时段,反而涨了约四成,原本排队的任务更快跑完。在线尾延迟只比独占时高约一成,用户基本无感。驱逐频率控制在每天个位数,离线任务虽被打断但不废,重算少。财务第一次在报表上看到利用率过六成,没再追着我们要卡,下一季预算反而砍了下来。

混部还顺带解决了离线团队的排队焦虑。以前离线任务排几天等不到卡,催也催不动。现在碎片时段自动填,长任务也切成能塞的块,等待时间从以天计降到以小时计。离线团队终于不再把在线当抢资源的对头。

财务那边最买账的是一张新报表,把每张卡的在线占用、离线填充、真空闲分三色。以前只有总利用率一个模糊数,现在钱花哪了清清楚楚。下一季采购,老板直接按混部后的真实缺口砍了三分之一的卡,省下的钱够再招两个人。

混部稳定运行一个季度后,我们复盘发现一个意外收获,离线团队的作业习惯被改好了。以前排长任务怕被打断,喜欢一次性提交超大批次,现在知道碎片时段能填,反而愿意把任务拆小,调度更灵活,整体吞吐又涨了一截。系统的约束反过来塑造了使用者的行为,这比加规则管用。

运维侧的心智负担也轻了。以前两套资源池两套监控,半夜谁告警都不知道归谁。现在一张混部大盘,在线和离线一眼分清,告警也带优先级,在线相关才电话,离线相关次日处理。值班同学说,终于不用半夜被离线任务的无关告警吵醒了,这也算混部带来的幸福感。

混部上线后我们还顺手做了成本核算的归口。在线和离线各占多少卡、折算成多少钱,清清楚楚,月底给业务方出账单不再扯皮。成本可见之后,离线团队反而更珍惜碎片算力,闲时就主动多跑批,复用率比强制调度还高,算账这个动作意外地成了最好的调度器。

五、可复用经验总结

混部听着是省钱妙招,落地全是细节,离线显存硬上限和在线常驻余量是两根定海神针,我们当初没设限,在线被挤爆的教训够记一辈子。抢占要优雅,给离线退出时间比硬杀更省,否则任务废掉重算比不混部还亏。监控必须盯在线尾延迟,别只看平均,平均好看尾延迟炸了用户照样骂。离线填充要设最小粒度,太碎调度开销反噬。说到底,混部省的不是卡,是把空转那部分算力从报表里抠出来,这一步做对,采购预算能砍一大截。