多数人搜 sglang vs vllm 推理速度,是想找一个「谁更快」的答案。真上手部署会发现,同一个模型、同一张卡,换个压测脚本结论就反过来了。这篇不给你排名,给你一套对号入座的方法:先看请求是长 prompt 短输出还是多轮反复带前缀,再看是单人试还是多人排队,然后自己量三个数,再决定装哪个。
搜 sglang vs vllm 推理速度,多数人是想找个「谁更快」的结论。真上手部署会发现,同一个模型、同一张卡,换个压测脚本结论就反过来。这不是哪个框架在吹牛,是请求形态变了,瓶颈就换了位置。
所以这篇不给你排名,给你一套对号入座的方法:先看请求是长 prompt 短输出,还是多轮反复带前缀;再看是单人试还是多人排队;然后自己量三个数,再决定装哪个。框架选型的坑多半不在框架本身,在你没定义清楚自己跑的是什么负载。
同一个模型,为什么两边结论会打架
两个框架都在算力打满之前受限于不同环节。一边卡在调度和显存管理的开销上,一边卡在缓存能不能复用上。任务形态一换,受限的那一环就换人了,你看到的快慢自然也跟着换。
- 贴出来的对比图通常只跑单一场景,比如固定短 prompt 的高并发,这种条件下赢的一方换成长上下文就未必还是它
- 模型结构有影响,MoE 和稠密模型的分支开销不一样,别人压的是哪个模型,跟你手里这个不是一回事
- 量化档位、张量并行配置、上下文长度这些都没统一,比出来的数字没法直接搬
- 所以顺序应该是:先定义你的请求分布,再去比,而不是先比完再找理由
把你的请求摊开对号,比看跑分有用
这一步不需要装任何东西,先把线上日志或预想的请求扒一遍,看清长度分布和重复度。下面这张表可以对着填,填完基本就知道该往哪边偏。
| 请求特征 | 更敏感的能力 | 偏向 |
|---|---|---|
| 多轮对话、Agent,每轮带一大段相同系统提示和历史 | 前缀复用,重复计算能不能省掉 | 对缓存能力敏感的那一边 |
| 批量离线,每条 prompt 都不一样,输出很长 | 调度和显存利用率 | 缓存帮不上太多忙 |
| 结构化输出,要按格式约束生成 | 约束解码的实现成熟度 | 看文档和实测,不看宣传 |
| 请求量很小的内部工具 | 部署顺手程度 | 别为框架折腾,哪个资料多选哪个 |
还有一种常被忽略的情况:你的输出长度远大于输入。这类负载下缓存带来的收益被摊薄,重点变成解码阶段的调度效率,跟长输入场景的结论很可能相反。所以别拿一个场景的结论套所有业务。
自己量三个数,再决定装哪个
- 量首字延迟用你真实的 prompt 长度打,别用示例里的短句。从发请求到拿到第一个 token 计时,这才是用户感知最直接的一项。
- 量单路输出速度单并发压一次,看单个请求的生成节奏。这一步不受排队干扰,反映的是纯解码能力。
- 量并发拐点按预计峰值人数往上加并发,记录总吞吐和排队时间,直到延迟明显变差。那个拐点就是你的容量上限,加机器还是换框架都看它。
- 固定变量重测模型、量化档位、显卡、上下文长度四个变量固定住,改一个就重测。别把差异算到框架头上。
网络链路本身也有底噪。到 /tools/speed-test 先量出你这台机器到外部的延迟基线,压测结果再减掉这部分,不然首字延迟里混进了无关的东西,结论会偏。
速度之外还得算的两笔账
- 显存与上下文
- 单卡能塞多大的上下文、能跑到什么量化档位,直接决定要不要多买卡,这笔账通常比几个百分点的速度差更值钱
- 运维复杂度
- 版本更新频率、新模型适配要等多久、报错能不能搜到,出故障那天全变成时间成本
- 团队熟悉度
- 两边的启动参数、并行配置、量化支持写法都不一样,熟手能省掉一整天试错
有一种情况其实不用纠结速度:请求量本来就撑不满一张卡。这时候优化吞吐是空转,你真正该关心的是稳定性、启动速度和模型支持范围。等负载真的压上来,再回来做这轮对比也不迟。
想横向看各家框架和模型在站内的资料,可以到 /sites 按模型和部署方式筛一遍,再对照 /rankings 里当时整理的数字。价格和套餐变动快,具体数值到 /price-watch 核对当时的行情,别拿旧截图当依据。
下一步把你的请求长度分布和并发峰值记下来,去站内工具页做一轮自己的压测,再回来选框架,比看任何对比图都靠谱。→常见问题
是不是并发越高,两个框架的差距就越明显?
不一定。并发抬到某个点之后,双方都会撞上显存和调度上限,差距反而被抹平,这时候真正卡住你的是显卡数量而不是框架。先找到自己业务的并发拐点,再决定要不要为了高并发场景换框架。
能不能两个都装,按请求分路走?
技术上可以,但要先算清运维成本:两套服务意味着两份显存、两套监控和两套排障流程。团队小于五个人、请求量不复杂的情况下,通常一个跑顺了比两个都半熟要划算,先单框架跑满再说。
官方给的性能数字能直接拿来当选型依据吗?
只能当参考方向。那些数字是在特定模型、特定卡型、特定请求分布下测出来的,跟你手里的模型和流量形态常常对不上。可以拿它筛掉明显不合适的候选,最终结论还是得用自己的请求量一遍,数字口径到 /benchmarks 看当时怎么定义。