难度
进阶
从本地原型到线上服务,理解主流推理框架的定位差异、部署方式、监控指标与生产化注意事项。
难度
进阶
阅读时长
约 120 分钟
更新日期
2026/03/24
主题
推理优化 / 部署 / vLLM / TGI / Ollama
读完这篇教程后,你应该能:
如果你已经看过 KV Cache 与推理性能优化,这篇文章会把那些系统概念进一步落到部署实践。
很多人一上来就问“vLLM 和 TGI 哪个更快”,但真正应该先问的是:
我现在需要的是本地快速试验、团队内共享接口,还是线上高并发服务?
因为不同目标,对部署框架的要求完全不一样:
如果目标没想清楚,再多 benchmark 对决也很难帮你做决定。
从系统视角看,一个推理服务至少包含以下部分:
很多框架真正拉开差距的地方,并不是“会不会生成文字”,而是第 3、5、6 部分做得是否成熟。
先看一次请求在服务里的生命周期,会更容易理解后面为什么要盯住吞吐、延迟和监控:
<g>
<rect x="28" y="88" width="140" height="88" rx="18" fill="#e8f1ff" stroke="#98b7e1" />
<text x="98" y="122" text-anchor="middle" font-size="19" font-weight="700">API 请求</text>
<text x="98" y="148" text-anchor="middle" font-size="14" fill="#4b5563">HTTP / OpenAI</text>
</g>
<g>
<rect x="184" y="88" width="140" height="88" rx="18" fill="#fef3c7" stroke="#e2c36f" />
<text x="254" y="120" text-anchor="middle" font-size="18" font-weight="700">模板与预处理</text>
<text x="254" y="146" text-anchor="middle" font-size="14" fill="#4b5563">tokenizer / prompt</text>
</g>
<g>
<rect x="340" y="88" width="150" height="88" rx="18" fill="#e0f2e5" stroke="#8bc09b" />
<text x="415" y="120" text-anchor="middle" font-size="18" font-weight="700">调度与批处理</text>
<text x="415" y="146" text-anchor="middle" font-size="14" fill="#4b5563">queue / batching</text>
</g>
<g>
<rect x="506" y="88" width="160" height="88" rx="18" fill="#fce7ef" stroke="#e2a8bd" />
<text x="586" y="116" text-anchor="middle" font-size="18" font-weight="700">模型推理</text>
<text x="586" y="140" text-anchor="middle" font-size="14" fill="#4b5563">权重加载 / KV Cache</text>
<text x="586" y="162" text-anchor="middle" font-size="14" fill="#4b5563">prefill / decode</text>
</g>
<g>
<rect x="682" y="88" width="132" height="88" rx="18" fill="#ece8ff" stroke="#b5abef" />
<text x="748" y="120" text-anchor="middle" font-size="18" font-weight="700">解码采样</text>
<text x="748" y="146" text-anchor="middle" font-size="14" fill="#4b5563">temperature / top-p</text>
</g>
<g>
<rect x="830" y="88" width="122" height="88" rx="18" fill="#dff4f0" stroke="#8dc7bd" />
<text x="891" y="122" text-anchor="middle" font-size="19" font-weight="700">响应返回</text>
<text x="891" y="148" text-anchor="middle" font-size="14" fill="#4b5563">stream / metrics</text>
</g>
<line x1="168" y1="132" x2="184" y2="132" stroke="#5b6b7f" stroke-width="3" marker-end="url(#infer-arrow)" />
<line x1="324" y1="132" x2="340" y2="132" stroke="#5b6b7f" stroke-width="3" marker-end="url(#infer-arrow)" />
<line x1="490" y1="132" x2="506" y2="132" stroke="#5b6b7f" stroke-width="3" marker-end="url(#infer-arrow)" />
<line x1="666" y1="132" x2="682" y2="132" stroke="#5b6b7f" stroke-width="3" marker-end="url(#infer-arrow)" />
<line x1="814" y1="132" x2="830" y2="132" stroke="#5b6b7f" stroke-width="3" marker-end="url(#infer-arrow)" />
<rect x="28" y="224" width="924" height="62" rx="20" fill="#f4f7fb" stroke="#d7e2f1" />
<text x="490" y="248" text-anchor="middle" font-size="18" font-weight="700">服务化护栏</text>
<text x="490" y="272" text-anchor="middle" font-size="15" fill="#4b5563">日志 | 健康检查 | 超时取消 | 限流队列 | 监控告警 | 配置回滚</text>
</g>
Ollama 最大的优势是上手快。对很多开发者来说,它解决的是:
它比较适合:
它相对不那么适合的场景是:
也就是说,Ollama 很像一个非常顺手的“本地推理工作台”。
vLLM 之所以火,核心原因在于它把很多推理系统里最难做好的问题处理得比较成熟,例如:
所以 vLLM 很适合:
如果你的重点是“同一台 GPU 承担尽可能多的请求”,vLLM 通常是非常值得优先尝试的路线。
TGI(Text Generation Inference)在团队化部署里也很常见。它的优势通常体现在:
它往往比较适合:
从定位上说,TGI 和 vLLM 都能走向生产,但二者的工程重心和性能路径有所不同。
你可以先用下面这张简单判断表:
| 场景 | 更优先考虑 |
|---|---|
| 本地个人实验 | Ollama |
| 小团队快速开放 API | vLLM 或 Ollama |
| 高并发在线服务 | vLLM |
| Hugging Face 生态深度集成 | TGI |
| 需要长期标准化运维 | TGI 或 vLLM |
这不是绝对规则,但足够覆盖大多数第一轮决策。
一个务实的部署节奏通常如下:
这样做的价值在于:每次只引入一层复杂度,出了问题也容易定位。
如果你想快速起一个兼容 OpenAI API 的服务,常见启动方式会类似:
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-7B-Instruct \
--dtype bfloat16 \
--max-model-len 8192 \
--port 8000
起来之后,你就可以用普通 HTTP 请求访问:
curl http://127.0.0.1:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen2.5-7B-Instruct",
"messages": [{"role": "user", "content": "请解释一下什么是 FlashAttention"}],
"temperature": 0.2
}'
这一步的目标不是追求性能最优,而是先把“模型到接口”的闭环打通。
如果你更想快速验证本地开发流程,Ollama 的体验通常会更直接:
ollama run qwen2.5:7b
或者先启动服务,再通过应用或脚本访问它。它特别适合下面这种节奏:
它的短板并不是“不能用”,而是当你进入复杂并发和生产运维阶段后,很可能需要转向更专业的服务框架。
推理服务最容易出现的问题不是“完全不能用”,而是“偶尔特别慢、长请求拖垮整体、模型输出开始不稳定”。因此上线后建议至少监控:
如果没有这些指标,你很难判断问题出在:
框架并不是孤立选择。很多部署决策都和量化路线绑在一起:
所以一个更完整的部署判断是:
如果你还没有把量化思路理清,可以先读 模型量化入门:INT8、INT4、GPTQ 与 AWQ。
很多线上事故并不是模型能力本身造成的,而是下面这些基础设施细节:
这也是为什么“能跑起来”和“可上线”之间差着一整套工程化工作。
如果你是第一次把 LLM 服务交付给别人使用,建议至少补齐这些基本项:
这些东西看起来没有模型论文酷,但它们决定了服务是否可靠。
不同 prompt 长度、batch 方式、采样参数都会显著影响结果。没有统一基线,比较很容易失真。
如果 p99 很差,用户体验仍然会很糟。线上服务必须关注长尾延迟。
同一个模型如果前处理模板不一致,服务效果可能会看起来“突然变差”,但问题并不在框架本身。
新模型、新量化格式、新框架上线时,一定要有可快速切回旧版本的路径。
从相近主题继续深入,建立连续学习链路。