深色模式
TGI / SGLang 推理引擎对比
摘要:vLLM 是"通用默认",但 TGI v3 与 SGLang 在特定负载下各有优势。本文对比两者的架构差异——TGI 的长 prompt 与 prefix caching、SGLang 的 RadixAttention 基树前缀复用与结构化编程——并给出选型决策树与生产命令。适用版本:TGI v3、SGLang v0.4.x(区间),命令以官方文档为准。
适用版本与前提
- TGI:HuggingFace Text Generation Inference v3 主线
- SGLang:v0.4.x 区间(检索显示 v0.4.x 已支持 DeepSeek-R1 等推理模型)
- 硬件:NVIDIA GPU 为主;两者均提供 Docker 镜像
- 读者已了解 KV Cache 与连续批处理(见本目录
vllm.md、continuous-batching.md)
核心概念:两者的 KV 复用思路不同
所有现代引擎都承认"KV Cache 是瓶颈资源",但复用策略分两派:
- TGI v3:在 HuggingFace 生态内做"生产级长 prompt 服务层",强调长上下文 prefill 路径、prefix caching、chunked prefill,适合长对话历史。
- SGLang:用 RadixAttention——把 KV Cache 按 token 前缀组织成基树(radix tree),相同前缀的请求直接命中已计算的 KV,命中率可在 50%–99% 区间(取决于前缀重复度)。它同时提供"前端 DSL + 后端运行时"分离,便于写结构化/带约束的生成。
一句话区分
TGI 偏"HF 生态里的长对话专家";SGLang 偏"前缀大量重复的结构化/Agent/RAG 专家"。如果你的流量里很多请求共享同一段 system prompt 或同一份检索文档,SGLang 的 radix 复用收益最大。
架构与原理对比
| 维度 | TGI v3 | SGLang |
|---|---|---|
| 核心创新 | 长 prompt 服务层、prefix caching、chunked prefill | RadixAttention(基树 KV 复用)、结构化编程 DSL |
| KV 策略 | paged KV + prefix cache | radix tree KV over prefixes |
| 典型强项 | 长上下文聊天、HF 模型兼容好 | Agent/工具链/RAG、多轮前缀复用高 |
| API | OpenAI 兼容 | OpenAI 兼容 |
| 短板 | 通用吞吐未必最优 | 生态较新、配置稍复杂、偏 Linux |
| 量化 | 支持(AWQ/GPTQ/bitsandbytes 等) | 支持(FP8/AWQ 等) |
厂商 benchmark 是"特定场景峰值"
检索到的 SGLang 宣称"结构化负载最高 ~6.4× 吞吐、~3.7× 更低延迟"、TGI v3 在长 prompt 上"相对 vLLM 最高 ~13×",这些都是特定 workload 的峰值,不是你在自己流量上必然得到的数。真实收益取决于你的前缀重复率、并发、长度分布。请在自己模型+自己流量上压测(见 perf-tuning.md)。
生产部署
TGI v3(以 Llama-3.1-8B 为例)
bash
# 拉取镜像(生产建议锁版本 tag)
docker pull ghcr.io/huggingface/text-generation-inference:latest
# 启动(TGI 用 --num-shard 做张量并行,旧参数名;新版也支持 --tensor-parallel-size)
docker run --gpus all --shm-size 1g -p 8080:80 \
-v /mnt/models:/data \
ghcr.io/huggingface/text-generation-inference:latest \
--model-id /data/Meta-Llama-3.1-8B-Instruct \
--max-input-length 8192 \
--max-total-tokens 16384 \
--max-batch-prefill-tokens 4096
# [版本相关] TGI 的并行参数名在不同版本有变化(--num-shard / --tensor-parallel-size),
# 以你所用地版本的官方文档为准。1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
bash
# 调用(TGI 自带 /v1 兼容与 /generate)
curl http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"/data/Meta-Llama-3.1-8B-Instruct",
"messages":[{"role":"user","content":"解释 RadixAttention"}],
"max_tokens":200}'1
2
3
4
5
6
2
3
4
5
6
SGLang(以 Llama-3.1-8B / 多卡为例)
bash
pip install sglang[all] # 或 docker 部署
# 单卡启动
python -m sglang.launch_server \
--model-path /models/Llama-3.1-8B-Instruct \
--host 0.0.0.0 --port 8000
# 双卡张量并行(如 70B)
python -m sglang.launch_server \
--model-path /models/Llama-3.1-70B-Instruct \
--host 0.0.0.0 --port 8000 \
--tp 2
# [版本相关] SGLang 用 --tp 表示 tensor parallel;参数以官方文档为准1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
python
# SGLang 前端 DSL 示例(结构化生成)
import sglang as sgl
@sgl.function
def classify(s, text):
s += sgl.system("你是分类助手")
s += sgl.user(text)
s += sgl.assistant(sgl.gen("label", max_tokens=16))
# 同一 system 前缀的多条请求会自动走 RadixAttention 复用
states = classify.run_batch([{"text": "好评"}, {"text": "差评"}])
# [版本相关] DSL API 随版本演进,以上为示意1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
验证
- TGI:看启动日志的
max_batch_prefill_tokens、吞吐与usage字段;用curl验证流式与/metrics(Prometheus)。 - SGLang:日志会显示 radix cache 命中统计;可用
--enable-metrics类开关暴露指标(以版本为准)。重点观察前缀命中率——低命中说明你的流量不适合 SGLang 的卖点。
回滚与清理
同引擎版本切换
TGI/SGLang 大版本可能改 API 行为与默认前缀缓存策略。升级前固定镜像 tag,灰度切流,保留回滚脚本。删除容器不影响宿主机权重目录。
故障排查
| 现象 | 可能原因 | 处理 |
|---|---|---|
| TGI OOM | --max-total-tokens 过大 | 调小 --max-input-length/--max-total-tokens |
| SGLang 命中率低 | 流量前缀重复少 | 评估是否退回 vLLM;或调整 prompt 设计增加共享前缀 |
| 长尾延迟高 | chunked prefill 未开/配置不当 | 确认 prefill 分块参数;长 prompt 用 TGI 更稳 |
| 多卡通信慢 | 跨节点走以太网 | TP 放在节点内(NVLink),PP 跨节点 |
安全与合规
- 两者都不自带强鉴权,必须放网关后加 API Key / mTLS。
- 成本防护同样依赖网关:限
max_tokens、输入长度、并发、QPS。 - 权重许可证(Llama/Qwen 社区许可)需遵守,尤其商用。
成本与性能(示意)
- TGI v3 在长对话(长系统前缀 + 多轮)上,prefix cache 能省下重复 prefill 算力,单位 token 成本下降明显[未实测,取决于重复度]。
- SGLang 在 RAG/Agent(每段请求都带同一检索文档或同一工具 schema)上,radix 命中高时 GPU 有效算力提升、单请求延迟下降[未实测]。
- 选型建议(决策树):HF 重度 + 长对话 → TGI v3;Agent/RAG/多轮前缀复用高 → SGLang;要通用默认 → vLLM(见
serving-overview.md)。