sglang vs vllm vs tensorrt

模型与算力

给做推理选型的人一套可执行的对比框架:从吞吐、部署难度、硬件绑定三个维度判断三个引擎各自该在什么场景下用。

手上有一批卡、要跑一个开源模型对外提供服务,同事问你为什么不用另一个引擎,你答不上来——这种情况太常见了。这篇不堆跑分,只给判断顺序:先看你的硬件是不是被锁死、再看你的请求形态是长提示还是长输出、最后看团队能不能扛住编译和版本对齐的维护成本。每一步都告诉你在什么条件下这个结论不成立。

手上有一批卡、要跑一个开源模型对外提供服务,同事问你为什么不用另一个引擎,你答不上来——这种情况太常见了。问题往往不在于谁更快,而在于你没把约束条件排清楚:卡是什么型号、请求是长提示还是长输出、团队有没有人愿意长期跟版本。这三个条件一变,答案就跟着变。

这篇不堆数字,只给判断顺序。每一步都告诉你在什么条件下这个结论不成立,避免把别人的场景直接搬到自己身上。想先有个整体印象,可以到 /inference 看同类开源模型的部署与比价概况,但别拿别人的结论当自己的选型依据。

先看硬件:这一步就能砍掉一个选项

选型第一步不该是比吞吐,而是确认候选引擎能不能在你的卡上稳定跑起来。TensorRT 系推理对显卡世代和驱动版本比较敏感,卡不在它支持的那几代范围内,编译环节就可能直接卡住,这时候不用比吞吐,直接排除。SGLang 和 vLLM 更贴近通用 GPU 生态,但如果你用的是国产卡或非主流加速卡,也要先确认有没有对应分支和算子支持,别默认能跑。

判断项要看什么不通过怎么办
显卡世代与驱动候选引擎的支持列表里有没有你这张卡不在列表里就换引擎,别硬编译
加速卡类型通用 GPU 还是专用卡,分支是否覆盖专用卡先找官方或社区适配分支
卡数与显存到 /compute/sizing 按模型和量化档位估一遍估出来跑不动就降模型或改量化
长期可用性后续换卡换驱动会不会要重来不确定就优先选适配面宽的方案

再看请求形态:长提示和长输出,选法不一样

硬件过关之后,下一步不是看总吞吐,而是看你的请求长什么样。前缀复用比例高的情况——比如同一份长文档被反复提问、few-shot 示例固定不变——前缀缓存的收益最明显,这是选型时要重点验证的能力。反过来,输入短、输出长的生成型请求,压力点更多落在解码调度和显存占用上,和前者完全不是一回事。

  • 先从线上日志拉出输入长度和输出长度的分布,别用别人的合成数据代替
  • 把峰值并发、平均并发、突发时长一起统计,单看均值会误判
  • 到 /tools/speed-test 用你自己的请求比例量一遍延迟基线,记录稳定态而不是峰值
  • 同一份流量在两个候选引擎上各压一轮,重点看长尾延迟和队列堆积
  • 确认前缀缓存的命中条件,比如提示前缀是否严格一致、是否跨会话复用

判断顺序是:先有真实长度分布,再有延迟基线,两者合起来才能判断哪种引擎更贴合。如果你的请求量很小、并发长期是个位数,这一层的差异会被冷启动和排队淹没,不必过度纠结。想对照不同引擎在真实服务里的表现,可以到 /rankings 看当时的横向记录,注意那是别人的流量形态。

部署难度:真正花钱的是维护,不是第一次跑通

启动一个服务、加载权重、暴露一个兼容接口,这三个动作各家都有现成路径,第一次跑通通常不难。难的是换模型版本、换卡、调并发参数的时候还能不能快速复现。第一次跑通花一天,之后每次升级都花一周,这种账要提前算,而不是等线上出问题才发现没人能改。

  1. 记录一条可复现路径把镜像、依赖版本、启动参数写成脚本,任何人照着能起一份一样的环境,验证方式是换台机器执行一遍
  2. 验证换模型成本同一引擎换一个模型或换量化档位,看要不要重新编译算子、要不要重下缓存,记录耗时和磁盘占用
  3. 验证换卡成本把服务从一张卡迁到另一张不同型号的卡,看配置改动量,这一步最容易暴露隐性绑定
  4. 评估版本对齐负担算子编译类方案首次构建慢、缓存体积大,团队若没有专人跟版本,升级一次模型可能要重排一轮工期

量化档位和引擎的搭配也是常见的坑:不是所有量化格式在每个引擎里都能吃到加速,有的只是省显存、不提速,甚至因为额外的反量化开销变慢。选之前到 /models/deploy 按模型和量化方式算一遍显存与卡数,再决定用哪一档。如果只是一次性实验、不打算长期维护,首次构建的麻烦可以忍;一旦要对外提供稳定服务,维护成本必须算进选型里。

落地清单:四步走完再拍板

前面三节是排除法,这一节是可执行流程。原则是先用真实约束砍掉不合适的选项,再用同一份流量做对比,最后留一条能换引擎的后路。每一步都有明确的验收动作,不是走形式。

步骤做什么验收动作
一、锁硬件确认卡的型号、卡数、驱动与候选引擎支持列表列出至少一个明确通不过的候选并说明原因
二、量流量从真实日志统计输入输出长度分布与峰值并发产出一张分布表,能说清长提示还是长输出为主
三、估资源到 /compute/sizing 按模型与量化档位估卡数,到 /inference 看同类开源模型的比价得到卡数与部署形态的初步方案
四、压一轮同一份流量在两个候选上各压一轮比稳定态延迟与队列表现,而不是峰值跑分
接口层保持 OpenAI 兼容,引擎换了只改后端——选型时给自己留的这条后路,比任何一个跑分都值钱。

拍板前把业务代码和引擎的私有参数解耦,不要把调度参数写进业务逻辑里。如果只有单卡、只服务内部几个人,挑最省事的那条路就行,没必要走完整流程;但一旦要对外提供有承诺的服务,回退路径和监控必须提前准备好,否则换引擎的代价会远高于当初省下的时间。

下一步把硬件和流量两个约束先固定下来,再去比引擎,会少走很多弯路;站内已把各引擎的部署要点、资源估算和比价入口整理在一起,照着走一遍就能得到自己的结论。

常见问题

三个引擎能不能混着用,各跑一部分流量?

技术上可以,但代价是运维面翻倍:两套镜像、两套参数、两套监控,出问题时你还得分清是哪条链路的锅。流量没有大到单引擎扛不住、或者有明确的异构卡必须分开跑,一般不建议一开始就混着上。

吞吐是不是越高越划算?

要看你的成本结构。租卡按小时计费时吞吐直接换算成钱,值得追;自购卡、卡闲着也是闲着,吞吐提升只影响排队长度,这时候部署省心程度往往更值钱。先算清卡是租的还是自己的,再决定要不要为吞吐折腾。

切换引擎需要重训或改模型权重吗?

不需要。这三者都是推理侧的运行框架,权重格式和量化格式是另一层的事,只要权重格式在目标引擎里有对应支持就能直接加载。真正要动的是启动参数、并发配置和接口封装,模型本身不用重新训练。

本文依据各平台公开文档与官方公告整理,只做中文归纳;具体做法、参数与限制以官方文档为准。