【推理与部署篇01】模型推理框架深度对比

🎯 模型推理框架深度对比:vLLM、SGLang、TGI与TensorRT-LLM

2026年推理框架格局已定:vLLM成GPU部署默认首选、SGLang以RadixAttention实现多轮对话吞吐量超vLLM 5倍、TensorRT-LLM 在FP8模式下吞吐达H100峰值推理的85%——选错引擎可能让GPU算力浪费50%以上


📑 目录


一、推理框架全景图

1.1 2026年推理引擎格局

推理引擎市场(按部署量占比)

vLLM                   ████████████████████ 45%  ← GPU部署默认首选
TensorRT-LLM           ████████████         25%  ← 极致性能
SGLang                 ████████             17%  ← 高吞吐增长最快
TGI                    ████                8%   ← HuggingFace生态
Ollama                 ███                  5%   ← 本地部署
其他(XInference/LLMDeploy等)               <5%

1.2 核心架构差异速览

引擎核心创新底层框架显存管理批处理策略量化支持
vLLMPagedAttentionPyTorch + CUDA95%+ 利用率Continuous BatchingAWQ/GPTQ/FP8
SGLangRadixAttentionPyTorch + CUDA前缀共享缓存结构化批处理AWQ/GPTQ/FP8/FP4/MXFP4
TensorRT-LLM内核级编译优化TensorRT/CUDA C++依赖编译优化In-flight BatchingFP8/FP4/INT4
TGI动态拆分批处理Rust + PyTorch常规管理Continuous BatchingAWQ/GPTQ
Ollamallama.cpp封装Go + C++GGUF格式管理简单批处理GGUF全系列
LMDeployTurboMindPyTorch + CUDA动态量化Continuous Batching4-bit KV Cache
XInference分离式部署Xoscar + FastAPI预填充/解码分离深度集成vLLMAWQ/GPTQ

二、vLLM:GPU部署默认首选

2.1 核心架构:PagedAttention

vLLM(Vectorized Large Language Model Serving System)由UC Berkeley开发,其核心创新PagedAttention受操作系统内存分页机制启发,将KV Cache拆分为固定尺寸的「页」,实现显存空间的动态调度与高效复用 [1]。

PagedAttention vs 传统方案

传统方案:
┌──────────────────────────┐  ← 连续显存分配
│  Request A:  ████████    │     40% 碎片化
│  Request B:       ██████ │     20% 预留
│  空闲:           ░░░░    │
└──────────────────────────┘  显存利用率 ≈ 60%

PagedAttention:
┌──────────────────────────┐  ← 非连续页分配
│  A1 ██  A2 ██  B1 ██     │
│  B2 ██  A3 ██  B3 ██     │     碎片 < 5%
│  (动态调页, 几乎无浪费)    │
└──────────────────────────┘  显存利用率 ≈ 95%+

2.2 vLLM性能基准

模型GPUBatch SizeThroughputTTFTTPOT
Llama-3.1-8B1×H100325,280 tok/s45ms8ms
Qwen3-32B-AWQ1×H100162,150 tok/s72ms15ms
DeepSeek V4-Flash4×H100641,850 tok/s95ms22ms
DeepSeek V4-Pro8×H100128820 tok/s123ms48ms
Llama 4 Maverick8×H10064680 tok/s194ms58ms

2.3 vLLM部署实战

# vLLM 服务端启动
from vllm import LLM, SamplingParams
from vllm import AsyncLLMEngine, AsyncEngineArgs

# 同步推理
llm = LLM(
    model="deepseek-ai/DeepSeek-V4-Pro",
    tensor_parallel_size=8,       # 8卡张量并行
    quantization="awq",           # AWQ 4-bit量化
    dtype="float16",
    gpu_memory_utilization=0.95,  # 95% 显存利用率
    max_model_len=32768,          # 32K上下文
    enable_prefix_caching=True,   # 前缀缓存
    trust_remote_code=True,
)

sampling_params = SamplingParams(
    temperature=0.7,
    top_p=0.95,
    max_tokens=2048,
)

outputs = llm.generate(["什么是大模型推理优化?"], sampling_params)
print(outputs[0].outputs[0].text)
# vLLM启动API服务
python -m vllm.entrypoints.openai.api_server \
    --model deepseek-ai/DeepSeek-V4-Pro \
    --tensor-parallel-size 8 \
    --quantization awq \
    --max-model-len 32768 \
    --gpu-memory-utilization 0.95 \
    --enable-prefix-caching \
    --port 8000

2.4 vLLM关键技术特性

特性说明实测效果
PagedAttention分页管理KV Cache显存利用率从60%→95%+
Continuous Batching请求实时插入处理队列吞吐量提升2-4x
Prefix Caching自动缓存公共前缀系统消息重复场景提速50%+
Speculative Decoding投机解码加速小模型辅助大模型,加速1.5-3x
Chunked Prefill预填充分块处理减少TTFT,优化首字延迟
Multi-LoRA动态切换LoRA单GPU服务多个LoRA适配器

2.5 适用场景与优缺点

优势

  • 生态最成熟,支持模型最多(HuggingFace 90%+模型开箱即用)
  • Continuous Batching 在高并发场景下吞吐最高
  • PagedAttention 显存效率业界最佳
  • 文档完善,社区活跃

劣势

  • 首次部署冷启动较慢(需编译CUDA kernel)
  • Prefix Caching 不如 SGLang 的 RadixAttention 高效
  • FP8/FP4 量化支持不如 TensorRT-LLM 成熟

三、SGLang:RadixAttention高吞吐引擎

3.1 核心架构:RadixAttention

SGLang同样来自UC Berkeley,但其核心创新RadixAttention使用基数树(Radix Tree)对KV Cache的公共前缀进行高效复用 [2]。不同于vLLM在推理结束后丢弃缓存,SGLang持久化保留KV状态于基数树结构中。

RadixAttention vs PagedAttention

vLLM PagedAttention:
请求: "什么是大模型_"
      "什么是大模型推_"
      "什么是大模型推理_"
缓存: 每轮都重新计算公共前缀 "什么是大模型"
      ❌ 无法跨请求复用

SGLang RadixAttention:
                       ┌─ "推" → 分支缓存
"什么是大模型" → 基数树 ─├─ "评" → 分支缓存
                       └─ "部" → 分支缓存
      公共前缀只需计算一次,后续请求命中前缀直接复用!
      多轮对话场景吞吐量提升达 5倍

3.2 SGLang结构化输出

SGLang的核心差异化能力是结构化输出(Structured Output)——通过正则表达式或JSON Schema约束解码过程,直接生成符合规范的格式:

import sglang as sgl
from sglang import function, system, user, assistant, gen, set_default_backend


@sgl.function
def extract_json(s):
    """结构化JSON输出"""
    s += system("你是一个数据分析助手,必须输出JSON格式。")
    s += user(s.input_text)
    s += assistant(
        gen(
            name="answer",
            max_tokens=512,
            temperature=0.1,
            # 正则约束:只生成合法的JSON对象
            regex=r'\{\n\s+"name": "[^"]+",\n\s+"age": \d+,\n\s+"city": "[^"]+"\n\}'
        )
    )


@sgl.function
def multi_turn_chat(s):
    """多轮对话 - RadixAttention缓存前缀"""
    s += system("你是一个有帮助的AI助手。")
    
    for turn in range(5):
        s += user(s.user_inputs[turn])
        s += assistant(gen(f"response_{turn}", max_tokens=256))
    # 整个对话前缀被缓存,后续重复调用极大加速!
# SGLang启动服务
python -m sglang.launch_server \
    --model deepseek-ai/DeepSeek-V4-Pro \
    --tp 8 \
    --quantization fp8 \
    --max-model-len 65536 \
    --host 0.0.0.0 \
    --port 30000 \
    --trust-remote-code

3.3 SGLang vs vLLM 基准测试

场景指标vLLMSGLang优势
多轮对话 (5轮)Throughput1,200 req/min3,600 req/minSGLang 3x
多轮对话 (10轮)Throughput480 req/min2,400 req/minSGLang 5x
单轮高并发 (64并发)Throughput4,800 tok/s5,200 tok/s接近
结构化输出 (JSON)Latency P50220ms85msSGLang 2.6x
前缀命中复用缓存命中率~40%~85%SGLang 2x
长上下文 (32K)首字延迟340ms280msSGLang 18%

3.4 RadixAttention API实现

class RadixAttention:
    """
    RadixAttention简化实现
    
    核心:用基数树管理KV Cache前缀,支持高效共享和驱逐
    """
    class RadixNode:
        def __init__(self):
            self.children = {}  # token → RadixNode
            self.kv_cache = None  # 缓存的KV状态
            self.last_access = 0  # LRU时间戳
            self.ref_count = 0  # 引用计数
    
    def __init__(self, max_cache_size_gb=32):
        self.root = self.RadixNode()
        self.max_cache_size = max_cache_size_gb * 1024**3
        self.current_cache_size = 0
    
    def insert_prefix(self, token_ids, kv_cache):
        """将前缀插入基数树"""
        node = self.root
        for tid in token_ids:
            if tid not in node.children:
                node.children[tid] = self.RadixNode()
            node = node.children[tid]
        
        # 更新或插入KV缓存
        if node.kv_cache is None:
            node.kv_cache = kv_cache
            self.current_cache_size += self._cache_size(kv_cache)
            node.ref_count = 1
        else:
            node.ref_count += 1
        
        node.last_access = time.time()
        
        # 检查缓存是否超限,触发LRU驱逐
        self._evict_if_needed()
    
    def find_longest_prefix(self, token_ids):
        """查找最长匹配前缀"""
        node = self.root
        match_length = 0
        
        for i, tid in enumerate(token_ids):
            if tid in node.children:
                node = node.children[tid]
                if node.kv_cache is not None:
                    match_length = i + 1
            else:
                break
        
        return match_length, node.kv_cache if match_length > 0 else None
    
    def _evict_if_needed(self):
        """LRU驱逐:超限时淘汰最近最少使用的节点"""
        if self.current_cache_size <= self.max_cache_size:
            return
        
        # 收集所有可驱逐节点
        candidates = []
        def collect(node):
            if node.kv_cache is not None and node.ref_count == 0:
                candidates.append((node.last_access, node))
            for child in node.children.values():
                collect(child)
        collect(self.root)
        
        # 按LRU排序驱逐
        candidates.sort(key=lambda x: x[0])
        for _, node in candidates:
            if self.current_cache_size <= self.max_cache_size:
                break
            self.current_cache_size -= self._cache_size(node.kv_cache)
            node.kv_cache = None

3.5 适用场景

SGLang的优势场景

  • 🥇 多轮对话系统(RadixAttention 3-5x领先)
  • 🥇 结构化输出(JSON/XML等正则约束解码)
  • 🥇 高并发API服务
  • 🥇 长上下文推理(Radix前缀共享)

劣势

  • 社区规模小于vLLM,模型兼容性略差
  • 文档和教程不如vLLM丰富
  • 不支持的模型可能需要手写适配

四、TensorRT-LLM:NVIDIA极致性能引擎

4.1 核心优势:编译优化+硬件极致利用

TensorRT-LLM是NVIDIA基于TensorRT构建的推理引擎,其核心优势在于离线编译优化——将模型转换为高度优化的TensorRT引擎,释放GPU的全部算力 [3]。

TensorRT-LLM优化流程

模型(Float16) → 量化(FP8/INT4) → 图优化(kernel融合) → 内存优化(显存池化)
                                      ↓
                              TensorRT引擎文件(.engine)
                                      ↓
                             推理服务(Inflight Batching)

4.2 性能基准:FP8量化下的极致吞吐

模型GPU模式Throughput vs vLLM相对延迟
Llama-3.1-70B8×H100FP8+35%低22%
Llama-3.1-70B8×H100INT4+40%低28%
Qwen3-72B8×H100FP8+32%低20%
DeepSeek V4-Flash4×H100FP8+25%低18%
TensorRT-LLM FP8 吞吐量达 H100 峰值FLOP/s的 85%
vLLM 同等配置约为 65-70%
差距主要来自:内核级算子融合 + 内存访问优化

4.3 TensorRT-LLM部署

# 1. 构建TensorRT引擎(离线编译,耗时约30-60分钟)
trtllm-build \
    --model_dir deepseek-ai/DeepSeek-V4-Flash \
    --checkpoint_dir ./ckpt \
    --output_dir ./trt_engines \
    --dtype bfloat16 \
    --quantization fp8 \
    --use_fused_mlp \
    --max_batch_size 64 \
    --max_input_len 32768 \
    --max_output_len 4096 \
    --max_num_tokens 8192 \
    --gemm_plugin fp8

# 2. 启动推理服务(加载编译好的.engine文件)
python -m tensorrt_llm.commands.serve \
    --engine_dir ./trt_engines \
    --tokenizer_dir deepseek-ai/DeepSeek-V4-Flash \
    --max_batch_size 64 \
    --tensor_parallel_size 4 \
    --port 8000
# Python API调用
from tensorrt_llm import LLM, SamplingParams

llm = LLM(
    engine_dir="./trt_engines",
    tokenizer_dir="deepseek-ai/DeepSeek-V4-Flash",
)

sampling_params = SamplingParams(
    temperature=0.7,
    top_p=0.95,
    max_tokens=2048,
)

output = llm.generate("TensorRT-LLM推理优化原理", sampling_params)
print(output.text)

4.4 适用场景

优势

  • 🥇 极致延迟敏感场景(金融交易、实时交互)
  • 🥇 FP8/FP4量化的硬件极致利用(85%+峰值利用率)
  • 🥇 最大吞吐场景(批量推理吞吐最高)
  • 🥇 生产环境长期运行(编译一次跑一年)

劣势

  • ❌ 冷启动慢:每次模型更新需重新编译引擎(30-60分钟)
  • ❌ 调试困难:编译后为黑盒,问题定位难
  • ❌ 灵活性差:模型结构变(如新增LoRA)需要重新编译
  • ❌ 仅支持NVIDIA GPU

五、TGI:HuggingFace生态集成引擎

5.1 核心定位:与HuggingFace生态无缝集成

TGI(Text Generation Inference)由HuggingFace开发,核心优势不在于极致性能,而在于与HuggingFace生态的深度集成——一键部署、自动下载模型、支持快速实现热更新 [4]。

# TGI部署——只需一行代码
model=deepseek-ai/DeepSeek-V4-Flash
volume=$PWD/data

docker run --gpus all -p 8080:80 \
    -v $volume:/data \
    ghcr.io/huggingface/text-generation-inference:latest \
    --model-id $model \
    --num-shard 4 \
    --quantize awq \
    --max-total-tokens 32768 \
    --max-batch-prefill-tokens 8192

5.2 特性对比

特性TGIvLLMSGLang
模型自动下载✅ HuggingFace Hub❌ 需手动下载❌ 需手动下载
消息API✅ OpenAI兼容✅ OpenAI兼容✅ OpenAI兼容
量化支持AWQ/GPTQAWQ/GPTQ/FP8AWQ/GPTQ/FP8/FP4
推理加速Flash Attention+CUDA内核PagedAttentionRadixAttention
流式输出
函数调用✅ 原生支持
显存效率⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
吞吐性能⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

5.3 适用场景

适合:快速原型验证、HuggingFace生态用户、中小规模部署
不适合:极致性能需求、大规模生产环境


六、Ollama与本地部署方案

6.1 Ollama:傻瓜式本地推理

Ollama是目前最流行的本地推理平台,其核心理念是零配置——一条命令即可在本地运行大模型 [5]。

# 安装(一行命令)
curl -fsSL https://ollama.com/install.sh | sh  # Linux/Mac
# Windows: 下载安装包 ollama.com/download

# 运行模型
ollama run qwen3:8b              # 7B模型
ollama run deepseek-v4-flash     # 284B MoE(需要空间)
ollama run llama4-scout          # 17B多模态

# 自定义Modelfile
cat > Modelfile << 'EOF'
FROM qwen3:32b
PARAMETER temperature 0.7
PARAMETER top_p 0.9
PARAMETER num_ctx 32768
SYSTEM "你是一个中文AI助手,用简洁的语言回答问题。"
EOF

ollama create my-qwen3 -f Modelfile
ollama run my-qwen3

# API服务
ollama serve  # 默认端口 11434
curl http://localhost:11434/api/generate -d '{
  "model": "qwen3:8b",
  "prompt": "什么是模型量化?"
}'

6.2 llama.cpp + GGUF:CPU/边缘推理之王

对于没有GPU或者要在CPU/边缘设备上运行的用户,llama.cpp + GGUF是不可替代的方案:

# 编译llama.cpp(支持CUDA加速)
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp && mkdir build && cd build
cmake .. -DLLAMA_CUDA=ON -DLLAMA_METAL=ON  # GPU加速
cmake --build . --config Release

# 下载GGUF格式模型
# HuggingFace上有大量预量化模型(TheBloke等)

# 推理
./bin/main \
    -m qwen3-8b-q4_k_m.gguf \
    -p "大模型推理优化技术有哪些?" \
    -n 256 \
    --temp 0.7 \
    --top-p 0.9 \
    --threads 8 \
    -ngl 33  # 将33层放在GPU(如果需要GPU加速)

6.3 本地vs云端推理成本对比

场景方案硬件成本吞吐量适用人群
个人日常Ollama + Qwen3-8BRTX 3060 (12GB)$0电费42 tok/s个人开发者
本地开发Ollama + Qwen3.6-35B Q4RTX 3090 (24GB)$0电费120 tok/s独立开发者
小型团队vLLM + Qwen3-32B1×L40S (48GB)$1,080/月450 tok/s初创团队
中型服务SGLang + DeepSeek V4-Flash4×A100$6,336/月1,850 tok/s中型企业
大型服务TensorRT-LLM + V4-Pro8×H100$22,176/月4,200 tok/s大规模生产

省钱的真相:如果月均API调用<100万次,本地部署的硬件折旧成本反而更高。只有当日均调用量>10万次延迟敏感时,自建才真正划算。


七、国产方案:LMDeploy与昇腾平台

7.1 LMDeploy:国产GPU推理首选

LMDeploy由上海人工智能实验室开发,专注于大语言模型和视觉语言模型的部署,对昇腾等国产硬件深度适配 [6]。

# LMDeploy部署
pip install lmdeploy

# 1. 一键部署HuggingFace模型
lmdeploy serve api_server \
    Qwen/Qwen3-7B-Chat \
    --server-port 8000 \
    --tp 1 \
    --cache-max-entry-count 0.8

# 2. 使用TurboMind引擎(4-bit推理加速)
lmdeploy serve api_server \
    /path/to/model \
    --backend turbomind \
    --tp 2 \
    --quant-policy 4  # 4-bit KV Cache量化

# 3. 昇腾NPU适配
lmdeploy serve api_server \
    /path/to/model \
    --device npu \
    --tp 2

7.2 昇腾推理栈

昇腾AI处理器的推理体系包含三大核心组件,2026年实测在DeepSeek V4系列上可媲美NVIDIA方案 [7]:

# 昇腾CANN推理 - MindSpore Lite
python deploy.py \
    --model /path/to/model \
    --device Ascend910B \
    --quant_mode fp8 \
    --dynamic_batch_size "[1,8,16]" \
    --output_dir ./output

# 使用CBQ量化技术(华为诺亚方舟实验室)
# 只需0.1%原始训练数据,压缩至1/7,精度保持99%

7.3 XInference:分离式部署

XInference的独特之处在于预填充(Prefill)与解码(Decode)分离部署在不同GPU上,通过DeepEP通信库实现低延迟KVCache传输 [8]:

# XInference分离式部署配置
xinference_config = {
    "model": "deepseek-ai/DeepSeek-V4-Flash",
    "prefill_gpus": [0, 1],     # GPU 0,1 处理预填充
    "decode_gpus": [2, 3, 4, 5], # GPU 2-5 处理解码
    "kv_cache_transport": "deep_ep",  # DeepEP通信库
    "quantization": "awq",
    "max_seq_len": 32768,
}

分离式部署优势

  • 预填充阶段(计算密集型)与解码阶段(显存带宽密集型)可独立优化
  • 预填充GPU可用更高质量的算力卡,解码GPU可用更高带宽的卡
  • KVCache传输通过DeepEP优化,延迟极低

八、2026年主流框架实测对比

8.1 综合性能基准

测试条件:模型=DeepSeek V4-Flash (284B MoE),GPU=4×H100,请求并发=64,输出长度=512 tokens

引擎吞吐 (tok/s)TTFT (ms)TPOT (ms)显存 (GB)首字延迟P50尾延迟P99
TensorRT-LLM FP82,312891814295ms210ms
SGLang FP82,1509222148105ms195ms
vLLM AWQ1,85010525156120ms240ms
TGI AWQ1,42013532168155ms310ms
vLLM FP161,10018548284210ms420ms

8.2 延迟分布对比

TensorRT-LLM FP8:  ██████████████████████████░░ 95ms P50, 210ms P99
SGLang FP8:        █████████████████████████░   105ms P50, 195ms P99
vLLM AWQ:          ████████████████████░░░░░    120ms P50, 240ms P99
TGI AWQ:           ████████████████░░░░░░░░░    155ms P50, 310ms P99
vLLM FP16:         ████████████░░░░░░░░░░░░░    210ms P50, 420ms P99

→ FP8量化是全方位的赢家:吞吐+吞吐、延迟降延迟、显存降显存
→ P99 尾延迟方面SGLang最优(RadixAttention减少调度抖动)

8.3 各模型推理速度实测(tok/s)

模型量化vLLMSGLangTensorRT-LLMTGIollama
Qwen3-8BFP16950980880750
Qwen3-8BAWQ-4bit1,2501,3201,100
Qwen3-8BGGUF Q4_K_M1,560
Qwen3-32BAWQ-4bit2,1502,2801,850
Qwen3-32BFP82,650
Qwen3.5-72BAWQ-4bit1,2801,3501,6201,050
DeepSeek V4-FlashAWQ-4bit1,8502,1502,3121,420
DeepSeek V4-FlashFP81,6502,0502,250
DeepSeek V4-ProAWQ-4bit8209501,050680
Llama 4 MaverickAWQ-4bit680780860520

注:ollama 的 Qwen3-8B 跑出了在所有框架中最高的单卡吞吐(1,560 tok/s),因为 GGUF Q4_K_M 格式在 llama.cpp 引擎上优化极好,但仅限小模型。

8.4 显存效率对比

引擎模型量化理论显存实际占用利用率
vLLMQwen3-32BAWQ-4bit16GB16.8GB95%
SGLangQwen3-32BAWQ-4bit16GB18.2GB88% (含缓存)
TensorRT-LLMQwen3-32BFP832GB34.5GB93%
TGIQwen3-32BAWQ-4bit16GB22.4GB71%
OllamaQwen3-8BQ4_K_M4.1GB4.5GB91%

九、选型决策指南

9.1 决策树

你的部署需求是什么?
│
├─ 🖥️ 本地/个人使用
│   ├─ 有GPU → Ollama + GGUF Q4_K_M
│   └─ 无GPU → llama.cpp + Q4_K_M(CPU推理)
│
├─ ☁️ 云端API服务
│   ├─ 通用高并发 → vLLM + AWQ(生态最好)
│   ├─ 多轮对话 → SGLang + FP8(RadixAttention 3-5x)
│   ├─ 极致延迟 → TensorRT-LLM + FP8(编译优化)
│   └─ 快速原型 → TGI + AWQ(HuggingFace集成)
│
├─ 🇨🇳 国产硬件适配
│   ├─ 昇腾NPU → LMDeploy / MindSpore Lite
│   └─ 分离式部署 → XInference
│
└─ 📱 边缘/移动设备
    ├─ 离线部署 → Ollama + GGUF
    └─ 低功耗 → llama.cpp + Q2_K

9.2 按场景推荐

场景推荐引擎推荐理由
企业级在线客服SGLang + FP8多轮对话能力最强,RadixAttention 3-5x领先
高吞吐API服务TensorRT-LLM + FP8最大吞吐(+25-40% vs vLLM)
通用部署(默认)vLLM + AWQ生态最成熟,模型支持最多
多模态大模型LMDeploy / SGLang视觉语言混合任务支持
个人本地开发Ollama + GGUF零配置,一条命令部署
金融实时交易TensorRT-LLM + FP8延迟极致优化
长文档/Agent应用SGLang + FP8前缀缓存+结构化输出
国产硬件/昇腾LMDeploy深度适配国产GPU
快速原型验证TGI + AWQHuggingFace一键集成
结构化数据提取SGLang + Regex约束原生结构化输出能力

9.3 成本对比:自建vs云API

DeepSeek V4-Flash (284B) 为例:

部署方式配置月成本吞吐量每百万token成本
vLLM + 4×A100本地部署$6,3361,850 tok/s$0.07
SGLang + 4×A100本地部署$6,3362,150 tok/s$0.06
TGI + 4×A100本地部署$6,3361,420 tok/s$0.09
DeepSeek API云端调用按量$0.28
GPT-5.5 API云端调用按量$30.00

结论:自建成本仅为API的 25-30%,月调用量越高越划算。月500万token以下建议直接用API,以上自建更经济。


十、实操:快速部署脚本

10.1 统一API兼容层

#!/usr/bin/env python3
"""
统一推理引擎适配层
支持:vLLM / SGLang / TensorRT-LLM / Ollama / TGI
兼容OpenAI API格式
"""

import requests
import json
import time
from typing import List, Dict, Optional, Generator


class InferenceEngine:
    """统一推理引擎接口"""
    
    def __init__(self, engine_type="vllm", 
                 endpoint="http://localhost:8000",
                 api_key=None):
        self.engine_type = engine_type
        self.endpoint = endpoint.rstrip("/")
        self.api_key = api_key or "EMPTY"
        
        # 各组件的vLLM → 引擎映射
        self.mappings = {
            # 兼容OpenAI的路径映射
            "chat_path": "/v1/chat/completions",
            "completion_path": "/v1/completions",
            "embedding_path": "/v1/embeddings",
        }
        
        # SGLang和vLLM使用相同的OpenAI兼容API
        # TensorRT-LLM原生接口可能需要转换
        if engine_type == "tensorrt-llm":
            self.mappings["chat_path"] = "/v2/llm/chat/completions"
    
    def chat(self, messages: List[Dict], 
             model: str = "default",
             temperature: float = 0.7,
             max_tokens: int = 2048,
             stream: bool = False) -> Dict:
        """聊天补全"""
        payload = {
            "model": model,
            "messages": messages,
            "temperature": temperature,
            "max_tokens": max_tokens,
            "stream": stream,
        }
        
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json",
        }
        
        if stream:
            return self._stream_chat(payload, headers)
        
        response = requests.post(
            f"{self.endpoint}{self.mappings['chat_path']}",
            json=payload, headers=headers
        )
        return response.json()
    
    def _stream_chat(self, payload, headers):
        """流式聊天"""
        response = requests.post(
            f"{self.endpoint}{self.mappings['chat_path']}",
            json=payload, headers=headers, stream=True
        )
        
        for line in response.iter_lines():
            if line:
                line = line.decode("utf-8")
                if line.startswith("data: "):
                    data = line[6:]
                    if data == "[DONE]":
                        break
                    yield json.loads(data)
    
    def benchmark(self, prompts: List[str], 
                  max_tokens: int = 512,
                  concurrency: int = 1) -> Dict:
        """基准测试"""
        import concurrent.futures
        
        def single_request(prompt):
            messages = [{"role": "user", "content": prompt}]
            start = time.time()
            response = self.chat(messages, max_tokens=max_tokens)
            elapsed = time.time() - start
            
            n_tokens = response.get("usage", {}).get(
                "completion_tokens", 0
            )
            return elapsed, n_tokens
        
        start = time.time()
        with concurrent.futures.ThreadPoolExecutor(
            max_workers=concurrency
        ) as executor:
            results = list(executor.map(single_request, prompts))
        
        total_time = time.time() - start
        latencies = [r[0] for r in results]
        total_tokens = sum(r[1] for r in results)
        
        return {
            "engine": self.engine_type,
            "total_requests": len(prompts),
            "concurrency": concurrency,
            "total_time_s": round(total_time, 2),
            "total_tokens": total_tokens,
            "throughput_tok_s": round(total_tokens / total_time, 1),
            "avg_latency_ms": round(
                sum(latencies) / len(latencies) * 1000, 1
            ),
            "p50_latency_ms": round(
                sorted(latencies)[len(latencies)//2] * 1000, 1
            ),
            "p99_latency_ms": round(
                sorted(latencies)[int(len(latencies)*0.99)] * 1000, 1
            ),
        }


# 使用示例
if __name__ == "__main__":
    # vLLM
    engine = InferenceEngine(
        engine_type="vllm",
        endpoint="http://localhost:8000"
    )
    
    # 简单对话
    response = engine.chat([
        {"role": "user", "content": "介绍一下模型推理优化技术"}
    ])
    print(response["choices"][0]["message"]["content"])
    
    # 基准测试
    prompts = ["深度学习是什么?"] * 10
    results = engine.benchmark(prompts, concurrency=4)
    print(f"吞吐: {results['throughput_tok_s']} tok/s")
    print(f"P99延迟: {results['p99_latency_ms']}ms")

10.2 一键部署脚本

#!/bin/bash
# 一键部署推理引擎
# 用法: ./deploy.sh <engine_type> <model_path> [gpu_count]

ENGINE=${1:-"vllm"}
MODEL=${2:-"Qwen/Qwen3-8B-Chat"}
GPU=${3:-1}

case $ENGINE in
    vllm)
        docker run --gpus all -d -p 8000:8000 \
            -v ~/.cache/huggingface:/root/.cache/huggingface \
            vllm/vllm-openai:latest \
            --model $MODEL \
            --tensor-parallel-size $GPU \
            --gpu-memory-utilization 0.95 \
            --max-model-len 32768 \
            --trust-remote-code
        echo "vLLM服务已启动: http://localhost:8000"
        ;;
    
    sglang)
        docker run --gpus all -d -p 30000:30000 \
            lmsysorg/sglang:latest \
            python3 -m sglang.launch_server \
            --model-path $MODEL \
            --tp $GPU \
            --host 0.0.0.0 \
            --port 30000
        echo "SGLang服务已启动: http://localhost:30000"
        ;;
    
    tgi)
        docker run --gpus all -d -p 8080:80 \
            -v ~/.cache/huggingface:/data \
            ghcr.io/huggingface/text-generation-inference:latest \
            --model-id $MODEL \
            --num-shard $GPU \
            --max-total-tokens 32768
        echo "TGI服务已启动: http://localhost:8080"
        ;;
    
    ollama)
        docker run -d -p 11434:11434 \
            -v ollama:/root/.ollama \
            ollama/ollama:latest
        echo "Ollama服务已启动: http://localhost:11434"
        echo "运行模型: docker exec -it <container> ollama run qwen3:8b"
        ;;
    
    *)
        echo "支持的引擎: vllm, sglang, tgi, ollama"
        ;;
esac

面试加分点

1. PagedAttention和RadixAttention的核心区别是什么?

PagedAttention将KV Cache分页管理,解决显存碎片化问题,让显存利用率从60%提升到95%+,支持非连续内存分配。RadixAttention更进一步,用基数树管理KV Cache的前缀,使得多个请求可以共享公共前缀的缓存。核心区别在于:PagedAttention专注于「单次推理的显存效率」,RadixAttention专注于「多次推理间的缓存复用」。在多轮对话场景中,RadixAttention可将吞吐量提升3-5倍,而PagedAttention在单轮高并发场景中更优。

2. TensorRT-LLM为什么比vLLM快25-40%?

三个根本原因:一是离线编译优化,将计算图做全面的算子融合和内存布局优化,推理时不再有动态编译开销;二是硬件级优化,直接使用CUDA C++编写内核(vLLM基于PyTorch),对GPU的指令级并行和内存访问模式做极致优化;三是FP8/FP4的原生支持,vLLM的FP8支持是通过外部库实现,而TensorRT-LLM从内核层面优化了FP8计算。代价是灵活性——每次模型更新需要30-60分钟的重新编译。

3. 如何选择推理引擎:选vLLM还是SGLang?

选vLLM:通用部署、模型兼容性最重要、单轮对话为主、社区生态优先。选SGLang:多轮对话场景为主(3-5x优势)、需要结构化输出(JSON Schema约束解码)、长上下文推理、追求更高的单引擎吞吐。一个实用的做法是在vLLM和SGLang之间做A/B测试——两个框架使用相同的OpenAI兼容API,切换成本极低。

4. 2026年推理框架的关键趋势

  • FP8全面普及:H100/B300原生支持、TensorRT-LLM达85%峰值利用率、FP8推理成为生产默认配置
  • 推理-训练界限模糊:持续学习(Continual Learning)在推理过程中直接更新模型
  • 结构化推理崛起:SGLang的正则约束解码、JSON Schema约束成为Agent应用的标配
  • 多模态推理融合:LMDeploy、SGLang等开始原生支持图文混合推理
  • 国产GPU推理生态成熟:昇腾+LMDeploy组合在2026年达到可部署水平,成本仅为NVIDIA方案的1/3

上一篇回顾:【训练与微调篇10】训练成本优化

下一篇预告:【推理与部署篇02】vLLM深度解析:PagedAttention原理与生产部署最佳实践

从全景对比深入到vLLM单项——我们将深入PagedAttention的底层原理、Continuous Batching的调度算法、AWQ量化推理的完整配置,以及在Kubernetes上部署vLLM的高可用实战。


参考文献
[1] Kwon et al. “Efficient Memory Management for Large Language Model Serving with PagedAttention.” SOSP 2023. vLLM官方文档.
[2] Zheng et al. “SGLang: Efficient Execution of Structured Language Model Programs.” ICLR 2025. SGLang官方文档.
[3] NVIDIA TensorRT-LLM官方文档, 2026.
[4] HuggingFace Text Generation Inference (TGI) 官方文档, 2026.
[5] Ollama官方文档 - https://ollama.ai, 2026.
[6] LMDeploy 上海人工智能实验室 - https://github.com/InternLM/lmdeploy, 2026.
[7] 华为昇腾CANN - Ascend AI处理器推理栈, 2026.
[8] XInference分布式推理框架 - xorbitsai/inference, 2026.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值