日期:2026-07-17
这个项目里我们当时接的是一个典型的信创私有化交付:某政务单位要求在国产化环境里跑我们采用的 X 技术平台底座,承载内部的智能问答与文档辅助场景。麻烦从第一天就来了——客户现场不是一块干净的单一算力,而是好几代国产 CPU 和不同厂商的国产 GPU 混在一起,指令集、驱动版本、显存规格各不一样。更棘手的是,框架兼容性差:有些推理框架在这块卡上能跑,换一块就报底层的算子不支持;张量并行在这种异构拓扑下也容易因为节点间带宽不一致而掉速。
我们最初想"有多少卡就直接编进去",结果第一周就踩坑:一个任务调度到某型号 GPU 节点后,因为驱动不匹配直接把整批推理卡死,连带影响了同节点上另一个业务线的请求。这件事让我们意识到,信创异构环境下最贵的不是算力本身,而是"不可预期"。如果我们不能先把杂乱的算力统一抽象出来,再谈调度和优化,后面每一次扩容都是在放大不确定性。
围绕"池化—调度—适配—隔离"四个动作,我们在这个项目里落地了三块核心场景。
第一是信创异构算力池化。我们对现场所有国产 CPU/GPU 节点做资源建模,把 CPU 核数、GPU 型号、显存、NVLink/PCIe 拓扑、驱动版本等抽象成统一的资源描述,注册进算力调度监控层。这样上层调度不再关心"这是哪家的卡",只关心"这块资源能不能满足这个任务的形状"。
第二是统一调度与任务排队。我们按任务形状(如张量并行度、连续批处理期望批大小、KV 缓存占用)做最优放置,并把突发请求放进优先级队列,避免大任务长期霸占稀缺的国产生成卡。弹性扩缩容策略也基于 Prometheus+Grafana 采集的利用率与排队时延动态触发。
第三是框架适配与故障隔离。我们把模型服务化层(vLLM/TGI 风格)按"驱动—算子—框架"三层做适配矩阵,并在调度层做故障域划分:同一故障域的节点共享风险(如同一驱动批次、同一机柜供电),任务尽量打散到不同故障域,单点故障不影响全局。
挑战一:异构算力统一纳管。 国产卡型号杂、能力差异大,直接裸调度会导致任务"漂"到不合适节点。我们的思路是先做能力画像再抽象:为每种卡型建立算力画像(FP16 算力、显存带宽、算子支持白名单),调度时把任务需求与画像做匹配,只有满足最小约束的节点才进入候选。资源描述统一用一套 schema,屏蔽厂商差异,调度器看到的永远是标准化的"资源槽"。
挑战二:框架与驱动适配。 信创环境下同一个模型在不同卡上可能要不同的编译选项和算子回退路径。我们把适配前移成"准入验证":新节点入池前必须跑过一组标准探针(启动、单请求延迟、张量并行自检、长上下文稳定性),探针不过不准接生产流量。同时维护一份适配矩阵文档,框架版本、驱动版本、卡型三者锁定组合,避免"能跑但偶发崩"的隐患。
挑战三:故障域隔离与任务排队。 异构环境里某个驱动批次或机柜的共因故障很常见。我们按"机柜 + 驱动批次 + 供电"划分故障域,调度时强制把同一任务的副本和关联批处理分散到不同故障域;同时对稀缺生成卡做配额排队,长任务切片提交,超过排队时延阈值的任务自动降级到空闲的推理一体机或 CPU 兜底,保证不饿死。
挑战四:可观测与弹性闭环。 利用率低了要能扩,抖动大了要能缩。我们把 GPU 池化指标、任务排队时延、故障域健康度全部接入监控看板,并让网关限流信号反向驱动底座扩缩容,形成算力—流量联动。信创现场常有突发批量导入,这套闭环把"人工救火"变成了"策略自愈"。
这个信创项目交付约一个季度后,我们在脱敏示意口径下统计了关键指标,上线前(以最初裸调度阶段为基线)与上线后的对比如下:
| 指标 | 上线前(示意) | 上线后(示意) | 变化 |
|---|---|---|---|
| 算力利用率 | 约 38% | 提升至 约 71% | 明显提升 |
| 任务排队时延(P95) | 约 8 分钟 | 降至 约 90 秒 | 大幅缩短 |
| 故障域隔离数 | 基本无隔离 | 划分 约 6 个故障域 | 新增 |
| 单次部署周期 | 约 2 周(人工适配) | 降至 约 3 天 | 明显缩短 |
从现场运维口径看,因单点驱动或机柜共因故障导致的全局推理中断,从交付前几乎每月一次,降到了交付后一个季度内零次。弹性扩缩容把闲时算力回收,整体电费与机柜占用也跟着下来了。
案例片段(已脱敏): 算力调度节点配置(节选):
yaml nodePool: - id: node-a100-cn vendor: "domestic_gpu_v1" gpuMemGB: 32 fp16TFLOPS: 70 driver: "v2.3.1" faultDomain: FD-01 opsWhitelist: [matmul, attention, layernorm] - id: node-cpu-arm arch: "arm64" cores: 128 faultDomain: FD-04 scheduler: placement: matchProfile: true # 任务形状匹配算力画像 spreadAcrossFaultDomain: true queue: priorityTiers: [realtime, batch] maxWaitSec: 90 fallbackTo: [node-cpu-arm] # 超时降级兜底 autoscale: metric: gpu_util target: 0.7 minNodes: 2 maxNodes: 8节点准入探针日志(节选):
[probe] node-a100-cn join pool ... [probe] startup OK, single-req p50=38ms [probe] tp=4 self-check OK [probe] long-ctx 32k stability OK [probe] WARN driver v2.3.1 matched matrix, admitted
信创异构算力这条线,我们踩过的坑基本都指向同一个 lesson:异构先统一抽象再调度,适配验证前置。
第一,抽象先行。别急着把卡编进集群,先把每块算力的能力画像和资源 schema 标准化。调度器只认标准资源槽,厂商差异被挡在抽象层之下,后续扩容、换型才不至于推倒重来。
第二,适配验证必须前置成"准入"。信创环境最怕"能跑但偶发崩",所以新节点入池前跑标准探针、框架-驱动-卡型三者锁定组合,是性价比最高的防坑手段。我们甚至把它写进了交付 checklist,不通过不准接生产。
第三,故障域隔离是异构环境的刚需。国产设备批次差异、机柜共因故障在信创现场很普遍,按"机柜+驱动批次+供电"划故障域并强制打散,能把一次局部故障拦在局部。
第四,把排队、降级、弹性扩缩容做成策略而非人工操作。稀缺国产生成卡要配额排队、长任务切片、超时降级兜底,配合监控闭环,才能把利用率和稳定性同时拉起来。我们采用的 X 技术平台在算力调度监控层预留的弹性接口,让这套策略落地比较顺。