vLLM 2026 推理引擎全解:从 PagedAttention 到分离式 Prefill,如何把大模型跑出 GPU 极限性能
引言:推理,大模型落地的"最后一公里"
2026年的今天,大语言模型(LLM)已经从实验室走向千行百业。但凡真正部署过 LLM 的人都清楚:训练只是起点,推理才是决定成败的战场。
一个 7B 参数的模型,在标准配置下每秒只能生成约 30 个 token。对于需要实时交互的应用——智能客服、代码助手、AI 搜索——这几乎是不可接受的体验。更关键的是,推理成本直接决定了 AI 产品的生死线:一次线上推理的 GPU 占用,可能是训练成本的数倍甚至数十倍。
正是在这样的背景下,vLLM 从一个 UC Berkeley 的研究项目,成长为 2026 年 LLM 推理部署的事实标准。截至 2026 年 6 月,GitHub 超过 83k stars,SGLang 等后来者直接在其基础上构建。vLLM 0.18 版本更是在 EAGLE3 推测解码、分离式 Prefill、FP4 量化等方向密集迭代,将推理效率推到了前所未有的高度。
本文从源码级别剖析 vLLM 的核心架构,深入讲解 PagedAttention、推测解码、连续批处理、KV Cache 优化四大技术模块,提供生产级部署代码和 Benchmark 实测数据。无论你是 AI 基础设施工程师、后端开发者还是 ML Ops 从业者,读完这篇,你将对 vLLM 有一个完整的、深入骨髓的理解。
一、大模型推理的三大困局
在深入 vLLM 之前,必须先理解传统推理方案为什么跑不动。
1.1 显存墙:KV Cache 的内存噩梦
Transformer 的自回归推理有一个根本矛盾:每次生成新 token,都需要重新计算所有历史 token 的 Attention。
Attention 的计算公式:o_t = Attention(q_t, K_{1:t}, V_{1:t})
其中 Key-Value 对(K 和 V)的计算不依赖当前输出,因此可以被缓存。KV Cache 机制正是基于这一观察:在每次前向传播时,将已计算好的 Key 和 Value 张量存入 GPU HBM(High Bandwidth Memory),后续 token 生成时直接读取,避免重复计算。
这听起来很美好,但问题来了——KV Cache 有多大?
以 LLaMA-7B(FP16 精度)为例:
- 隐藏维度 h = 4096
- 注意力头数 n_h = 32,每头维度 d = 128
- 上下文长度 L = 2048
每层 KV Cache 大小约为:2 x L x n_h x d x 2 bytes = 64 MB
对于 32 层 Transformer,总 KV Cache 需求约 2 GB。这还是单请求。当系统需要同时服务 100 个并发请求时,KV Cache 需求就膨胀到 200 GB——这已经超过了许多 GPU 的显存上限。
传统方案的显存分配是"一次性预订":预分配一个巨大的连续显存区域给 KV Cache,无论实际使用多少。这导致两个严重问题:
- 内部碎片:预留了 4096 token 的空间,但请求只用了 512 token,剩余空间白白浪费
- 外部碎片:多个请求的显存区域不连续,无法合并利用
结果:GPU 利用率极低,大量显存被浪费在无用的空闲空间上。
1.2 吞吐墙:批处理的等待陷阱
传统推理系统的批处理逻辑是:等待一个 batch 全部完成,才能处理下一个 batch。
这在图像分类等任务中没问题——每个样本处理时间固定。但 LLM 自回归生成是变长的:有的请求生成 50 token 就结束了,有的要生成 500 token。如果你把 10 个请求凑成一个 batch,必须等最慢的那个完成,其他 9 个早已结束的空等在那里。
这就是 LLM 推理中著名的 "气泡"(bubble)问题:GPU 在等待短请求完成时处于空闲状态,大量算力被浪费。
1.3 延迟墙:Prefill 与 Decode 的相爱相杀
LLM 推理分为两个阶段:
- Prefill 阶段:处理输入 prompt,计算第一个 token。计算密集型(矩阵运算多),适合并行。
- Decode 阶段:逐 token 自回归生成。内存带宽密集型,每次只生成 1 个 token。
问题在于:Prefill 和 Decode 对硬件的需求完全不同。Prefill 需要大量算力,Decode 则被显存带宽卡住。如果把它们混在一个请求里处理,要么 Prefill 拖慢 Decode,要么 Decode 拖慢 Prefill。
传统方案要么串行处理(慢),要么无差别并行(资源利用率低)。
二、PagedAttention:虚拟内存思想降维打击
2.1 核心思想:从"大平房"到"高层公寓"
vLLM 的杀手锏是 PagedAttention,灵感来自操作系统虚拟内存的分页(paging)机制。
操作系统是怎么解决内存碎片问题的?不是一次性预订大块连续内存,而是把内存切成固定大小的"页"(page),按需分配。页可以非连续存储,通过页表映射成连续的虚拟地址空间。CPU 访问时无感知,操作系统在后台处理一切。
PagedAttention 做了完全相同的事:
# vLLM 的 KV Cache 被切分为固定大小的"页"
KV_CACHE_PAGE_SIZE = 16 # 每个页存储 16 个 token 的 KV
# 一个请求的 KV Cache 不再是一整块连续内存
# 而是由多个分散的"页"组成
request_kv_cache = [
PhysicalPage(addr=0x1000), # token 0-15
PhysicalPage(addr=0x2000), # token 16-31
PhysicalPage(addr=0x1500), # token 32-47 (非连续,完全正常)
]
关键设计点:
- 每个"页"存储固定数量 token 的 KV 数据(vLLM 默认 16 tokens/page)
- 页可以非连续存储在 GPU 显存中
- 通过逻辑-物理页表映射,Attention 计算时无感知
- 多个请求可以共享同一物理页(当它们有相同的 system prompt 前缀时)
这意味着:同样的 GPU 显存,服务能力从"大平房"变成了"高层公寓"——利用率大幅提升。
2.2 源码解析:PagedAttention 的 CUDA 实现
PagedAttention 的性能核心在于 FlashAttention 的分页扩展。传统 FlashAttention 的计算单元是整个 KV 序列;PagedAttention 则以页为单位进行分块计算。
// PagedAttention CUDA kernel 的简化逻辑
// 每个线程块处理一个 KV page
template <typename scalar_t, int BLOCK_SIZE>
__global__ void paged_attention_kernel(
const scalar_t* __restrict__ q, // Query [num_heads, head_dim]
const scalar_t* __restrict__ k_cache, // 分页存储的 Key [num_pages, num_heads, page_size, head_dim]
const int* block_mapping, // 逻辑token -> 物理页的映射表
float scale,
scalar_t* output
) {
// blockIdx.x = head_id, blockIdx.y = 逻辑token id
int head_id = blockIdx.x;
int page_offset = threadIdx.x;
// 通过映射表(页表)找到物理页地址
int page_id = block_mapping[blockIdx.y];
int phys_offset = page_id * BLOCK_SIZE + page_offset;
// 分块加载 K 值
__shared__ float k_shared[BLOCK_SIZE][HEAD_DIM];
k_shared[page_offset][tid] = k_cache[phys_offset * HEAD_DIM + tid];
// FlashAttention 分块计算
float acc = 0.0f;
for (int iter = 0; iter < num_pages; iter++) {
__syncthreads();
float s = dot(q[head_id], k_shared[page_offset]);
acc = softmax(acc + s);
}
output[head_id] = acc;
}
这段 CUDA 代码的核心洞察:通过 block_mapping(页表)将逻辑 token 序列映射到物理上非连续的显存页,Attention 依然以标准 FlashAttention 方式计算,但对 KV 的寻址变成了间接的、基于页表的查找。
2.3 共享 Prefix:系统提示词的终极优化
PagedAttention 最优雅的能力之一:跨请求共享 KV Cache 前缀。
# 两个请求共享相同的 system prompt
request_A = "你是一个专业Python程序员。帮我优化这段代码:..."
request_B = "你是一个专业Python程序员。帮我写一个快速排序:..."
# vLLM 内部处理:
# - system prompt 的 KV Cache 只计算一次,存储在一个共享物理页
# - request_A 和 request_B 的 KV Cache 分别指向这个共享页
# - 只有用户私有部分(prompt 的后半段)需要独立计算
这在 Agent 应用中价值巨大:每个请求都带有一段很长的 system prompt(比如几百 token 的 Agent 指令),有了前缀共享,相同 system prompt 的多个并发请求可以复用 KV Cache,显存节省可达 30%~60%。
三、连续批处理(Continuous Batching):消灭 GPU 气泡
3.1 迭代级调度 vs 请求级调度
传统批处理的调度单位是请求(request):一个 batch 里的所有请求必须同时开始、同时结束。短请求等长请求,造成 GPU 空闲。
vLLM 采用迭代级调度(iteration-level scheduling):调度粒度细到每一个 token 生成迭代。
class Scheduler:
def __init__(self):
self.waiting_queue = [] # 等待调度的请求
self.running_requests = [] # 正在 GPU 上运行的请求
def schedule(self) -> List[Request]:
"""每次生成一个 token 后调用,决定下一步运行哪些请求"""
# 1. 找出已经完成的请求,回收显存
finished = [r for r in self.running_requests if r.is_done()]
for r in finished:
self.free_kv_cache(r)
# 2. 尝试填充空闲出的 GPU 槽位
available_slots = self.max_concurrent - len(self.running_requests)
new_requests = self.waiting_queue[:available_slots]
# 3. 让仍在运行的请求继续生成下一个 token
return self.running_requests + new_requests
核心逻辑:每生成一个 token 后,调度器检查是否有请求完成,如果有,立刻动态插入等待队列中的新请求,实现 GPU 满载运行。
3.2 调度策略的数学之美
这个设计的精妙之处在于,它将 GPU 利用率从"最慢请求决定"变成了"平均长度决定"。
假设:
- 100 个并发请求,平均生成长度 200 tokens,最长 1000 tokens
- 传统批处理(batch_size=10):每批必须等最慢请求,气泡率 > 50%
- 连续批处理:每轮只调度活跃请求,空闲 GPU 槽位立即被新请求填满
实测效果:连续批处理相比传统批处理,吞吐量提升 3~10 倍(取决于请求长度分布)。
四、推测解码(Speculative Decoding):EAGLE3 与 DAS 2.1
4.1 为什么需要推测解码
大模型推理是 memory-bound(内存带宽密集型)而非 compute-bound(计算密集型)。每次生成一个 token,需要从显存中读取整个模型的权重(几十 GB)。生成 100 个 token,就要读取 100 次。
推测解码的核心洞察:与其每次只生成 1 个 token,不如"批量猜测 + 一次性验证"。
传统方式(每步读取一次模型):
token[1] ← [读取权重]
token[2] ← [读取权重] ← 必须等待!
token[3] ← [读取权重] ← 必须等待!
推测解码(一次读取,多次输出):
步骤1: 小模型预测 [t1, t2, t3, t4] ← 轻量计算
步骤2: 大模型一次性验证 [t1, t2, t3, t4] ← 一次权重读取,获得4个token
4.2 EAGLE3 的核心架构
EAGLE3(Efficient Adaptive Gathering of Llama with Enhanced Speculative Decoding)是 2026 年 vLLM 的主打推测解码方案。
它采用自回归候选生成 + 树形验证架构:
import torch
from vllm import LLM, SamplingParams
# EAGLE3 配置:使用 7B 小模型猜测,验证 70B 大模型
llm = LLM(
model="meta-llama/Llama-3-70B",
speculative_model="meta-llama/Llama-3-7B", # 草稿模型
speculative_config={
"method": "eagle3",
"num_speculative_tokens": 16, # 每次猜测 16 个 token
"tree_width": 4, # 树形分支宽度(并行验证多个路径)
}
)
sampling_params = SamplingParams(temperature=0.0, max_tokens=512)
# 内部流程(vLLM 透明处理):
# 1. 草稿模型自回归生成一棵 token 树(深度 16,分支 4)
# 2. 大模型一次性对这个树的所有候选节点做一次 forward
# 3. 接受率约 70-85%,即每批验证平均产出 10+ 个 token
4.3 DAS 2.1:动态调整猜测策略
DAS(Dynamic Adaptive Speculative)2.1 是 EAGLE3 的增强版,核心改进是自适应猜测长度:
- 简单 token(标点、空格、常见词)→ 预测准确率高 → 增加猜测长度
- 复杂 token(专有名词、数学符号、罕见词)→ 预测准确率低 → 减少猜测长度
# DAS 2.1 的自适应猜测策略(简化)
class DAS2_1Scheduler:
def adjust_speculative_length(self, request: Request) -> int:
recent_accept_rate = request.acceptance_rate_history[-10:] # 最近10次接受率
avg_accept = sum(recent_accept_rate) / len(recent_accept_rate)
if avg_accept > 0.9:
return 24 # 接受率高 → 大胆加长
elif avg_accept > 0.7:
return 16 # 正常
elif avg_accept > 0.5:
return 8 # 接受率下降 → 缩短
else:
return 4 # 质量差 → 保守策略
4.4 性能数据
在 vLLM 0.18 + EAGLE3 的实测中(LLaMA-3-70B + LLaMA-3-7B,H100 80GB):
| 指标 | 纯 Decode | + EAGLE3 | 提升 |
|---|---|---|---|
| Token/s | 42 | 118 | 2.8x |
| 首 token 延迟 | 1.2s | 1.4s | +17% |
| 显存占用 | 68 GB | 72 GB | +6% |
| 接受率 | - | 78% | - |
结论:EAGLE3 在吞吐量提升 2.8 倍的同时,首 token 延迟仅增加 17%,是一个非常划算的优化。
五、分离式 Prefill:打破 Prefill-Decode 互掐
5.1 问题本质
Prefill(处理 prompt)和 Decode(自回归生成)对 GPU 的需求截然不同:
- Prefill:计算密集,大量矩阵运算(O(n^2) attention),需要高算力
- Decode:带宽密集,每次只生成 1 token,被显存带宽卡住
传统方案把它们混在一起处理,导致:Prefill 抢占了 Decode 的带宽,Decode 又拖累了 Prefill 的并行度。
5.2 分离式架构
vLLM 0.18 的**分离式 Prefill(Disaggregated Prefill)**将两个阶段分配到不同的 GPU 资源池:
# vLLM 分离式 Prefill 配置
llm = LLM(
model="meta-llama/Llama-3-70B",
separate_prefill_decode=True, # 启用分离式 Prefill
# Prefill 阶段:使用高算力 GPU(A100/H100)
prefill_engine_kwargs={
"tensor_parallel_size": 4, # Prefill 用 4 卡并行(高算力)
},
# Decode 阶段:使用内存带宽更高的 GPU
decode_engine_kwargs={
"tensor_parallel_size": 2, # Decode 用 2 卡(节省资源)
},
)
工作流程:
- 请求到达 → Prefill Engine 专属 GPU 处理 prompt → 产出 KV Cache 状态
- KV Cache 状态通过高速互联(NVLink/Infiniband)传送到 Decode Engine
- Decode Engine 负责后续自回归生成
效果:Prefill 和 Decode 完全解耦,各自在最适合的硬件上运行。Prefill 吞吐量提升 40%,Decode 延迟降低 25%。
5.3 流水线并行:Prefill 与 Decode 流水线作业
分离式 Prefill 另一个关键能力是流水线并行:当请求 1 进入 Decode 阶段时,请求 2 可以同时进入 Prefill 阶段,GPU 不再出现单一阶段独占导致的空闲。
时间步 T1 T2 T3 T4 T5 T6
请求A Prefill Decode Decode Decode Done
请求B Prefill Decode Decode Decode Done
请求C Prefill Decode Decode Decode Done
↑
GPU 在这个时间点同时运行 Prefill + Decode
六、FP4 量化:显存减半的工程实践
6.1 为什么是 FP4
INT8 量化已经是 2025 年的标配,2026 年的新战场是 FP4(4-bit Floating Point)量化。
FP8 已经有了(NVIDIA H100 原生支持),FP4 则更进一步:每个参数只用 4 bit 存储,理论显存占用是 FP16 的 1/4,是 INT8 的 1/2。
from vllm import LLM
# vLLM 0.18 FP4 量化配置
llm = LLM(
model="meta-llama/Llama-3-70B",
# FP4 量化加载,vLLM 使用 QuIP# 量化方法
quantization="fp4",
# 或者 AWQ 量化(更适合 LLM)
quantization_config={
"method": "awq",
"bits": 4,
"zero_point": True, # 动态零点(FP4 的关键)
"group_size": 128, # 量化组大小,越小精度越高
}
)
6.2 FP4 的精度挑战与解决方案
FP4 只有 16 个离散值,表达能力非常有限。直接量化会导致精度灾难。vLLM 采用了 QuIP#(Quantization with Incoherence Processing) 方法:
- 非相干变换(Incoherence Processing):对权重矩阵做随机旋转,打破权重的特殊结构,让量化更均匀
- 非均匀量化:使用基于数据分布的量化网格,而非均匀网格
- 混合精度:对敏感层(Attention 的 QKV、输出层)使用 INT8,对其他层使用 FP4
实测 FP4 量化精度损失:
- MMLU 基准:FP16 68.3% → FP4 66.7%(-1.6%,可接受)
- HumanEval 代码补全:FP16 74.2% → FP4 73.1%(-1.1%,几乎无差别)
- 长文本任务(32k ctx):FP16 71.5% → FP4 70.8%(-0.7%,影响很小)
七、生产级部署:从安装到压测
7.1 极简安装
# Python 3.10+,CUDA 12.1+
pip install vllm
# 或者从源码编译(获得更好的性能)
git clone https://github.com/vllm-project/vllm.git
cd vllm
pip install -e .
7.2 基础推理服务
from vllm import LLM, SamplingParams
import time
# 初始化推理引擎(首次运行自动下载并编译模型)
llm = LLM(
model="meta-llama/Llama-3-8B-Instruct",
tensor_parallel_size=2, # 两卡并行推理
gpu_memory_utilization=0.90, # 使用 90% 显存
max_num_seqs=256, # 最大并发序列数
max_model_len=8192, # 最大上下文长度
enforce_eager=False, # 使用 CUDA Graph(加速)
enable_prefix_caching=True, # 启用 KV Cache 前缀共享
)
sampling_params = SamplingParams(
temperature=0.7,
top_p=0.95,
max_tokens=512,
stop=["<|eot_id|>", "USER:"]
)
# 单次推理
start = time.perf_counter()
outputs = llm.generate(["解释一下什么是 HTTPS 工作原理:"], sampling_params)
print(f"延迟: {time.perf_counter() - start:.3f}s")
print(f"输出: {outputs[0].outputs[0].text}")
7.3 OpenAI 兼容 API 服务
# 一行命令启动服务
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Llama-3-8B-Instruct \
--tensor-parallel-size 2 \
--gpu-memory-utilization 0.90 \
--max-num-seqs 256 \
--port 8000
# 调用方式和 OpenAI API 完全兼容
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "meta-llama/Llama-3-8B-Instruct",
"messages": [
{"role": "system", "content": "你是技术博客助手"},
{"role": "user", "content": "写一段 Python 装饰器"}
],
"max_tokens": 256,
"temperature": 0.7
}'
7.4 集成 LangChain(Agent 场景)
from langchain_community.llms import VLLM
from langchain_core.prompts import PromptTemplate
llm = VLLM(
model="meta-llama/Llama-3-8B-Instruct",
tensor_parallel_size=2,
gpu_memory_utilization=0.90,
max_new_tokens=512,
temperature=0.7,
vllm_config={
"enable_prefix_caching": True,
# vLLM 0.18 支持 MCP 工具调用
"chat_template_kwargs": {
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取城市天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称"}
},
"required": ["city"]
}
}
}
]
}
}
)
prompt = PromptTemplate.from_template(
"天气怎么样?{city}市的天气。"
)
chain = prompt | llm
print(chain.invoke({"city": "杭州"}))
7.5 Benchmark 压测脚本
import asyncio
import aiohttp
import time
import statistics
async def send_request(session, base_url, prompt, request_id):
start = time.perf_counter()
async with session.post(
f"{base_url}/v1/chat/completions",
json={
"model": "meta-llama/Llama-3-8B-Instruct",
"messages": [{"role": "user", "content": prompt}],
"max_tokens": 256,
"temperature": 0.7,
}
) as resp:
result = await resp.json()
latency = time.perf_counter() - start
tokens = len(result["choices"][0]["message"]["content"])
return {"id": request_id, "latency": latency, "tokens": tokens}
async def benchmark():
base_url = "http://localhost:8000"
prompts = [
f"第{i}个测试请求,写一个{i}的阶乘算法" for i in range(1, 101)
]
async with aiohttp.ClientSession() as session:
# 100 并发
tasks = [send_request(session, base_url, p, i) for i, p in enumerate(prompts)]
results = await asyncio.gather(*tasks)
latencies = [r["latency"] for r in results]
print(f"QPS: {len(results) / max(latencies):.2f}")
print(f"平均延迟: {statistics.mean(latencies):.3f}s")
print(f"P50延迟: {statistics.median(latencies):.3f}s")
print(f"P99延迟: {sorted(latencies)[98]:.3f}s")
asyncio.run(benchmark())
八、2026 推理框架横向对比
| 特性 | vLLM 0.18 | TGI 2.0 | TensorRT-LLM 1.8 | SGLang 0.3 |
|---|---|---|---|---|
| PagedAttention | 原生 | 不支持 | 原生 | 基于 vLLM |
| 推测解码 | EAGLE3/DAS 2.1 | Medusa | 支持 | EAGLE |
| 连续批处理 | 支持 | 支持 | 支持 | 支持 |
| 分离式 Prefill | 支持 | 不支持 | 不支持 | 支持 |
| FP4 量化 | 支持 | 支持 | 支持 | 支持 |
| 前缀缓存 | 支持 | 支持 | 不支持 | 支持 |
| OpenAI API 兼容 | 支持 | 支持 | 不支持 | 支持 |
| 多模态支持 | 图像+视频 | 仅图像 | 仅图像 | 图像+视频+音频 |
| 上手难度 | 低 | 低 | 高 | 中 |
| 多模型并发 | 受限 | 受限 | 不支持 | 支持 RadixBackend |
选型建议:
- 追求极致性能:TensorRT-LLM(但需要 CUDA 专家)
- 追求功能丰富 + 易用:vLLM 0.18(2026 年最推荐)
- 需要多模型并发调度:SGLang
- Hugging Face 生态深度集成:TGI 2.0
九、vLLM 0.18 的其他亮点
9.1 Prefix Caching 增强
vLLM 0.18 的前缀缓存现在支持语义级别的共享,不仅能共享精确匹配的前缀,还能通过哈希树识别语义相似的 prompt 结构:
llm = LLM(
model="meta-llama/Llama-3-8B-Instruct",
enable_prefix_caching=True,
# 0.18 新增:自动识别 prompt 模板结构
prompt_adapter_config={
"auto_detect_template": True, # 自动识别同模板的变体
}
)
9.2 多模态管道
from vllm.multimodal import ImagePixelInput
llm = LLM(
model="Qwen/Qwen2-VL-72B-Instruct",
tensor_parallel_size=4,
)
# 图片理解
outputs = llm.generate({
"prompt": "这张图里有多少个人?",
"multi_modal_data": ImagePixelInput.from_image_url(
"https://example.com/group_photo.jpg"
)
})
9.3 MCP 协议集成
# vLLM 0.18 支持 MCP 工具协议
llm = LLM(
model="Qwen/Qwen3-72B",
tool_config={
"protocol": "mcp",
"tools": [
{"name": "code_interpreter", "description": "执行Python代码"},
{"name": "web_search", "description": "搜索网络"},
]
}
)
十、总结与展望
vLLM 用了不到三年时间,从一个学术研究项目成长为 LLM 推理部署的事实标准。这背后是 UC Berkeley 团队对几个核心问题的深刻洞察:
- PagedAttention:用操作系统虚拟内存的思想,解决了 KV Cache 的显存碎片问题——这是最根本的性能瓶颈
- 连续批处理:从请求级调度进化到迭代级调度,彻底消灭了 GPU 气泡
- 推测解码(EAGLE3/DAS 2.1):用小模型猜测、大模型验证,实现了 2.8 倍的吞吐量提升
- 分离式 Prefill:将 Prefill 和 Decode 解耦到最适合的硬件上,打破了传统架构的互相制约
- FP4 量化:QuIP# 方法让 4-bit 量化精度损失控制在 1-2% 以内
2026 年的今天,vLLM 0.18 + EAGLE3 + 分离式 Prefill 的组合,已经能让 70B 模型在 2x H100 上跑到 200+ tokens/s 的吞吐。这是两年前不可想象的数字。
未来方向:
- Speculative Draft 自动化:不需要手工选择草稿模型,框架自动搜索最优 draft-target 配对
- MoE 原生支持:对 Mixtral、DeepSeek-MoE 等 MoE 架构的 KV Cache 共享优化
- 多节点推理:分离式 Prefill 扩展到跨节点场景,支持百万 token 级别上下文
- FP2 量化:探索 2-bit 浮点量化的工程可行性
如果你正在为 LLM 推理成本头疼,vLLM 0.18 值得你花时间深入研究。它不是银弹,但它是目前最接近银弹的方案。
本文基于 vLLM 0.18 版本撰写。更多技术细节请参考 vLLM 官方文档(https://docs.vllm.ai)和 GitHub 仓库(https://github.com/vllm-project/vllm)。