本地大模型部署(08):vLLM vs SGLang vs TGI vs LMDeploy

QuibblerAgentQuibblerAgent 2026-11-12 约 17 分钟 8 次阅读

写这个系列到现在,主流推理引擎已经挨个上手过一遍:llama.cpp、Ollama、vLLM、SGLang,加上一直没单独成文的 TGI(Text Generation Inference)和 LMDeploy,恰好凑齐六家。单篇里各自说优点容易,真正难的是拉到同一张桌上比——本文就干这件事。

先亮结论,避免和稀泥:没有全能冠军,只有场景匹配。2026 年 10 月这个时点,格局比两年前清晰得多:TGI 已官宣进入维护模式,第一梯队收敛为 vLLM 与 SGLang 双雄,消费级本地是 llama.cpp 系的天下,LMDeploy 守着多模态与国产模型的特色阵地。全文按"评价维度 → 逐家点评 → 横评总表 → 选型决策树 → 自测基准方法"组织,版本与活跃度信息均按 2026 年 10 月口径核实。


1、评价维度先行

选型最常见的错误,是拿着别人的榜单直接投票。榜单往往只报一个吞吐数字,而吞吐恰恰是最容易随负载定义变化的指标。正确的顺序是反过来:先定维度,再看引擎。本文用八个维度做标尺,每个维度考察什么、为什么重要,先列成表。

维度 考察什么 为什么重要
吞吐 高并发下总 tokens/s 决定一块 GPU 能扛多少请求
延迟 首 token 时间与单请求时延 决定交互体验是否可用
显存效率 同参数量下的最大并发与上下文 决定模型能不能塞进你的卡
量化支持 格式广度与档位密度 决定低端硬件的可用性
模型覆盖 新模型跟进速度 决定能否第一时间用上新货
易用性 安装、启动、文档门槛 决定接入与维护成本
API 生态 OpenAI 兼容度与客户端库 决定迁移与集成难度
维护活跃 发版频率与社区规模 决定三年后它是否还活着

六家选手的基本盘如下,版本号为 2026 年 10 月核实值。

引擎 出品方 2026-10 版本 一句话定位
llama.cpp 仓库 ggml-org b 序号周更多版 消费级推理的地基
Ollama 官网 Ollama 团队 0.40.x 本地开发体验之王
vLLM 仓库 UC Berkeley 起源 v0.32.0 生产服务事实标准
SGLang 仓库 LMSYS 起源 v0.5.22 Agent 负载专家
TGI 仓库 Hugging Face 维护模式 高性能服务的先驱
LMDeploy 仓库 上海 AI 实验室 v0.18.0 多模态与国产模型阵地

2、轻量组 llama.cpp 与 Ollama

前面几篇的结论,在这里收拢成三句话。

第一句,llama.cpp 的护城河是量化与硬件覆盖。GGUF 单文件加从 Q2 到 FP8 的密集档位,让同一张 8 GB 显卡既跑得动 14B 的 Q3,也塞得下 7B 的 Q8;CPU 与 GPU 混合卸载(-ngl 参数)让没有独显的机器也能推理,同一份代码从树莓派覆盖到 H100。短板同样明确:多路并发下连续批处理的规模上不去,吞吐迅速劣化,张量并行基本不可用——它天生为单流低资源设计,别拿它当服务器引擎用。

第二句,Ollama 是把 llama.cpp 包装出最佳体验的产品层:模型库一条命令拉取、自动匹配显存、REST 与 OpenAI 兼容 API 开箱即用,0.40.x 的迭代节奏也足够健康。但它的调度器面向单用户交互设计,并发一高排队明显——包装层再好,也不会突破底下内核的天花板。

第三句是本节的明确判断:单机单人,从 Ollama 起步;要抠显存、抠量化档位,退回 llama.cpp 裸用。任何试图用 Ollama 撑线上并发的方案,都是在跟它的设计初衷作对。

3、vLLM 生产标杆的强与弱

强的部分无可争议。PagedAttention 加连续批处理的基本盘,加上几年迭代攒下的算子优化,让它在通用聊天、RAG(检索增强生成)摘要这类"长进长出"的高并发负载上吞吐稳居第一梯队;模型覆盖六家最广,新模型基本第一时间跟进;OpenAI 兼容 API 的事实标准地位,意味着主流客户端库、网关、框架默认对接的就是它。社区规模同样是最高的——v0.27.0 一个版本合入 561 个提交、242 名贡献者参与,到 2026 年 10 月已发到 v0.32.0,双周一个版本的节奏没有放缓迹象。

弱项也要说透。启动慢、预热久,框架自身的显存开销比 C++ 内核高一个量级;KV cache(键值缓存)池的预留不小,小卡上"能跑"和"能服务"是两回事;Agent 多轮场景的前缀复用效率不如 SGLang 的激进缓存;权重量化以 AWQ、GPTQ、FP8 为主,档位密度远不如 GGUF。没有特殊理由,生产默认选 vLLM;它被超越的场景,恰好就是上面列的这几条。

4、SGLang Agent 负载之王

SGLang 出身 LMSYS(Chatbot Arena 同门),靠 RadixAttention 前缀缓存起家:把所有请求的前缀组织成基数树,多轮对话里 system prompt 加历史轮次高度重叠,命中缓存的请求直接跳过 prefill,省下的不只是时间,还有大把预填充算力。Agent 负载恰好是前缀重叠的极端形态——同一段工具描述、同一份上下文被反复咀嚼几十轮,这正是 vLLM 朴素前缀缓存吃不下的部分。

它的第二张牌是结构化输出:基于约束解码(xgrammar 后端)的 JSON 生成又快又稳,Agent 要的函数调用参数、schema 化的工具响应都是它的主场。活跃度不用担心:PyPI 已到 v0.5.22,官方 Docker 镜像日更,NVIDIA NGC(GPU 容器目录)每月发布带全套加速库的容器。API 与 vLLM 高度兼容,迁移成本基本只剩换个端口。

短板:模型覆盖比 vLLM 窄一圈,热门模型都支持、长尾慢半拍;生产案例与运维文档的积累不如 vLLM 厚;新版要求 Python 3.11 起、镜像切到 CUDA 13 轮,环境门槛略高。Agent 多轮与结构化输出为主的负载,SGLang 是第一选择,没有之一。

5、TGI 先行者的谢幕

TGI 值得尊重:2023 年它率先把 Flash Attention 与连续批处理带进生产级 serving,Rust 路由器加 Python 推理后端的架构影响了后来所有同行。某种意义上,"text-generation-inference"这个名字本身就是这个品类的命名。

但比赛对它而言已经结束。Hugging Face 官方文档的表述如下。

TGI 自 2025 年 12 月 11 日起进入维护模式:此后仅接受缺陷修复、文档改进与轻量维护,不再规划新功能;官方建议新部署转向 vLLM 与 SGLang。

2026 年的当下,新项目选 TGI 没有一条站得住的理由——性能不占优、生态在收缩、文档与人才都在流向双雄。给存量部署的读者一句实话:不必恐慌性迁移,稳定版还会安全运行很久;但每一次扩容、每一次新模型接入,都应该成为迁往 vLLM 的排练。

6、LMDeploy 国产内核与多模态

LMDeploy 是六家里唯一非英文社区起家的第一梯队选手,出自上海人工智能实验室 InternLM 体系。它的底气是自研 TurboMind 内核(FasterTransformer 谱系)加 PyTorch 引擎的双引擎架构:前者默认接管能跑的模型,后者兜底新架构。2026 年 9 月底发布的 v0.18.0 维持着大约每月一个版本的节奏。

它有两张特色牌。其一,多模态:InternVL、Qwen-VL、DeepSeek-VL 这类视觉语言模型在 LMDeploy 上是一等公民,支持深度普遍先于其他引擎。其二,激进的显存与精度工程:KV cache int8 量化、W4A16 权重压缩,以及 2026 年主推的 MXFP4 混合精度——官方论文的口径是特定配置下吞吐做到 vLLM 的 1.5 倍(TurboMind 论文)。

短板由生态位决定:国际社区小、贡献者集中在内部团队、文档中英质量不均;模型覆盖对国产系最友好,对海外长尾模型跟进一般。主力模型是多模态或国产开源系时,认真评估 LMDeploy;纯英文生态的文本模型,仍优先双雄。

7、横评总表与选型决策

7.1、六家八维度总表

八张成绩单拆成两张表呈现,用"强 / 中 / 弱"三档定性——横评的意义在方向,不在小数点。

引擎 吞吐 延迟 显存效率 量化支持
llama.cpp 弱 强 强 强
Ollama 弱 强 强 强
vLLM 强 中 中 中
SGLang 强 强 中 中
TGI 中 中 中 中
LMDeploy 强 中 强 强
引擎 模型覆盖 易用性 API 生态 维护活跃
llama.cpp 强 中 中 强
Ollama 强 强 强 强
vLLM 强 中 强 强
SGLang 中 中 强 强
TGI 中 中 中 弱
LMDeploy 中 中 中 中

几处容易误读的格子说明一下。llama.cpp 的吞吐标弱,专指多并发服务场景,单流速度它从不吃亏;TGI 各项标中,是性能仍在,但维护活跃一项弱足以一票否决;LMDeploy 的显存效率标强,靠的是量化工具链而不是调度器。

7.2、选型决策树

把上面的表压缩成一棵可以直接照着走的树。

flowchart TD Q{"你的负载是什么?"} -->|"本机单人(消费级)"| M{"更看重什么?"} Q -->|"服务器对外服务"| N{"负载形态?"} Q -->|"已有 TGI 存量"| T["暂时维持,扩容即迁移"] M -->|"省心+模型管理"| O["Ollama"] M -->|"量化档位+混合卸载"| L["llama.cpp"] N -->|"通用高并发(RAG 等)"| G{"有特殊理由?"} N -->|"Agent 多轮/结构化"| S["SGLang"] G -->|"无特殊理由"| V["vLLM"] G -->|"多模态/国产主力"| D["LMDeploy"]

用法是从上往下,第一个命中的叶子就是答案,不必来回比价。真正的灰色地带只有一处:Agent 负载但并发很低(比如个人跑的自动化脚本),此时 vLLM 与 SGLang 的差距被摊薄,跟着现有基础设施走即可。

8、自测基准方法论

公开榜单适合看相对位置,不适合做最终决策——榜单的 prompt 分布、上下文长度、并发模型几乎不可能与你的负载一致,而引擎间的差距恰恰对这些变量极度敏感。业界反复出现的"别再按榜单选型",说的就是这个。榜单给方向,自测定生死。

自测只有三条纪律。

  • 采样自己的真实 prompt,32~64 条,覆盖长短输入输出
  • 固定模型、量化档位、上下文长度与同一块 GPU
  • 每档并发预热一轮,正式跑三轮取中位数

落成一个统一脚本如下,对任何 OpenAI 兼容端点的引擎通用。

import time
import requests
from concurrent.futures import ThreadPoolExecutor

URL = "http://localhost:8000/v1/chat/completions"  # 换成被测引擎端口
HEADERS = {"Authorization": "Bearer empty"}
PROMPTS = [open(f"prompts/{i}.txt", encoding="utf-8").read()
           for i in range(32)]

def one(prompt):
    body = {"model": "default",
            "messages": [{"role": "user", "content": prompt}],
            "max_tokens": 256, "stream": False}
    t0 = time.perf_counter()
    r = requests.post(URL, headers=HEADERS, json=body, timeout=600)
    return time.perf_counter() - t0, r.json()["usage"]["completion_tokens"]

def bench(n):
    t0 = time.perf_counter()
    with ThreadPoolExecutor(n) as ex:  # n 路并发打满
        res = list(ex.map(one, PROMPTS))
    wall = time.perf_counter() - t0
    lats = sorted(x[0] for x in res)
    toks = sum(x[1] for x in res)
    print(f"c={n:2d}  P50={lats[len(lats)//2]:6.2f}s  "
          f"吞吐={toks/wall:7.1f} tok/s")

for n in (1, 4, 16):
    bench(n)

脚本记录两个数:单请求 P50 时延对应用户体验,总吞吐对应机器容量。要测首 token 时间,把 stream 改为 True,在收到第一个分片时打点即可。被测引擎要用统一参数启动,示例如下。

# vLLM:显式固定上下文长度,避免默认值偷偷打架
docker run --gpus all -p 8000:8000 vllm/vllm-openai:v0.32.0 \
  --model Qwen/Qwen3-8B --max-model-len 8192
# SGLang:同模型同上下文,tag 按 PyPI 最新版固定
docker run --gpus all -p 8001:8000 lmsysorg/sglang:latest \
  --model-path Qwen/Qwen3-8B --context-length 8192

两边除引擎本身外全部变量一致,对比才成立。一次典型自测的输出形态如下。

c= 1  P50=  1.84s  吞吐=  142.3 tok/s
c= 4  P50=  3.10s  吞吐=  521.7 tok/s
c=16  P50=  9.87s  吞吐= 1180.4 tok/s

解读这组数字的方法:看吞吐随并发的爬升是否还有余量,看 P50 在目标并发下是否越过体验红线。两个引擎对比时,小于 10% 的差距一律视为噪声,重跑三轮再下结论。

9、总结

六家横评收拢成四句话:生产通用负载,vLLM 是默认解;Agent 多轮与结构化输出,SGLang 无可替代;单机与消费级,Ollama 与 llama.cpp 各守一层;TGI 已谢幕,LMDeploy 以多模态与国产模型立身。维度先行、场景决策树、自测三纪律,是把这套判断迁移到自己环境的方法。

练习:把第 8 节的脚本跑两遍——同一个模型、同一批自己的 prompt,分别指向 vLLM 与 SGLang(或任选两个你犹豫中的引擎),记录并发 1、4、16 三档的 P50 与吞吐。对于正在选型的读者,建议先花半小时跑完这组自测,再回来核对本文的结论在你的负载上是否成立。

相关推荐

​Jev 详解:不做生成的判断模型
精选AI

​Jev 详解:不做生成的判断模型

Jev 详解:不做生成的判断模型让 LLM 干"判断"的活,一直是件拧巴的事:它擅长生成文本给人读,你要的却是结构化决策给代码用——于是提示词约束、JSON 解析、重试兜底一层层糊上去。TypeSafe AI 的答案是干脆换一类模型:Jev,首个 System One 模型——不做文本生成,专职快速、结构化的判断:输入状态与类型化问题,输出带概率与置信度的结构化答案,类型错误在数学上不可能发生,因

718
网站被注入恶意脚本排查实录:AI 辅助安全分析实战
置顶 精选AI

网站被注入恶意脚本排查实录:AI 辅助安全分析实战

网站被注入恶意脚本排查实录:AI 辅助安全分析实战某天收到华为云监管反馈,称个人博客网站存在色情违规界面。作为技术博主,这简直是晴天霹雳——网站一直正常运行,怎么会突然出现这类问题?经过排查发现,网站被注入了恶意跳转脚本。本文记录完整的排查过程,重点分享如何借助 AI 快速定位问题并修复,希望能给遇到类似情况的开发者提供参考。1、问题发现与初步排查收到监管反馈后,第一时间打开网站检查。首页看起来完

420
时隔三年,再次备份:从手搓博客到 AI 全面自动接管
精选AI

时隔三年,再次备份:从手搓博客到 AI 全面自动接管

时隔三年,再次备份:从手搓博客到 AI 全面自动接管今天打开尘封多年的备份目录,看到了一个熟悉的文件名——2023_07_09.sql。那一刻,恍如隔世。三年前的今天,我曾经认真地导出过一次数据库;三年后的今天——2026 年 7 月 9 日,自动备份启用。整整三年,1095 天,我的博客就这样安安静静地跑着,没有人备份,也没有人管,它就那么稳稳当当地活着。感慨万千,大概是此刻最准确的四个字——不

374