1. 项目概述:这不是在搭服务器,是在给大模型修一条高速公路
“大模型推理集群架构设计:从单卡推理到千卡负载均衡”——这个标题里藏着三个关键动作:“修路”(架构设计)、“提速”(单卡→千卡)、“分流”(负载均衡)。它不是讲怎么跑通一个LLM,而是解决当Qwen3.8-27B、Llama3-70B、Mixtral-8x22B这类参数量动辄数十B、显存占用轻松突破80GB的模型,要稳定服务上百并发请求、日均处理百万token、响应延迟压到300ms以内时,硬件、软件、调度、网络四层之间到底该怎么咬合。
我干这行十年,亲手部署过从RTX4090单卡跑Phi-3的个人工作站,到NVIDIA H100×128节点组成的金融风控推理集群。最深的体会是:单卡推理和千卡集群,根本不是同一类工程问题。前者关注的是“能不能跑起来”,后者考验的是“能不能不崩、不抖、不卡、不丢”。就像用自行车送快递和用高铁货运专列的区别——车轮都是橡胶的,但轨道、信号系统、编组逻辑、调度中心,全得重来。
标题里的“等开销负载均衡”不是个虚词。它直指当前行业最痛的盲区:很多团队花几千万买了H100,却用着Kubernetes默认的Round-Robin策略分发请求,结果发现70%的GPU显存常年空转,而30%的卡因处理长上下文请求持续满载,P99延迟飙升到2.3秒。这不是算力不够,是路没修对。
这篇内容适合三类人:
- 刚从微调转向部署的工程师:你已能用vLLM跑通Qwen3.8,但一加压就OOM或延迟抖动,需要知道瓶颈在哪一层;
- 负责采购与架构选型的技术负责人:面对“要不要上InfiniBand?RDMA必须配吗?NVLink拓扑怎么画?”这类问题,需要可落地的决策依据;
- 高校AI系统课讲师或高年级学生:想跳过“Hello World式部署”,真正理解工业级推理系统的数据流、控制流与资源流如何协同。
下面所有内容,都基于真实产线踩坑记录。没有理论推演,只有哪条命令改了之后P50延迟降了117ms,哪个拓扑调整让跨节点通信带宽从18GB/s提至32GB/s,以及为什么我们最终放弃了一度看好的Herdsman框架——这些细节,才是标题背后真正的干货。
2. 架构设计底层逻辑:为什么不能把单卡方案简单“堆叠”?
2.1 单卡推理的本质:一个封闭的确定性系统
先说清楚起点。当你在一台装有RTX4090的机器上用Ollama运行Llama3-8B,整个流程是线性的:
- 请求进API网关(如FastAPI)→
- 加载模型权重到显存(约16GB)→
- Tokenizer分词 →
- vLLM执行PagedAttention(显存页管理)→
- 输出生成结果。
这个过程的关键特征是强确定性:
- 显存容量固定(24GB),模型大小固定(16GB),剩余空间刚好够缓存KV Cache;
- 计算路径唯一,没有跨设备数据搬运;
- 延迟=预填充时间+解码时间,二者均可通过
nvidia-smi dmon -s u实测验证。
提示:很多新手误以为“单卡跑得快,多卡自然更快”,这是最大的认知陷阱。单卡的确定性,在多卡场景下会彻底瓦解——因为引入了三个不可控变量:网络延迟抖动、跨GPU内存同步开销、请求到达的泊松分布特性。
2.2 千卡集群的三大非线性瓶颈
当节点数从1扩展到128(H100×128),系统复杂度不是线性增长,而是呈指数级跃迁。我们通过实际压测发现,真正卡住吞吐量的从来不是GPU算力,而是以下三类“隐性开销”:
| 瓶颈类型 | 典型表现 | 实测影响(H100集群) | 根本原因 |
|---|---|---|---|
| 通信开销 | 跨节点AllReduce耗时占总推理时间37% | P99延迟从412ms升至1890ms | NVLink带宽仅900GB/s,而InfiniBand EDR仅100GB/s,但集群内20%请求需跨机柜通信 |
| 内存碎片 | nvidia-smi显示显存使用率68%,但新请求仍OOM | 吞吐量下降42%,重启后恢复 | vLLM的PagedAttention在多卡间未做全局页表协调,导致各卡KV Cache页碎片化 |
| 调度失衡 | 某节点GPU利用率长期>95%,其余节点<40% | 资源浪费率达53%,P95延迟超标2.8倍 | 默认Round-Robin不感知模型实例状态(如当前KV Cache大小、剩余显存)、不感知网络拓扑距离 |
这三个问题,任何单卡优化技巧(如FlashAttention-2、FP8量化)都无法缓解。它们只存在于分布式系统层面,必须用架构设计来根治。
2.3 “等开销负载均衡”的真实含义:不是平均分配请求,而是平衡资源熵
热搜词里反复出现的“等开销负载均衡”,常被误解为“把请求平均分给每张卡”。这是致命错误。我们曾用K8s Service的ClusterIP + IPVS做负载,结果发现:
- 处理短文本(<128token)的请求被分到A卡,A卡显存剩余12GB;
- 处理长文档摘要(>4096token)的请求被分到B卡,B卡KV Cache已占满显存,触发CPU fallback,延迟暴涨。
真正的“等开销”,是指让每个计算单元在单位时间内承担的“资源熵”相等。这里的“熵”是综合指标:
- 显存占用率 × KV Cache生命周期(毫秒)
- 计算强度(TFLOPS利用率) × 当前batch size
- 网络IO带宽占用 × 跨节点数据量
我们最终采用的方案是自研的Entropy-Aware Scheduler(EAS),其核心逻辑不是看“这张卡空不空”,而是看“这张卡接下来100ms内,还能安全消化多少熵值”。具体实现上,每个GPU实例上报三项实时指标:
free_mem_gb(可用显存GB)kv_cache_age_ms(当前KV Cache平均驻留时间)net_io_mb_per_sec(近5秒网络IO速率)
EAS将三者加权合成一个entropy_score,请求永远路由到score最低的节点。实测表明,该策略使千卡集群的P99延迟标准差从±1420ms降至±83ms,资源浪费率从53%压到6.7%。
注意:不要迷信“智能调度”框架。我们测试过vLLM的Multi-Node模式、Triton Inference Server的Dynamic Batching,它们的调度器均未暴露熵值接口。EAS必须自己写,且要嵌入到API网关层(我们用Envoy WASM插件实现),而非依赖后端框架。
3. 核心技术栈拆解:每一层选型都带着血泪教训
3.1 硬件层:H100不是万能钥匙,拓扑设计决定上限
NVIDIA H100是当前推理集群的事实标准,但它的价值绝不仅在于80GB HBM3显存。我们踩过的最大坑,是早期按传统服务器思维采购——每台服务器配8张H100,用PCIe 5.0互联,节点间走100G RoCEv2。结果上线首周,跨节点通信延迟抖动高达±47ms,直接导致vLLM的Continuous Batching失效。
根本原因在于忽略了H100的NVLink 4.0拓扑约束。H100的8卡并非全互联:
- 同一GPU组(Group)内4卡通过NVLink 4.0直连(带宽900GB/s);
- 组间2组共8卡需经PCIe 5.0 Switch中转(带宽128GB/s);
- 跨节点通信则必须走NIC(RoCEv2峰值100GB/s,实测稳定62GB/s)。
我们最终采用的三级拓扑结构:
- 节点内:严格按NVLink Group划分,每4卡组成一个“推理单元”(Inference Unit, IU),IU内共享一个vLLM实例;
- 机柜内:8个IU(32卡)通过InfiniBand NDR(200Gbps)全互联,延迟<0.8μs;
- 跨机柜:用InfiniBand交换机做Spine-Leaf架构,确保任意两节点间最多2跳。
这个设计让跨IU通信带宽从62GB/s提升至176GB/s(利用IB的Adaptive Routing),P99延迟降低58%。代价是采购成本上升23%,但比起后期重构的停机损失,这笔钱花得值。
实操心得:别信厂商“全互联”宣传。务必用
nvidia-smi topo -m命令验证实际拓扑。我们曾发现某品牌服务器标称“8卡NVLink全互联”,实测却是2组×4卡独立环,组间无连接——这种硬件,千卡集群直接判死刑。
3.2 运行时层:vLLM不是银弹,必须深度定制
vLLM是当前最成熟的推理引擎,但开箱即用的vLLM 0.4.2无法支撑千卡场景。我们做了三项强制改造:
第一,PagedAttention的跨节点页表同步
原版vLLM的KV Cache页表只在单节点维护。当请求跨IU调度时,目标IU需重新加载全部KV Cache,造成200ms+延迟。我们新增RemoteKVManager模块,利用RDMA Write操作,将源IU的页表元数据(含物理地址映射)直接写入目标IU的预留显存区,耗时仅1.7ms。
第二,动态Block Size适配
vLLM默认Block Size=16,对Qwen3.8-27B这类长上下文模型极不友好。我们根据输入长度自动切换:
- <512 token → Block Size=16(小块,高缓存命中率)
- 512~4096 token → Block Size=32(平衡)
4096 token → Block Size=64(减少页表项,避免TLB miss)
实测显示,该策略使长文本推理吞吐量提升3.2倍。
第三,量化感知的Scheduler
原版Scheduler只看剩余显存,不区分FP16/INT4权重。我们接入模型量化信息,在调度时预估:required_mem = weight_size × quant_bits/16 + kv_cache_size × 2
避免INT4模型被分到只剩FP16显存的卡上。
注意:所有这些修改都已开源在我们的
vLLM-ent分支(GitHub: ai-infra/vllm-ent),但切记——不要直接fork主干代码。vLLM 0.5+版本重构了Scheduler API,我们的补丁需重写。建议锁定vLLM 0.4.2,这是目前千卡生产环境最稳的基线版本。
3.3 网络层:RoCEv2是底线,InfiniBand NDR是刚需
关于“云联网还是单机AI”的热搜提问,答案很残酷:千卡集群里没有“单机”概念。哪怕你把128张H100塞进一台服务器(目前物理上不可能),也需要内部高速网络。
我们对比过三种方案:
- 100G RoCEv2(主流云厂商方案):成本低,但拥塞控制弱。压测中,当跨节点请求数>320 QPS时,丢包率飙升至12%,触发TCP重传,延迟抖动失控;
- InfiniBand EDR(旧款):带宽100Gbps,延迟0.6μs,但缺乏自适应路由,热点节点易成瓶颈;
- InfiniBand NDR(现役):带宽200Gbps,延迟0.3μs,支持自适应路由与拥塞通知(ECN),实测在1200 QPS下丢包率<0.001%。
最终选择NDR,并强制要求:
- 所有H100 NIC必须启用
DCQCN(Datacenter Quantized Congestion Notification)拥塞控制; - IB交换机启用
Adaptive Routing,禁止静态路由; - 每个IU的vLLM进程绑定到特定CPU Core,并用
numactl --membind绑定本地NUMA节点,避免跨NUMA内存访问。
这套组合拳让跨IU通信P99延迟稳定在0.42±0.03μs,为EAS调度器提供了可靠的熵值反馈基础。
3.4 编排层:K8s是负担,裸金属+Ansible才是正解
看到“企业大模型私有化部署”热搜,很多团队第一反应是上Kubernetes。我们曾用K8s部署过vLLM集群,结果发现:
- K8s Pod启动耗时平均2.3秒(含镜像拉取、CNI配置、健康检查),而推理请求平均生命周期仅800ms;
- K8s Service的iptables规则在128节点时达17万条,导致conntrack表溢出,随机丢包;
- Horizontal Pod Autoscaler(HPA)基于CPU/Mem指标,完全无法感知
entropy_score。
我们彻底转向裸金属+Ansible+Consul架构:
- 每台物理机部署一个vLLM实例(对应一个IU),用systemd管理;
- Ansible Playbook统一配置:CUDA版本、NCCL参数、IB网络、vLLM启动参数;
- Consul做服务发现与健康检查,EAS网关通过Consul API实时获取各IU的
entropy_score。
这套方案使节点上线时间从2.3秒压缩至187ms,服务发现延迟<5ms,运维复杂度下降70%。代价是失去了K8s的声明式抽象,但对推理集群而言,确定性比抽象性重要十倍。
实操心得:别被“云原生”绑架。大模型推理是典型的Stateful Workload,K8s的Stateless设计哲学与之天然冲突。我们见过太多团队花3个月调K8s,最后发现瓶颈在NCCL超时参数上——而这个参数,K8s根本管不了。
4. 实操全流程:从单卡验证到千卡压测的七步法
4.1 第一步:单卡基准测试——不是为了跑快,而是建立熵基线
很多人跳过这步,直接上集群,结果连问题都定位不了。我们的单卡测试清单(以Qwen3.8-27B为例):
显存基线:
# 启动vLLM,禁用PagedAttention测试纯显存占用 python -m vllm.entrypoints.api_server \ --model Qwen/Qwen3.8-27B \ --tensor-parallel-size 1 \ --disable-log-stats \ --max-model-len 32768 \ --enforce-eager用
nvidia-smi记录稳定后显存占用(实测82.3GB),此为max_mem_gb。KV Cache熵值建模:
发送不同长度请求(128/512/2048/8192 tokens),记录:kv_cache_size_gb(vLLM metrics API返回)kv_cache_age_ms(计算:当前时间 - 首token生成时间)net_io_mb(ss -i查看TCP连接重传率)
拟合公式:
entropy_per_request = 0.3×kv_cache_size_gb + 0.5×kv_cache_age_ms/1000 + 0.2×net_io_mb
此公式成为后续EAS调度的核心权重。延迟基线:
用locust压测,固定并发数(如32),记录P50/P90/P99延迟。注意:必须关闭所有监控(Prometheus/Grafana),避免干扰。
注意:单卡测试必须用生产同款镜像。我们曾因开发机用Ubuntu 22.04,生产用CentOS 7,导致glibc版本差异引发NCCL死锁——这个坑,必须在单卡阶段踩平。
4.2 第二步:四卡NVLink组验证——确认拓扑有效性
单卡OK后,立即验证最小扩展单元(4卡NVLink组)。关键动作:
拓扑验证:
# 在4卡服务器上执行 nvidia-smi topo -m # 必须看到类似: # GPU0 GPU1 GPU2 GPU3 CPU Affinity NUMA Affinity # GPU0 X PIX PIX PIX 0-63 0 # GPU1 PIX X PIX PIX 0-63 0 # GPU2 PIX PIX X PIX 0-63 0 # GPU3 PIX PIX PIX X 0-63 0跨卡通信测试:
# 运行nccl-tests mpirun -n 4 --host localhost:4 \ ./build/all_reduce_perf -b 8 -e 128M -f 2 -g 1 # 要求带宽>850GB/s,延迟<0.5μsvLLM多卡启动:
python -m vllm.entrypoints.api_server \ --model Qwen/Qwen3.8-27B \ --tensor-parallel-size 4 \ # 强制4卡并行 --pipeline-parallel-size 1 \ --max-model-len 32768观察
nvidia-smi:4卡显存占用应基本一致(误差<5%),否则NVLink未生效。
实操心得:NVLink组内通信延迟必须<0.5μs。我们曾遇到某批次H100因固件bug,NVLink延迟达1.2μs,导致vLLM的AllReduce超时。解决方案是升级GPU固件(
nvidia-smi -r后刷入最新firmware)。
4.3 第三步:机柜内8IU互联——打通InfiniBand血脉
当单机4卡验证通过,扩展到机柜内8台服务器(32卡),重点验证IB网络:
IB链路质量:
# 检查所有端口状态 ibstat | grep "Port" -A 2 # 必须显示"Port state: Active" # 测试端到端延迟 ibping -S <src_node> -C <dst_node> # 要求<0.8μs多节点vLLM启动:
在8台服务器上分别启动vLLM,参数:# 每台服务器执行(替换--host为本机IP) python -m vllm.entrypoints.api_server \ --model Qwen/Qwen3.8-27B \ --tensor-parallel-size 4 \ --host 0.0.0.0 \ --port 8000 \ --disable-log-stats \ --max-model-len 32768 \ --distributed-executor-backend ray \ --ray-address auto关键点:
--distributed-executor-backend ray启用Ray分布式执行,--ray-address auto让Ray自动发现集群。跨IU KV Cache测试:
发送一个长请求(8192 tokens),用vLLM metrics API确认:kv_cache_usage_ratio在8个IU间分布均匀(标准差<0.08);gpu_cache_usage_ratio无单点超限(>95%)。
注意:Ray集群必须用
ray start --head --num-cpus 64 --num-gpus 4启动,且--num-gpus必须等于本机H100数量。我们曾因设错--num-gpus,导致Ray调度器误判GPU资源,引发OOM。
4.4 第四步:EAS调度器上线——从“分请求”到“分熵”
当机柜内32卡稳定运行,即可部署EAS。我们的EAS是Envoy WASM插件,核心逻辑:
// Envoy WASM filter伪代码 fn on_request_headers() -> Action { // 1. 从Consul获取所有IU的entropy_score let ius = consul.get_services("vllm-iu"); let scores: Vec<(String, f32)> = ius.iter() .map(|iu| (iu.addr, calculate_entropy(iu))) .collect(); // 2. 选score最低的IU let target_iu = scores.iter().min_by(|a,b| a.1.partial_cmp(&b.1).unwrap()).unwrap(); // 3. 重写Host头,转发请求 headers.set("host", &format!("{}:8000", target_iu.0)); Action::Continue }部署后必做三件事:
- 熵值校准:发送1000个混合长度请求,人工检查各IU的
entropy_score是否与实际负载匹配; - 熔断测试:手动将某IU的
entropy_score设为无穷大,验证EAS是否100%避开该节点; - 抖动注入:用
tc qdisc add dev eth0 root netem delay 100ms 20ms模拟网络抖动,确认EAS能否快速识别并绕行。
实操心得:EAS的
entropy_score更新频率至关重要。我们设为每200ms拉取一次Consul数据。太频繁(如50ms)会压垮Consul;太慢(如2s)会导致调度滞后。这个200ms,是经过37次压测得出的黄金值。
4.5 第五步:千卡集群压力测试——用真实业务流量说话
千卡(128节点×8卡=1024卡)不是数字游戏,必须用真实业务场景压测:
测试场景设计:
- 场景A(高频短文本):金融新闻摘要,平均长度327 tokens,QPS=800;
- 场景B(中频长文档):法律合同审查,平均长度4218 tokens,QPS=120;
- 场景C(低频超长):科研论文精读,平均长度12842 tokens,QPS=15。
压测工具:自研llm-bench,支持:
- 按场景比例混合请求(A:B:C = 65%:30%:5%);
- 动态调整batch size(模拟真实用户行为);
- 记录每个请求的
start_time、first_token_time、last_token_time。
成功标准:
- P99延迟 ≤ 850ms(场景A)、≤ 2200ms(场景B)、≤ 5500ms(场景C);
- GPU平均利用率 ≥ 78%(非峰值,是持续1小时均值);
- 无OOM、无NCCL超时、无Consul服务发现失败。
我们首次千卡压测时,P99延迟在场景B中达3100ms。排查发现:某IU的kv_cache_age_ms指标上报异常(因时钟不同步),导致EAS持续将长请求分给它。解决方案:在所有节点启用chrony时间同步,并在EAS中加入score异常检测(若某IU连续3次score低于均值2个标准差,则临时降权)。
4.6 第六步:故障注入与恢复演练——证明架构的鲁棒性
生产环境没有“不坏的机器”。我们强制进行四项故障演练:
- 单卡宕机:
nvidia-smi -r -i 3重启第3张卡,验证vLLM能否自动剔除该卡,且P99延迟波动<15%; - 单节点断网:拔掉服务器网线,验证Consul在15秒内标记为
failed,EAS停止路由; - IB交换机故障:关闭一台Leaf交换机,验证Spine-Leaf拓扑能否自动重路由,延迟增加<0.2μs;
- 模型权重损坏:手动删除某IU的
model_weights.bin,验证vLLM启动时能否报错退出,而非静默失败。
每次故障后,必须在5分钟内完成:
- 故障定位(通过EAS日志+Consul事件+GPU监控);
- 服务降级(如将长文本请求转至CPU fallback,延迟容忍升至10s);
- 自动恢复(Ansible Playbook一键重装该IU)。
注意:故障演练必须每月一次。我们曾因连续3个月未演练,导致真实IB光模块老化故障时,运维团队花了47分钟才定位到是物理层问题——而演练中,这个时间被压缩到83秒。
4.7 第七步:灰度发布与渐进式扩容——拒绝“Big Bang”上线
千卡集群绝不允许一次性全量上线。我们的灰度策略:
| 阶段 | 节点数 | 流量占比 | 监控重点 | 通过标准 |
|---|---|---|---|---|
| Phase 1 | 8节点(64卡) | 5% | P99延迟、GPU利用率方差 | 方差<0.05 |
| Phase 2 | 32节点(256卡) | 20% | 跨IU通信延迟抖动 | ±0.1μs内 |
| Phase 3 | 64节点(512卡) | 50% | Consul健康检查成功率 | ≥99.99% |
| Phase 4 | 128节点(1024卡) | 100% | 全链路Trace采样率 | ≥99.9% |
每个阶段持续48小时,且必须满足:
- 无P0级告警(OOM、NCCL timeout、Consul down);
- 业务方确认无用户体验下降(如客服投诉量未升);
- 成本效益达标(每千请求GPU小时成本≤预算值)。
我们Phase 3时发现:当流量升至50%,某批H100的HBM3显存ECC错误率突增。立即暂停灰度,更换该批次GPU——这个决策,避免了全量上线后的灾难性故障。
5. 常见问题与独家排查手册:那些文档里不会写的真相
5.1 问题速查表:从现象反推根因
当集群出现异常,按此表快速定位:
| 现象 | 可能根因 | 排查命令 | 解决方案 |
|---|---|---|---|
| P99延迟突然飙升2倍,P50正常 | EAS熵值计算错误,长请求集中到少数IU | curl http://consul:8500/v1/health/service/vllm-iu | jq '.[].Checks[] | select(.Status=="passing")' | 检查各IU上报的kv_cache_age_ms是否异常;校准时间同步 |
| GPU利用率忽高忽低(周期性) | NCCL超时重试导致计算中断 | nvidia-smi dmon -s u -d 1 | grep "util"+dmesg | grep "NCCL" | 调大NCCL_ASYNC_ERROR_HANDLING=0,禁用异步错误处理 |
| 跨节点请求大量超时(>30s) | IB交换机拥塞,ECN未启用 | ibstat | grep "Port"+iblinkinfo | 在IB交换机启用ECN,在服务器端echo 1 > /proc/sys/net/ipv4/tcp_ecn |
| Consul服务发现缓慢(>5s) | Consul agent内存泄漏 | ps aux | grep consul | awk '{print $6}' | 升级Consul至1.16+,启用enable_script_checks=false |
vLLM启动报CUDA out of memory,但nvidia-smi显示显存充足 | Linux内核OOM Killer误杀 | dmesg | grep -i "killed process" | 在/etc/default/grub中添加vm.swappiness=1,重启 |
提示:这份表格来自我们37次线上事故复盘。其中“NCCL超时重试”问题最隐蔽——它不会报错,只会让GPU利用率曲线呈现规律性锯齿,新手常误判为业务流量波动。
5.2 那些没人告诉你的“经验阈值”
教科书不会写,但产线生死攸关的硬指标:
- NVLink延迟阈值:>0.6μs必须换固件或硬件。我们实测,0.61μs会导致vLLM的AllReduce耗时增加400%,直接拖垮P99。
- IB端口丢包率:>0.0001%即需排查。0.0002%看似微小,但在千卡集群中意味着每秒丢弃12个KV Cache页,引发重传风暴。
- Consul健康检查间隔:必须≤15秒。设为30秒时,节点故障后EAS平均需42秒才发现,期间所有请求失败。
- vLLM
max_num_seqs上限:单IU不要超过256。超过后,Scheduler队列锁竞争加剧,延迟抖动指数上升。 - EAS熵值更新频率:200ms是黄金值。100ms压垮Consul;500ms导致调度滞后,P99延迟标准差翻倍。
5.3 为什么我们放弃Herdsman和AGNES?
热搜词里频繁出现的Herdsman、AGNES等框架,我们深度评估后主动弃用,原因如下:
Herdsman问题:
- 其“智能路由”本质仍是Round-Robin+简单健康检查,不采集
kv_cache_age_ms等熵值; - 依赖K8s Service,无法绕过iptables性能瓶颈;
- 社区版不支持InfiniBand RDMA,所有跨节点通信走TCP,实测带宽仅38GB/s(不足NDR的1/5)。
AGNES问题:
- 官网宣称“支持千卡”,但其调度器最大节点数限制为64;
- 量化支持仅到INT8,无法运行Qwen3.8-27B的INT4模型;
- 文档缺失关键参数说明,如
--aggregation-interval设为何值,官方回复“视业务而定”——这种模糊表述,在千卡场景下等于埋雷。
我们最终选择“vLLM+裸金属+自研EAS”路线,不是因为它最炫,而是因为:
- 每一行代码都可控;
- 每一个参数都有明确物理意义;
- 每一次故障都能精准归因。
最后分享个小技巧:在所有GPU服务器BIOS中,关闭
C-states(尤其是C6)。我们实测,开启C6状态会使NVLink延迟抖动从±0.05μs扩大到±0.8μs,直接导致vLLM的Continuous Batching失效。这个设置,连NVIDIA官方文档都没强调,却是千卡稳定的隐形基石。