推理引擎:大模型生产的最后一公里
模型训练完成后,推理引擎决定了它能否高效地服务用户。同样的模型,用不同的推理引擎部署,吞吐量可能相差5-10倍。vLLM、SGLang和TensorRT-LLM是当前最主流的三大推理引擎,各有特色。
三大引擎概述
vLLM
vLLM由UC Berkeley团队开发,以PagedAttention技术闻名:
from vllm import LLM, SamplingParams
llm = LLM(
model="meta-llama/Meta-Llama-3-70B",
tensor_parallel_size=4, # 4卡张量并行
gpu_memory_utilization=0.90,
max_model_len=8192,
enable_prefix_caching=True, # 前缀缓存
swap_space=16, # CPU swap空间(GB)
)
sampling = SamplingParams(
temperature=0.7,
top_p=0.9,
max_tokens=512,
)
outputs = llm.generate(["你好,介绍一下自己"], sampling)
核心技术:
- PagedAttention:虚拟内存式KV Cache管理
- Continuous Batching:动态批处理
- Prefix Caching:共享前缀缓存
- 支持多种量化(AWQ、GPTQ、FP8)
SGLang
SGLang由UC Berkeley团队(vLLM部分成员)开发,专注于结构化生成:
import sglang as sgl
@sgl.function
def multi_step_reasoning(s, question):
s += "请分析以下问题:" + question
s += "第一步:理解问题" + sgl.gen("understanding", max_tokens=200)
s += "第二步:分析方案" + sgl.gen("analysis", max_tokens=300)
s += "第三步:结论" + sgl.gen("conclusion", max_tokens=200)
# RadixAttention自动缓存前缀
engine = sgl.Engine(
model_path="meta-llama/Meta-Llama-3-70B",
tp_size=4,
)
result = multi_step_reasoning.run(question="AI对就业市场的影响")
核心技术:
- RadixAttention:基于基数树的前缀缓存,比vLLM的前缀缓存更高效
- 结构化生成:JSON、正则表达式约束的生成
- 前端DSL:Python装饰器定义生成流程
- 多轮对话优化:对话前缀自动复用
TensorRT-LLM
NVIDIA官方推理引擎,与硬件深度优化:
import tensorrt_llm
from tensorrt_llm.runtime import ModelRunner
# 构建引擎(需先转换模型)
builder = tensorrt_llm.Builder()
config = builder.create_builder_config(
max_batch_size=128,
max_input_len=8192,
max_output_len=1024,
use_fp8=True, # FP8量化
use_paged_kv_cache=True,
tokens_per_block=128,
)
engine = builder.build_engine(model, config)
# 运行推理
runner = ModelRunner(engine)
outputs = runner.generate(
input_ids=input_ids,
sampling_config=sampling_config
)
核心技术:
- 算子融合:将多个操作融合为单个CUDA kernel
- INT8/FP8量化:NVIDIA硬件原生支持
- In-flight batching:NVIDIA版本的连续批处理
- 深度硬件优化:针对A100/H100/B200特定优化
性能对比
吞吐量
在Llama-3-70B(A100 80GB x 4)上的对比:
| 场景 | vLLM | SGLang | TensorRT-LLM |
|---|---|---|---|
| 短输入(128tok)短输出(32tok) | 3200 | 3500 | 4500 |
| 长输入(4Ktok)中输出(512tok) | 850 | 1100 | 1300 |
| 多轮对话(共享前缀) | 1200 | 1800 | 1200 |
| JSON结构化输出 | 600 | 900 | 550 |
延迟
| 指标 | vLLM | SGLang | TensorRT-LLM |
|---|---|---|---|
| 首token延迟(ms) | 45 | 35 | 25 |
| 每token延迟(ms) | 18 | 16 | 12 |
| P99延迟(ms) | 120 | 95 | 70 |
功能对比
| 功能 | vLLM | SGLang | TensorRT-LLM |
|---|---|---|---|
| 模型支持 | 最广 | 广 | 较窄(需转换) |
| 量化支持 | AWQ/GPTQ/FP8 | AWQ/FP8 | INT8/FP8(最佳) |
| 前缀缓存 | ✓ | ✓✓(更优) | ✓ |
| 结构化生成 | 有限 | 原生支持 | 有限 |
| 多LoRA | ✓ | ✓ | ✓ |
| 分布式推理 | TP/PP | TP | TP/PP |
| 部署难度 | 低 | 低 | 高(需构建引擎) |
| 开源协议 | Apache 2.0 | Apache 2.0 | Apache 2.0 |
各引擎的适用场景
vLLM:通用首选
# 适用场景:快速部署、多模型支持、通用推理
# 推荐用于:大多数生产环境的首选
# 最佳配置
config = {
"model": "your-model",
"tensor_parallel_size": 4,
"gpu_memory_utilization": 0.90,
"max_num_seqs": 256, # 最大并发序列
"max_model_len": 32768,
"enable_prefix_caching": True,
"quantization": None, # 或 "awq" / "fp8"
"enforce_eager": False, # 使用CUDA Graph优化
}
SGLang:结构化生成之王
# 适用场景:需要结构化输出、多轮对话、复杂生成流程
# 推荐用于:Agent应用、工具调用、JSON输出
@sgl.function
def agent_reasoning(s, user_input, tools):
s += system_prompt(user_input, tools)
# 结构化生成:保证输出是合法JSON
s += sgl.gen(
"action",
max_tokens=200,
regex=r'\{"tool":\s*"[^"]+",\s*"params":\s*\{[^}]*\}\}'
)
action = json.loads(s["action"])
if action["tool"] != "none":
result = execute_tool(action["tool"], action["params"])
s += f"工具结果:{result}\n"
s += sgl.gen("response", max_tokens=500)
return s
TensorRT-LLM:极致性能
# 适用场景:对延迟和吞吐量有极致要求
# 推荐用于:大规模API服务、NVIDIA硬件环境
# 最佳使用方式:
# 1. 使用NVIDIA Triton Inference Server + TensorRT-LLM后端
# 2. 预先构建引擎(非动态加载)
# 3. 启用FP8(需H100及以上)
# 构建脚本
build_command = """
python build.py \
--model_dir /models/llama-3-70b \
--dtype float16 \
--use_fp8 \
--world_size 4 \
--tp_size 4 \
--pp_size 1 \
--max_batch_size 128 \
--max_input_len 8192 \
--max_output_len 1024 \
--use_paged_kv_cache \
--tokens_per_block 128 \
--output_dir /engines/llama-3-70b-fp8
"""
部署架构
生产级部署方案
class ProductionDeployment:
def __init__(self, model_config):
self.config = model_config
def deploy(self):
return {
"frontend": {
"load_balancer": "Nginx / HAProxy",
"api_gateway": "FastAPI + rate limiting"
},
"inference": {
"engine": self._select_engine(),
"replicas": self._compute_replicas(),
"gpu_per_replica": self.config.gpu_per_replica,
},
"optimization": {
"prefix_caching": True,
"quantization": self.config.quantization,
"speculative_decoding": self._setup_speculative(),
},
"monitoring": {
"metrics": ["qps", "latency_p50", "latency_p99", "gpu_util"],
"alerting": "Prometheus + AlertManager",
"logging": "structured JSON logs"
}
}
def _select_engine(self):
if self.config.need_structured_output:
return "SGLang"
elif self.config.need_max_performance and self.config.gpu_type == "H100":
return "TensorRT-LLM"
else:
return "vLLM" # 默认选择
投机解码配置
def setup_speculative_decoding(target_model, draft_model):
"""配置投机解码"""
# vLLM中的投机解码
config = {
"model": target_model,
"speculative_model": draft_model, # 小模型做草稿
"num_speculative_tokens": 5, # 每次预测5个token
"speculative_max_model_len": 1024, # 草稿模型的最大长度
}
# 实测效果:
# Llama-3-70B + Llama-3-8B草稿
# 吞吐量提升:1.8-2.2x
# 延迟降低:1.5-1.8x
# 准确接受率:85-90%
成本优化
class CostOptimizer:
def optimize(self, workload_pattern):
"""根据负载模式优化成本"""
if workload_pattern["peak_to_avg_ratio"] > 3:
# 高峰谷比:需要快速扩缩容
return self._autoscaling_config()
elif workload_pattern["concurrent_users"] > 1000:
# 高并发:需要批处理优化
return self._batching_config()
else:
# 低负载:成本优先
return self._cost_first_config()
def _autoscaling_config(self):
return {
"min_replicas": 2,
"max_replicas": 10,
"scale_up_threshold": 0.7, # GPU利用率>70%扩容
"scale_down_threshold": 0.3, # GPU利用率<30%缩容
"scale_up_delay": 30, # 30秒后扩容
"scale_down_delay": 300, # 5分钟后缩容
}
选型决策树
需要结构化输出(JSON/正则)?
→ SGLang
NVIDIA H100 + 追求极致性能?
→ TensorRT-LLM
其他情况?
→ vLLM(安全选择)
结语
推理引擎的选择对大模型服务的性能和成本有决定性影响。vLLM是通用场景的安全选择,SGLang在结构化生成场景有明显优势,TensorRT-LLM在NVIDIA硬件上性能最强但部署复杂度最高。建议先用vLLM快速上线,再根据性能瓶颈和功能需求切换到更专业的引擎。记住:最好的引擎不是最快的,而是最适合你的负载特征和技术栈的。