推理引擎:大模型生产的最后一公里

模型训练完成后,推理引擎决定了它能否高效地服务用户。同样的模型,用不同的推理引擎部署,吞吐量可能相差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)上的对比:

场景vLLMSGLangTensorRT-LLM
短输入(128tok)短输出(32tok)320035004500
长输入(4Ktok)中输出(512tok)85011001300
多轮对话(共享前缀)120018001200
JSON结构化输出600900550

延迟

指标vLLMSGLangTensorRT-LLM
首token延迟(ms)453525
每token延迟(ms)181612
P99延迟(ms)1209570

功能对比

功能vLLMSGLangTensorRT-LLM
模型支持最广广较窄(需转换)
量化支持AWQ/GPTQ/FP8AWQ/FP8INT8/FP8(最佳)
前缀缓存✓✓(更优)
结构化生成有限原生支持有限
多LoRA
分布式推理TP/PPTPTP/PP
部署难度高(需构建引擎)
开源协议Apache 2.0Apache 2.0Apache 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快速上线,再根据性能瓶颈和功能需求切换到更专业的引擎。记住:最好的引擎不是最快的,而是最适合你的负载特征和技术栈的。