人工智能·
· 发布于 2026-02-20 19:39:30
大模型推理优化:vLLM vs. Text Generation Inference 对比实测
大模型推理优化实战:vLLM vs. TGI,我用 3 张 A100 踩出来的选型指南
大家好,我是后端团队里那个常年和 GPU 显存较劲的“显存管理员”。最近两个月,我们给内部知识库服务升级大模型推理后端,对比了 vLLM 和 Text Generation Inference(TGI) 两大主流方案。没看论文,只跑实测——吞吐量、P99 延迟、显存占用、上线速度,全在真实业务负载下压出来的数据。下面把完整过程、踩坑记录和结论一次性分享出来。
快速部署:从零到 API 只需 5 分钟?
# vLLM 部署(轻量、Python 原生)
我们用的是vLLM==0.4.2,直接 pip 安装 + 启动 HTTP 服务:
pip install vllm
python -m vllm.entrypoints.api_server \
--model meta-llama/Llama-3-8b-Instruct \
--tensor-parallel-size 2 \
--max-num-seqs 256 \
--gpu-memory-utilization 0.9 \
--port 8000
注意:
--gpu-memory-utilization不建议设为 1.0!实测 Llama-3-8B 在 A100 上设为 0.95 会导致 OOM,0.9 更稳。这个参数不是理论值,是实打实的“留白空间”。
# TGI 部署(Docker 优先,生产友好)
TGI 对容器化支持更成熟,我们用官方镜像 + 自定义 config:# Dockerfile.tgi
FROM ghcr.io/huggingface/text-generation-inference:2.0.4
COPY config.json /config.json
CMD ["/bin/sh", "-c", "text-generation-launcher --model-id meta-llama/Llama-3-8b-Instruct --num-shard 2 --max-concurrent-requests 512 --config /config.json"]
config.json 中启用了 FlashAttention-2 和 PagedAttention 等关键优化。

实测 Benchmark:A100 ×3,Llama-3-8B,真实请求混合负载(70% 128token prompt + 30% 512token)
| 指标 | vLLM | TGI | 说明 |
|---|---|---|---|
| 吞吐量(req/s) | 142 | 138 | 并发 256,batch_size=16,vLLM 略优但差距不明显 |
| P99 延迟(ms) | 412 | 438 | vLLM 在长输出场景下更稳定(得益于 PagedAttention 的连续块管理) |
| 峰值显存占用(GB) | 34.2 | 36.7 | vLLM 显存碎片更少;TGI 在 tokenizer worker 中额外缓存 tokenized 结果 |
| 冷启动时间 | < 8s | ~14s | TGI 加载 tokenizer + model + router 三阶段耗时更长 |
提示:延迟测试务必关闭
--enforce-eager(vLLM)或禁用CUDA_LAUNCH_BLOCKING=1,否则所有数据都会失真。我们最初就因这个参数多折腾了半天。
易用性 & 生产适配:谁更适合你的团队?
- vLLM 优势:
LLM 类进 FastAPI)
- 动态批处理 + PagedAttention 开箱即用,无需调参
- 日志清晰,错误堆栈直指 kernel 层问题(比如 CUDA error: device-side assert triggered)
- TGI 优势:
/health、指标暴露 /metrics(Prometheus-ready)
- 支持 Hugging Face Hub 模型自动下载 + 权限控制(.huggingface/credentials)
- 更成熟的滚动更新机制(配合 Kubernetes readiness probe)
我的真实踩坑总结
- vLLM 的
--max-model-len是个“温柔陷阱”:设小了会静默截断输入,设大了又浪费显存。我们最终用model.get_max_model_len()动态读取并加 10% buffer。 - TGI 的
--max-input-length和--max-total-tokens必须严格对齐:否则 batch 推理时部分请求会被丢弃且无日志提示。 - 两者都依赖 FlashAttention-2,但编译环境差异大。我们统一用
torch==2.3.1+cu121+flash-attn==2.5.8才稳定跑通。
总结与选型建议
- 如果你团队:Python 主导、快速验证 MVP、已有 FastAPI/Flask 架构 → 选 vLLM
- 如果你团队:已用 Kubernetes、需要细粒度监控告警、长期运维 > 快速上线 → 选 TGI
说实话,没有“绝对赢家”,只有“更匹配当前阶段的工具”。我们最终在预发环境用 vLLM 快速迭代,在生产环境切到了 TGI —— 不是因为它更强,而是它让 SRE 同学睡得更踏实。
欢迎在评论区聊聊你们的实测结果:你用的是什么模型?压测时最头疼的瓶颈是啥?有没有遇到过 CUDA_ERROR_OUT_OF_MEMORY 以外的诡异报错?一起填坑,少走弯路
暂无回复

