Skip to content

Transformer 推理图 — 概念

Transformer 层结构

标准 LLaMA 层的计算图:

RoPE (Rotary Position Embedding)

rope 将位置信息编码到 Q 和 K 中:

对于位置 pos 和维度 d:
cos(θ) = cos(pos / 10000^(2d/dim))
sin(θ) = sin(pos / 10000^(2d/dim))

RoPE(x, pos) = [x_even * cos(θ) - x_odd * sin(θ),
                x_even * sin(θ) + x_odd * cos(θ)]

变体:

  • LLaMA RoPE — 标准 RoPE
  • RoPE Neox — 调整频率基准
  • mRoPE — 多维 RoPE(用于多模态)
  • LongRoPE — 支持更长上下文

DeepSeek Sparse Attention (DSA)

DeepSeek V3.2 引入了全新的 DSA 机制,使用 lightning indexer 实现稀疏注意力:

  • 新增 llama_kv_cache_dsa,在 KV cache 基础上附加 lightning indexer 缓存
  • 支持基于 NVFP4 的稀疏检索
  • 计算图中引入 GGML_OP_FILL 的 f16 路径用于 indexer 构建
  • KQ mask 使用 DS32 类型确保类型安全

注意力计算

c
// Scaled Dot-Product Attention
QK = ggml_mul_mat(ctx, K, Q)           // Q @ K^T
QK = ggml_scale(ctx, QK, 1/sqrt(d_k))  // 缩放
QK = ggml_add(ctx, QK, mask)            // 因果 mask(现在支持 f16 节省 VRAM)
S  = ggml_soft_max(ctx, QK)             // softmax
O  = ggml_mul_mat(ctx, V, S)            // S @ V

Flash Attention f16 maskset_input_k_q_mask_impl 已从仅支持 float 模板化为支持 <typename T>,现在 KQ mask 可使用 f16 类型,在大模型上显著减少 VRAM 占用。

SwiGLU FFN

LLaMA 系列使用 SwiGLU 激活:

c
// SwiGLU(x) = (SiLU(x @ W_gate) ⊙ (x @ W_up)) @ W_down
gate = ggml_mul_mat(ctx, w_gate, x);
up   = ggml_mul_mat(ctx, w_up, x);
gate = ggml_silu(ctx, gate);      // SiLU = x * sigmoid(x)
ffn  = ggml_mul(ctx, gate, up);
out  = ggml_mul_mat(ctx, w_down, ffn);

注意:ffn_latent_down / ffn_latent_up 等张量被标记为 MUL_MAT 操作(而非逐元素 MUL),确保后端类型探测(buft probe)能正确选择量化矩阵乘法路径。

Multi-Token Prediction (MTP) 图基础设施

MTP 推测解码的推理图现在有了专用输入类型 llm_graph_input_mtp

  • 独立于主图的 MTP token 输入管理
  • Qwen 3.5 使用后归一化(post-norm)隐藏状态进行 MTP,与标准前归一化路径不同
  • StepFun 3.5 支持单层 MTP
  • Draft context 始终配置 n_parallel 个输出,n_outputs_max 参数可限制最大输出数以节省 VRAM

相关概念

  • rope — 旋转位置编码详解
  • compute-graph — 计算图的构建与执行
  • kv-cache — KV Cache 如何加速注意力计算