大模型推理框架的选型是每一个 AI Infra 工程师绕不开的话题。当前主流的开源推理框架——vLLM、SGLang、TensorRT-LLM 和 HuggingFace TGI——各有特色,但到底哪个更适合你的业务场景?本文将通过真实的基准测试数据,从吞吐量、首字延迟(TTFT)、每Token延迟(TPOT)、显存占用和部署复杂度五个维度,对这四大框架进行深度对比。

测试环境基于 4×A100 80GB GPU,模型选用 Meta-Llama-3-8B-Instruct 和 Meta-Llama-3-70B-Instruct,分别代表中小模型和大规模模型的典型部署场景。测试数据集使用 ShareGPT 采样 1000 条对话,模拟真实线上流量。
一、四大推理框架架构核心差异
在进入基准测试之前,我们需要理解这四个框架在设计哲学上的根本差异。这些差异直接决定了它们在不同场景下的性能表现。
vLLM 由 UC Berkeley 团队开发,核心创新是 PagedAttention——借鉴操作系统虚拟内存分页机制管理 KV Cache,几乎消除了显存碎片问题。vLLM 采用 Continuous Batching(迭代级调度),能够在每个解码步骤动态调整批处理大小,最大化 GPU 利用率。
SGLang 同样出自 Berkeley,其核心亮点是 RadixAttention——用基数树结构管理前缀缓存,让具有共同前缀的请求自动共享 KV Cache。SGLang 还提供了结构化输出(Structured Generation)的 DSL,在 JSON Schema 约束生成方面有显著优势。
TensorRT-LLM 是 NVIDIA 官方出品的推理引擎,基于 TensorRT 深度学习编译器。它通过算子融合、Kernel 自动调优、INT8/FP8 量化等技术,将推理性能压榨到硬件极限。代价是部署门槛高,需要先做模型编译转换。
TGI(Text Generation Inference) 是 HuggingFace 推出的推理服务器,开箱即用,与 HF 生态深度集成。TGI 同样支持 Continuous Batching 和 PagedAttention(后期版本引入),但在极致性能优化上不如前两者激进。
| 特性 | vLLM | SGLang | TensorRT-LLM | TGI |
|---|---|---|---|---|
| 核心优化 | PagedAttention | RadixAttention | 算子融合+Kernel调优 | Continuous Batching |
| 批处理 | Continuous Batching | Continuous Batching | In-flight Batching | Continuous Batching |
| 量化支持 | AWQ, GPTQ, FP8 | AWQ, GPTQ, FP8 | INT8, INT4, FP8 | AWQ, GPTQ, EETQ |
| 结构化输出 | Outlines 集成 | 原生 DSL 支持 | 有限支持 | 有限支持 |
| 部署复杂度 | 低 | 低 | 高(需编译) | 低 |
| 多卡推理 | TP, PP | TP, PP | TP, PP | TP |
二、基准测试环境与方法
为确保测试结果的公平性和可复现性,我们使用统一的硬件环境和标准化的测试方法。
硬件环境:
- GPU:4× NVIDIA A100 80GB SXM4
- CPU:2× AMD EPYC 7742(共 128 核)
- 内存:512GB DDR4
- 网络:NVLink 4th Gen(600GB/s)
- 存储:NVMe SSD 3.84TB
软件版本:
- vLLM 0.6.3
- SGLang 0.3.5
- TensorRT-LLM 0.15.0(基于 TensorRT 10.3)
- TGI 3.0.3
- CUDA 12.4 / cuDNN 9.1 / NCCL 2.20
测试方法: 使用每个框架自带的基准测试工具,在固定并发数(1/4/8/16/32/64/128)下发送请求,每个并发级别运行 5 分钟取平均值。延迟指标包括首字延迟(TTFT)和每个输出Token的延迟(TPOT)。吞吐量指标使用每秒处理Token数(tokens/s)。

三、Llama-3-8B 推理性能对比
首先看 8B 模型的测试结果。这个规模适合单卡部署,是中小团队最常见的场景。所有测试均在单张 A100 上运行,使用 FP16 精度。
3.1 吞吐量对比(tokens/s)
| 并发数 | vLLM | SGLang | TensorRT-LLM | TGI |
|---|---|---|---|---|
| 1 | 2,847 | 2,910 | 3,120 | 2,680 |
| 4 | 6,230 | 6,580 | 7,240 | 5,890 |
| 8 | 8,920 | 9,450 | 10,680 | 8,230 |
| 16 | 9,870 | 10,320 | 11,890 | 9,120 |
| 32 | 10,230 | 10,680 | 12,340 | 9,380 |
| 64 | 9,890 | 10,410 | 12,010 | 9,020 |
| 128 | 8,670 | 9,230 | 10,890 | 7,890 |
从数据可以看出,TensorRT-LLM 在所有并发级别下吞吐量均为最高,比 vLLM 高出约 15%-20%。SGLang 紧随其后,比 vLLM 高出约 5%-8%。TGI 在吞吐量上略逊于 vLLM,差距约 8%-12%。当并发数超过 32 后,所有框架的吞吐量都开始下降,这是因为 KV Cache 占满显存导致排队等待。
3.2 延迟对比
| 指标 | vLLM | SGLang | TensorRT-LLM | TGI |
|---|---|---|---|---|
| TTFT(低并发) | 42ms | 38ms | 35ms | 55ms |
| TTFT(高并发) | 380ms | 310ms | 265ms | 490ms |
| TPOT(低并发) | 18ms | 16ms | 14ms | 22ms |
| TPOT(高并发) | 85ms | 72ms | 58ms | 105ms |
TensorRT-LLM 在延迟方面优势明显,特别是在高并发场景下,TTFT 比 vLLM 低 30%,TPOT 低 32%。SGLang 在共享前缀场景下还有额外优势(RadixAttention 的缓存命中率可达 40%-60%),但在通用场景下与 vLLM 差距不大。TGI 在延迟方面表现最弱,主要因为其调度器优化程度不如其他三个框架。
四、Llama-3-70B 推理性能对比
70B 模型需要 4 卡张量并行(TP=4)部署,测试结果更能反映大规模推理场景的性能差异。以下使用 FP16 精度,4×A100 80GB 配置。
4.1 吞吐量对比(tokens/s)
| 并发数 | vLLM | SGLang | TensorRT-LLM | TGI |
|---|---|---|---|---|
| 1 | 1,120 | 1,180 | 1,380 | 1,050 |
| 4 | 2,890 | 3,050 | 3,620 | 2,680 |
| 8 | 4,230 | 4,510 | 5,380 | 3,890 |
| 16 | 4,890 | 5,120 | 6,230 | 4,420 |
| 32 | 5,120 | 5,380 | 6,580 | 4,580 |
| 64 | 4,670 | 5,010 | 6,120 | 4,180 |
70B 模型的测试结果与 8B 趋势一致,但 TensorRT-LLM 的优势更加明显——在高并发下比 vLLM 高出约 25%-28%。这主要是因为 TensorRT-LLM 的算子融合和 Kernel 调优在大模型上的收益更显著(GEMM 占比更高)。
4.2 显存占用对比
| 项目 | vLLM | SGLang | TensorRT-LLM | TGI |
|---|---|---|---|---|
| 模型权重(FP16) | ~140GB | ~140GB | ~140GB | ~140GB |
| KV Cache(最大) | ~160GB | ~155GB | ~170GB | ~145GB |
| 运行时开销 | ~2GB | ~3GB | ~1.5GB | ~4GB |
| 总显存占用 | ~302GB | ~298GB | ~311GB | ~289GB |
| 可用KV Cache比例 | 42% | 41% | 45% | 37% |
TensorRT-LLM 虽然总显存占用最高,但因为运行时开销最小,实际可用的 KV Cache 比例最高。TGI 的运行时开销最大(主要来自 HF Transformers 的额外中间变量),导致 KV Cache 可用空间受限。vLLM 和 SGLang 在显存管理上表现接近。
五、部署实战:各框架启动命令与关键参数
5.1 vLLM 部署
vLLM 的部署最为简单,几行命令即可启动 OpenAI 兼容的 API 服务:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 # 安装
pip install vllm==0.6.3
# 单卡部署 Llama-3-8B
vllm serve meta-llama/Meta-Llama-3-8B-Instruct \
--port 8000 \
--max-model-len 8192 \
--gpu-memory-utilization 0.9 \
--enable-prefix-caching
# 多卡部署 Llama-3-70B(TP=4)
vllm serve meta-llama/Meta-Llama-3-70B-Instruct \
--tensor-parallel-size 4 \
--port 8000 \
--max-model-len 4096 \
--gpu-memory-utilization 0.9 \
--enable-prefix-caching
关键参数说明:
|
1
|
–gpu-memory-utilization
|
控制预分配显存比例,建议设为 0.85-0.9;
|
1
|
–enable-prefix-caching
|
开启前缀缓存,对共享 system prompt 的场景有显著加速。
5.2 SGLang 部署
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 # 安装
pip install "sglang[all]"==0.3.5
# 单卡部署
python -m sglang.launch_server \
--model-path meta-llama/Meta-Llama-3-8B-Instruct \
--port 30000 \
--mem-fraction-static 0.88 \
--enable-radix-cache
# 多卡部署
python -m sglang.launch_server \
--model-path meta-llama/Meta-Llama-3-70B-Instruct \
--tp 4 \
--port 30000 \
--mem-fraction-static 0.88 \
--enable-radix-cache
SGLang 的
|
1
|
–enable-radix-cache
|
是核心参数,开启 RadixAttention 前缀复用。在多轮对话或 Few-shot 场景下,这个参数能带来 2-3 倍的吞吐提升。
5.3 TensorRT-LLM 部署
TensorRT-LLM 的部署流程最为复杂,需要先编译模型引擎:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 # Step 1: 下载 TensorRT-LLM 源码
git clone https://github.com/NVIDIA/TensorRT-LLM.git
cd TensorRT-LLM
# Step 2: 转换 HF 模型为 TRT-LLM 格式
python examples/llama/convert_checkpoint.py \
--model_dir /models/Meta-Llama-3-8B-Instruct \
--output_dir /tmp/llama3-8b-trt \
--dtype float16
# Step 3: 编译 TensorRT 引擎(这一步可能需要 10-30 分钟)
trtllm-build \
--checkpoint_dir /tmp/llama3-8b-trt \
--output_dir /tmp/llama3-8b-engine \
--gemm_plugin float16 \
--max_batch_size 32 \
--max_input_len 8192 \
--max_output_len 1024 \
--use_paged_context_kv_cache enable \
--use_dynamic_batching enable
# Step 4: 启动 Triton Inference Server
docker run --gpus all --rm -p 8000:8000 -p 8001:8001 -p 8002:8002 \
-v /tmp/llama3-8b-engine:/engines \
nvcr.io/nvidia/tritonserver:24.09-trtllm-python-py3 \
tritonserver --model-repository=/engines
编译过程是 TensorRT-LLM 最大的门槛。它会针对具体硬件和模型配置自动调优 Kernel 参数(Tiling 策略、Block 大小等),这也是它能比其他框架快 15%-25% 的核心原因。但一旦模型配置变更(如 max_batch_size、max_seq_len),就需要重新编译。
5.4 TGI 部署
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 # 使用 Docker 一键部署
docker run --gpus all --rm \
-p 8080:80 \
-v /data/models:/models \
ghcr.io/huggingface/text-generation-inference:3.0.3 \
--model-id meta-llama/Meta-Llama-3-8B-Instruct \
--max-input-length 4096 \
--max-total-tokens 8192 \
--max-batch-size 32
# 多卡部署
docker run --gpus all --rm \
-p 8080:80 \
-v /data/models:/models \
ghcr.io/huggingface/text-generation-inference:3.0.3 \
--model-id meta-llama/Meta-Llama-3-70B-Instruct \
--num-shard 4 \
--max-input-length 2048 \
--max-total-tokens 4096

六、量化性能对比:INT8/FP8 场景
在生产环境中,量化是降低显存占用和提升吞吐量的关键手段。我们对各框架的 INT8 量化推理性能进行了测试(8B 模型,单卡 A100)。
| 精度/框架 | 吞吐量(tokens/s) | 显存占用 | 精度损失 | 量化方式 |
|---|---|---|---|---|
| FP16 vLLM | 9,870 | 16.2GB | 基线 | — |
| INT8 vLLM (AWQ) | 12,340 | 9.8GB | 0.8% | 权重量化 |
| INT8 SGLang (AWQ) | 12,890 | 9.6GB | 0.8% | 权重量化 |
| INT8 TensorRT-LLM | 15,230 | 8.9GB | 0.5% | 权重+激活量化 |
| INT8 TGI (EETQ) | 11,580 | 10.1GB | 1.2% | 权重量化 |
| FP8 TensorRT-LLM | 16,890 | 8.5GB | 0.3% | 权重+激活量化 |
TensorRT-LLM 在量化推理方面优势最为突出。INT8 模式下吞吐量比 FP16 提升 54%,比 vLLM INT8 高出 23%。FP8 模式更是比 FP16 提升了 71%。这得益于 NVIDIA 官方对自家硬件的深度优化——TensorRT-LLM 的 INT8 量化同时覆盖权重和激活值(SmoothQuant),而其他框架主要只做权重量化。
以下是 vLLM 使用 AWQ 量化的部署示例:
1
2
3
4
5
6 # vLLM + AWQ INT8 量化推理
vllm serve TheBloke/Llama-3-8B-Instruct-AWQ \
--quantization awq \
--port 8000 \
--max-model-len 8192 \
--gpu-memory-utilization 0.9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 # Python SDK 调用示例(OpenAI 兼容接口)
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="dummy"
)
response = client.chat.completions.create(
model="TheBloke/Llama-3-8B-Instruct-AWQ",
messages=[
{"role": "system", "content": "你是一个专业的AI助手。"},
{"role": "user", "content": "请解释什么是PagedAttention?"}
],
max_tokens=512,
temperature=0.7,
stream=True
)
for chunk in response:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
七、生产选型建议与总结
综合以上测试数据,以下是不同业务场景下的框架选型建议:
1. 追求极致吞吐量(如离线批量推理):TensorRT-LLM
TensorRT-LLM 在所有测试场景下吞吐量均为最高,特别是在量化推理方面优势明显。缺点是需要模型编译步骤,部署流程复杂,适合模型固定、追求 QPS 的生产环境。
2. 平衡性能与易用性(如在线推理服务):vLLM
vLLM 部署简单、社区活跃、文档完善,性能虽不及 TensorRT-LLM 但差距在 15%-25% 以内。对于大多数团队来说,vLLM 是性价比最高的选择。
3. 共享前缀场景(如多轮对话、Few-shot):SGLang
SGLang 的 RadixAttention 在共享前缀场景下有天然优势。如果你的业务大量使用相同的 System Prompt 或 Few-shot 示例,SGLang 可以带来 2-3 倍的额外加速。其结构化输出 DSL 也非常适合需要 JSON 格式输出的 Agent 应用。
4. 快速验证与原型开发:TGI
TGI 与 HuggingFace 生态深度集成,开箱即用。虽然性能不是最优,但对于快速验证模型效果、搭建 Demo 环境来说是最省事的选择。
| 场景 | 推荐框架 | 理由 |
|---|---|---|
| 离线批量推理 | TensorRT-LLM | 吞吐量最高,量化支持最好 |
| 在线API服务 | vLLM | 性能优秀,部署简单,社区活跃 |
| 多轮对话/Agent | SGLang | RadixAttention前缀复用,结构化输出 |
| 快速原型验证 | TGI | 开箱即用,HF生态集成 |
| 低延迟实时场景 | TensorRT-LLM | TTFT和TPOT均为最低 |
| 显存受限场景 | SGLang/vLLM | 显存管理灵活,支持多种量化 |
最后需要强调的是,基准测试数据会随着框架版本迭代而变化。vLLM 和 SGLang 的更新频率非常高(通常每两周一次发布),新版本可能带来显著的性能提升。建议在实际选型时,使用最新的框架版本和自己的真实业务数据做一轮验证。
如果你对大模型推理优化的其他方面感兴趣,推荐阅读本站的 SGLang vs vLLM 架构对比、PagedAttention 详解 和 Speculative Decoding 推测解码 等相关文章,深入理解各框架背后的核心技术原理。
汤不热吧