推测解码加速

推测解码2026:加速2-3倍

自回归生成的根本瓶颈 LLM的自回归生成是一个严格串行的过程——每个token依赖前一个token的输出。在A100 GPU上,生成一个token的延迟约为15-30ms,其中计算只占一小部分,大部分时间花在权重加载上。这就是内存带宽限制:每生成一个token都要将整个模型权重从HBM读到计算单元,但只产生一个token的输出。 推测解码(Speculative Decoding)通过打破这一串行约束,实现了2-3倍的推理加速。 核心思想:Draft-Verify范式 推测解码的核心思想异常简洁: Draft阶段:用一个小而快的Draft模型快速生成一段候选序列 Verify阶段:用大模型一次性并行验证这整段候选序列 接受/拒绝:根据大模型的概率分布决定接受多少个候选token 关键洞察在于:大模型并行处理N个token的速度(一次前向传播)远快于串行生成N个token(N次前向传播)。即使候选序列有部分错误,只要平均接受率足够高,就能获得净加速。 数学基础:拒绝采样 推测解码使用拒绝采样确保输出分布与纯大模型生成完全一致。给定Draft模型的概率 q(x) 和大模型的概率 p(x): 接受概率 = min(1, p(x) / q(x)) 如果 p(x) ≥ q(x):总是接受(Draft模型低估了这个token的概率) 如果 p(x) < q(x):以 p(x)/q(x) 的概率接受,否则拒绝并从调整后的分布中重新采样 def speculative_decoding_step(draft_model, target_model, prefix, n_draft=4): # 1. Draft模型自回归生成n_draft个token draft_tokens = [] draft_probs = [] for _ in range(n_draft): logits = draft_model(prefix + draft_tokens) prob = softmax(logits[-1]) token = sample(prob) draft_tokens.append(token) draft_probs.append(prob[token]) # 2. 大模型并行验证 target_logits = target_model(prefix + draft_tokens) target_probs = [softmax(target_logits[i]) for i in range(len(draft_tokens))] # 3. 接受/拒绝 accepted = [] for i, (token, d_prob, t_prob) in enumerate(zip(draft_tokens, draft_probs, target_probs)): if random() < min(1, t_prob[token] / d_prob): accepted.append(token) else: # 从调整后的分布重新采样 adjusted_prob = relu(t_prob - d_prob) adjusted_prob /= adjusted_prob.sum() accepted.append(sample(adjusted_prob)) break # 一旦拒绝,后续候选全部丢弃 return accepted 这个算法保证了输出分布与纯大模型采样的分布完全一致——无损加速。 ...

2026-07-02 · 2 min · 313 words · 硅基 AGI 探索者
Flash Attention 3

Flash Attention 3原理解析

注意力计算的性能瓶颈 标准注意力计算的核心瓶颈不在于计算量,而在于显存访问。注意力矩阵 QK^T 的形状为 [n, n],对于 n=8192 的序列,仅这个矩阵就需要256MB显存(FP32)。GPU的计算速度远超显存带宽——A100的计算能力为312 TFLOPS,而HBM带宽仅2TB/s。 这就是经典的"内存墙"问题:注意力计算大部分时间不是在算,而是在等数据搬运。 Flash Attention V1:分块计算的突破 Tri Dao在2022年提出的Flash Attention V1核心思想是:通过分块计算避免实例化完整的注意力矩阵。 在线Softmax Flash Attention的关键创新是在线Softmax算法。标准Softmax需要先遍历一次数据求最大值,再遍历一次计算指数和归一化。在线Softmax通过维护一个运行最大值和运行和,在单次遍历中完成Softmax计算: def online_softmax(blocks): """在线Softmax:逐块更新""" m = float('-inf') # 运行最大值 l = 0.0 # 运行和 result = None for block in blocks: block_max = block.max() # 更新全局最大值 new_m = max(m, block_max) # 修正之前的累积值 alpha = math.exp(m - new_m) beta = math.exp(block_max - new_m) l = alpha * l + beta * block.sum() if result is None: result = beta * block else: result = alpha * result + beta * block m = new_m return result / l 分块策略 将Q、K、V分别切分为块,每次只加载一小块到SRAM(GPU片上高速缓存)中计算。外层循环遍历K/V块,内层循环遍历Q块: for each K_j, V_j block: load K_j, V_j to SRAM for each Q_i block: load Q_i to SRAM compute S = Q_i @ K_j^T update online softmax statistics compute partial O = P @ V_j write O_i back to HBM 这种策略使得HBM访问量从O(n²)降低到O(n²d/M),其中M是SRAM大小。对于典型配置,这相当于减少了10-20倍的显存访问。 Flash Attention V2:效率的进一步提升 V2在V1基础上做了几个关键优化: 减少非矩阵乘法运算 GPU上矩阵乘法(GEMM)的效率远高于其他运算(如rescale、softmax)。V2重新组织了计算顺序,将rescale操作推迟到最后,减少了中间的rescale次数。 并行化改进 V1主要沿序列维度并行化,V2增加了批次和头维度的并行化,使得在长序列场景下能更好地利用GPU的并行能力。 前向和后向的分配优化 V2重新分配了前向和后向传播中的工作负载,减少了线程块之间的同步开销。 Flash Attention V3:FP8与异步流水线 2024年发布的Flash Attention V3针对H100 GPU的FP8张量核心和异步执行特性进行了深度优化。 ...

2026-07-02 · 2 min · 366 words · 硅基 AGI 探索者
KV Cache优化

KV Cache优化技术全景

为什么KV Cache如此重要? 在自回归生成中,每生成一个新token都需要计算它与之前所有token的注意力。如果不缓存,生成第N个token需要重新计算前N-1个token的K和V,复杂度为O(N²)。KV Cache将已计算的K/V存储起来,使每步生成只需O(N)的计算。 但缓存本身带来了巨大的显存压力。以Llama-3-70B为例,FP16精度下单个token的KV Cache占用约320KB。在32K上下文、batch_size=32的场景下,KV Cache总量达到约320GB——远超模型本身的140GB。 KV Cache的显存构成 单个token的KV Cache大小为: cache_per_token = 2 (K和V) × n_layers × n_kv_heads × head_dim × 2 (FP16字节) 以Llama-3-70B为例: n_layers = 80 n_kv_heads = 8 (GQA) head_dim = 128 FP16 = 2字节 cache_per_token = 2 × 80 × 8 × 128 × 2 = 327,680 bytes ≈ 320KB 理解这个公式是所有优化方案的出发点。 PagedAttention:分页式KV管理 vLLM团队提出的PagedAttention借鉴了操作系统的虚拟内存管理。核心思想: 块式管理 将KV Cache分为固定大小的块(Block),每个块存储若干token的KV。块不需要在物理上连续,通过块表(Block Table)映射逻辑位置到物理位置。 class PagedKVCache: def __init__(self, n_blocks, block_size, n_layers, n_kv_heads, head_dim): self.block_size = block_size # 每块的token数 self.n_blocks = n_blocks # 预分配所有块的存储 self.k_blocks = torch.zeros(n_blocks, n_layers, block_size, n_kv_heads, head_dim) self.v_blocks = torch.zeros(n_blocks, n_layers, block_size, n_kv_heads, head_dim) self.free_blocks = list(range(n_blocks)) self.block_tables = {} # seq_id -> [block_indices] def allocate(self, seq_id, n_tokens): n_blocks_needed = (n_tokens + self.block_size - 1) // self.block_size blocks = [] for _ in range(n_blocks_needed): if not self.free_blocks: raise OOMError("No free KV cache blocks") blocks.append(self.free_blocks.pop()) self.block_tables[seq_id] = blocks def append(self, seq_id, token_idx, k, v): block_idx = token_idx // self.block_size offset = token_idx % self.block_size physical_block = self.block_tables[seq_id][block_idx] self.k_blocks[physical_block, :, offset] = k self.v_blocks[physical_block, :, offset] = v 优势 消除碎片:无需为最大可能长度预分配连续空间 灵活共享:不同序列可以共享相同的块(如系统提示词部分) 按需分配:序列增长时动态分配新块 Prefix Sharing 多个请求共享相同的前缀(如系统提示词)时,PagedAttention可以让这些请求共享同一组物理块。这在对话AI场景中可节省30-50%的显存。 ...

2026-07-02 · 2 min · 322 words · 硅基 AGI 探索者
MoE混合专家架构

MoE混合专家架构2026详解

MoE的核心动机:解耦参数量与计算量 传统密集模型的参数量与计算量是线性绑定的——一个70B模型每次前向传播需要计算全部70B参数。MoE(Mixture of Experts)打破了这一绑定:通过路由机制只激活部分专家,使得总参数量可以远大于单次计算量。 DeepSeek-V3以671B总参数量实现了仅37B的激活计算量,在保持顶级性能的同时将推理成本降低了5-10倍。这是MoE在2026年成为超大模型首选架构的直接原因。 稀疏MoE的工作原理 基本结构 一个MoE层由三个核心组件构成: 路由器(Router/Gate):一个小型线性层,输出每个token分配给各专家的概率 专家网络(Experts):多个并行的FFN,每个专家是一个独立的FFN 组合层:根据路由概率加权组合各专家的输出 class MoELayer(nn.Module): def __init__(self, d_model, d_ff, n_experts, top_k=2): super().__init__() self.router = nn.Linear(d_model, n_experts, bias=False) self.experts = nn.ModuleList([ FFN(d_model, d_ff) for _ in range(n_experts) ]) self.top_k = top_k def forward(self, x): batch_size, seq_len, d_model = x.shape x_flat = x.view(-1, d_model) # 路由 router_logits = self.router(x_flat) # [N, n_experts] router_probs = F.softmax(router_logits, dim=-1) # Top-K选择 topk_probs, topk_indices = torch.topk(router_probs, self.top_k, dim=-1) topk_probs = topk_probs / topk_probs.sum(dim=-1, keepdim=True) # 分发到专家 output = torch.zeros_like(x_flat) for i in range(self.top_k): expert_indices = topk_indices[:, i] # [N] expert_weights = topk_probs[:, i] # [N] for expert_id in range(len(self.experts)): mask = (expert_indices == expert_id) if mask.any(): expert_input = x_flat[mask] expert_output = self.experts[expert_id](expert_input) output[mask] += expert_weights[mask].unsqueeze(-1) * expert_output return output.view(batch_size, seq_len, d_model) Top-K路由 每个token只被路由到K个专家(通常K=1或2)。这实现了计算量的稀疏化——在N=256个专家的情况下,每次只激活约0.8%的参数。 负载均衡:MoE的关键难题 如果不加约束,路由器会倾向于将大部分token分配给少数"优秀"专家,导致其他专家得不到训练。这就是负载不均衡问题。 辅助损失(Auxiliary Loss) GShard提出的经典方法,在训练损失中加入一项鼓励均匀分配的惩罚: L_aux = α * N * Σ(f_i * P_i) 其中 f_i 是分配给专家i的token比例,P_i 是路由器对专家i的平均概率。当分配均匀时 L_aux 最小。 ...

2026-07-02 · 2 min · 275 words · 硅基 AGI 探索者
RoPE旋转位置编码

RoPE旋转位置编码原理与改进

位置编码的困境 Transformer的自注意力机制本身是排列不变的——它不知道"猫追老鼠"和"老鼠追猫"的区别。位置编码是赋予模型位置感知能力的关键组件。 从绝对位置编码(正弦编码、可学习编码)到相对位置编码(T5 Bias、ALiBi),位置编码经历了多代演进。2021年Jianlin Su提出的RoPE(Rotary Position Embedding)巧妙地统一了绝对和相对位置编码,成为2026年主流大模型(LLaMA、Qwen、Mistral等)的标配。 RoPE的核心数学 基本思想 RoPE的核心思想是:通过对Query和Key施加旋转操作,使得它们的内积自然地编码相对位置信息。 给定位置 m 的Query向量 q 和位置 n 的Key向量 k,RoPE希望满足: <ROPE(q, m), ROPE(k, n)> = g(q, k, m-n) 即旋转后的内积只依赖于相对位置 m-n。 二维情况 在二维空间中,旋转操作有明确的几何意义。对向量 (q₀, q₁) 施加角度为 mθ 的旋转: ┌ q₀' ┐ ┌ cos(mθ) -sin(mθ) ┐ ┌ q₀ ┐ │ │ = │ │ │ │ └ q₁' ┘ └ sin(mθ) cos(mθ) ┘ └ q₁ ┘ 旋转后 Query 和 Key 的内积自然只依赖于角度差 (m-n)θ,即相对位置。 高维推广 将 d 维向量分成 d/2 组二维子空间,每组施加不同频率的旋转: ...

2026-07-02 · 2 min · 377 words · 硅基 AGI 探索者
Transformer注意力机制

Transformer注意力机制深度剖析

注意力机制的起源与直觉 Transformer的核心创新在于抛弃了RNN的序列依赖,转而使用注意力机制直接建模序列中任意两个位置之间的关联。这一思想源于人类视觉的注意力选择性——在处理信息时,我们会自然而然地将更多注意力分配给相关度高的部分。 从信息论的角度看,注意力机制本质上是一种信息检索过程:给定一个查询(Query),在一系列键值对(Key-Value)中检索出最相关的信息。这种检索不是硬性的离散选择,而是通过软权重实现连续可微的加权聚合。 缩放点积注意力的数学推导 标准的缩放点积注意力(Scaled Dot-Product Attention)公式为: Attention(Q, K, V) = softmax(QK^T / √d_k) V 其中 Q ∈ ℝ^{n×d_k},K ∈ ℝ^{m×d_k},V ∈ ℝ^{m×d_v}。 为什么要除以√d_k? 这是一个容易被忽视但至关重要的细节。当 d_k 较大时,QK^T 的元素值会随之增大。假设 Q 和 K 的每个元素都是均值为0、方差为1的独立随机变量,那么 QK^T 的每个元素的方差为 d_k。当 d_k = 512 时,点积值的量级可能达到 ±22 左右,这会使得 softmax 函数进入梯度饱和区。 除以 √d_k 将方差归一化为1,确保 softmax 的梯度保持健康。这个看似微小的缩放因子,在深层 Transformer 训练中起到了不可替代的稳定作用。 多头注意力的并行表达 单头注意力只能学习一种注意力模式,而多头注意力(Multi-Head Attention)允许模型同时关注不同表示子空间的信息: class MultiHeadAttention(nn.Module): def __init__(self, d_model=512, n_heads=8): super().__init__() self.d_model = d_model self.n_heads = n_heads self.d_k = d_model // n_heads self.W_q = nn.Linear(d_model, d_model) self.W_k = nn.Linear(d_model, d_model) self.W_v = nn.Linear(d_model, d_model) self.W_o = nn.Linear(d_model, d_model) def forward(self, x, mask=None): batch_size, seq_len, _ = x.shape Q = self.W_q(x).view(batch_size, seq_len, self.n_heads, self.d_k).transpose(1, 2) K = self.W_k(x).view(batch_size, seq_len, self.n_heads, self.d_k).transpose(1, 2) V = self.W_v(x).view(batch_size, seq_len, self.n_heads, self.d_k).transpose(1, 2) scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(self.d_k) if mask is not None: scores = scores.masked_fill(mask == 0, float('-inf')) attn = F.softmax(scores, dim=-1) out = torch.matmul(attn, V) out = out.transpose(1, 2).contiguous().view(batch_size, seq_len, self.d_model) return self.W_o(out) 每个头独立学习不同的注意力模式——有的头关注语法依赖,有的关注语义相似度,有的捕捉长距离位置关系。经验研究表明,8头注意力中不同头确实呈现出了明确的功能分化。 ...

2026-07-02 · 2 min · 256 words · 硅基 AGI 探索者
推理加速

大模型推理加速 2026:vLLM、SGLang、TensorRT-LLM 深度对比

引言 大模型的推理成本通常占AI总成本的70%以上。高效的推理框架不仅能够降低运营成本,还能提升用户体验。2026年,主流推理框架在性能、功能和易用性上都有显著提升。本文对vLLM、SGLang、TensorRT-LLM、TGI四大框架进行深度对比。 框架概览 vLLM 定位: 高吞吐、低延迟的LLM推理引擎 核心技术: PagedAttention:解决KV Cache碎片化问题 Continuous Batching:请求级动态批处理 Tensor Parallelism:模型并行 优势: 吞吐量比HuggingFace Transformers高24倍 社区最大,生态最丰富 支持多种量化格式(AWQ、GPTQ、SqueezeLLM) 局限: 主要优化标准生成场景 高级功能(如Speculative Decoding)仍在演进 SGLang 定位: 面向复杂推理场景的高性能框架 核心技术: RadixAttention:分层缓存的KV Cache管理 结构化输出:JSON、正则表达式约束 推理+训练一体化 优势: 复杂推理场景性能突出 结构化输出支持完善 支持Speculative Decoding 局限: 社区相对较小 文档和生态不如vLLM丰富 TensorRT-LLM 定位: NVIDIA官方的高性能推理优化库 核心技术: 算子级优化:针对NVIDIA GPU深度优化 量化:FP8、INT4、FP4支持 多GPU/多节点分布式推理 优势: NVIDIA硬件上的极致性能 工业级稳定性 与NVIDIA全栈生态集成 局限: 仅支持NVIDIA GPU 配置复杂,学习曲线陡 非NVIDIA硬件兼容性差 TGI (Text Generation Inference) 定位: HuggingFace的推理服务器 核心技术: 动态批处理 张量并行 连续批处理 优势: 与HuggingFace生态无缝集成 部署简单 支持Safetensors模型 局限: ...

2026-06-30 · 2 min · 306 words · 硅基 AGI 探索者
强化学习对齐

强化学习对齐 2026:从 RLHF 到 DPO 再到 ORPO

引言 大模型的对齐(Alignment)是让模型输出符合人类期望和价值的关键技术。从2022年RLHF的爆发,到2024年DPO的崛起,再到2026年ORPO和GRPO的成熟,对齐技术经历了深刻的范式转变。本文系统梳理这一演进历程。 RLHF:对齐的起点 核心原理 RLHF(Reinforcement Learning from Human Feedback)通过三个步骤实现对齐: 1. SFT(监督微调):用高质量数据训练基础模型 2. RM(奖励模型):训练模型评估输出质量 3. PPO(近端策略优化):用奖励信号优化策略 优点 理论完备,效果可证明 可优化任意可微奖励函数 缺点 训练复杂度高(4个模型同时训练) 超参数敏感,不稳定 需要大量人工标注 DPO:简化对齐的革命 核心思想 DPO(Direct Preference Optimization)绕过了奖励模型和强化学习,直接优化偏好数据。 关键突破: 将奖励函数隐式建模 直接对策略模型进行偏好优化 只需一个模型,训练稳定 数学本质: L_DPO = -log(σ[β log(π(y|x)/π_ref(y|x))]) 优点 训练简单:只需一个模型 训练稳定:无PPO的不稳定性 资源需求低:无需奖励模型 缺点 需要成对偏好数据 对数据质量敏感 复杂奖励无法表达 ORPO:SFT与DPO的统一 核心创新 ORPO(Odds Ratio Preference Optimization)将SFT和DPO统一到一个目标函数中。 核心公式: L_ORPO = -log(σ[log(π_chosen/π_rejected) - log(π_ref_chosen/π_ref_rejected)]) 与DPO的区别 维度 DPO ORPO 参考模型 需要 隐式 训练步骤 2步(SFT+DPO) 1步 数据需求 偏好对 偏好对 + 单样本 训练速度 中等 快 2026年进展 ORPO在2026年成为微调的首选方法,特别是在中小规模模型上表现优异。 ...

2026-06-30 · 1 min · 191 words · 硅基 AGI 探索者
Agentic RAG

RAG 系统 2026:从基础检索到 Agentic RAG 的演进

引言 检索增强生成(RAG)是2026年最实用的大模型应用架构之一。从基础的"检索-生成"流水线,到Agentic RAG的智能检索代理,RAG技术正在经历深刻的架构演进。本文系统梳理RAG的发展脉络和技术选型。 RAG 的演进阶段 第一阶段:基础 RAG(Naive RAG) 最原始的RAG架构,包含三个步骤: 将文档切分为片段 对片段进行向量化并存储 检索最相关的片段,拼接后输入模型 优点: 简单、快速、易于实现 缺点: 检索质量依赖单一向量相似度,无法处理复杂查询 第二阶段:增强 RAG(Enhanced RAG) 在基础RAG之上增加优化: 查询优化: 查询重写:将用户问题转化为更适合检索的形式 查询分解:将复杂问题拆分为多个子查询 多路检索:同时使用向量检索和关键词检索 后处理: 重排序(Reranking):对检索结果进行精排 上下文压缩:去除冗余片段,保留关键信息 自适应窗口:根据问题类型调整上下文长度 第三阶段:Agentic RAG Agentic RAG的核心思想:让Agent自主决定如何检索、何时检索、检索什么。 ┌─────────────────────────────────────────────┐ │ Agentic RAG 架构 │ │ │ │ ┌──────────┐ ┌──────────┐ │ │ │ Agent │───▶│ 检索 │ │ │ │ 规划器 │ │ 策略 │ │ │ └──────────┘ └──────────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌──────────┐ ┌──────────┐ │ │ │ 反思 │◀───│ 多路 │ │ │ │ 与调整 │ │ 检索 │ │ │ └──────────┘ └──────────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌──────────────────────────┐ │ │ │ 最终生成与验证 │ │ │ └──────────────────────────┘ │ └─────────────────────────────────────────────┘ 主流 RAG 框架对比 LangChain / LangGraph 特点: 生态最丰富,组件最全 适合: 快速原型开发、复杂RAG管线 ...

2026-06-30 · 2 min · 295 words · 硅基 AGI 探索者
MCP协议

MCP 协议 2026:Agent 工具调用的事实标准?

引言 2026年,AI Agent生态的碎片化问题日益凸显。不同框架、不同厂商的Agent之间缺乏统一的通信标准,导致"信息孤岛"和"工具孤岛"。MCP(Model Context Protocol)协议的推出,试图解决这个问题,但它能否成为事实标准?本文深入分析。 MCP 协议的核心设计 什么是 MCP? MCP是由Anthropic提出的开放协议,旨在为AI模型与外部数据源、工具和服务之间提供标准化的连接方式。 核心目标: 统一模型与工具的接口 降低Agent集成外部资源的成本 促进跨平台的互操作性 三层架构 ┌─────────────────────────────────────┐ │ MCP Host (应用层) │ │ Claude Desktop / Cursor / VSCode │ ├─────────────────────────────────────┤ │ MCP Client (客户端) │ │ 连接到 Server 的进程 │ ├─────────────────────────────────────┤ │ MCP Server (服务端) │ │ 提供资源/工具/提示的进程 │ ├─────────────────────────────────────┤ │ 外部数据源 / API │ └─────────────────────────────────────┘ 三大核心抽象 资源(Resources):Agent可以读取的数据(文件、数据库记录、API响应等) 工具(Tools):Agent可以调用的操作(搜索、计算、执行命令等) 提示(Prompts):预定义的对话模板,帮助Agent高效完成常见任务 MCP 与 A2A 协议的对比 MCP vs A2A 维度 MCP A2A 设计目标 模型-工具连接 Agent-Agent通信 通信模式 Client-Server Peer-to-Peer 主要场景 单Agent扩展 多Agent协作 标准化程度 较成熟 早期阶段 生态规模 1000+ Server 数十个实现 互补而非竞争 MCP和A2A解决的是不同层面的问题: ...

2026-06-30 · 2 min · 249 words · 硅基 AGI 探索者
鲁ICP备2026018361号