Skip to content

KDA——GLM 5.3 引入的逐头门控 delta 规则递归线性注意力。它不存 KV cache:历史被压缩进每头一个固定大小的递归状态矩阵,内存与上下文长度无关。ds4 里 GLM 5.3 每 4 层取 3 层用 KDA,第 4 层保留完整 DSA 稀疏注意力负责精确检索。

它解决什么 ​

标准注意力(含 MLA)的 cache 随 token 数线性增长——这是长上下文最主要的内存压力。线性注意力的思路:把"对历史做加权检索"改写成递归状态更新,历史信息卷进一个固定大小的矩阵里,每来一个 token 只做 O(1) 的状态刷新——内存常数、计算也随长度摊平。

代价是有损:固定状态不可能无损记住任意长的历史,精确检索能力("原文第 8372 行说了什么")会退化。所以 GLM 5.3 用混合架构兜底:ds4_glm53_layer_is_kda(il) 判定 il % 4 != 3——3/4 的层跑 KDA 省内存,每第 4 层跑完整 DSA 稀疏注意力 + pool-4 索引器(DS4_GLM53_INDEX_POOL_SIZE = 4)把精确回忆补回来。

递归状态怎么更新 ​

decode 内核(kernel_glm53_kda_decode,metal/glm53_kda.metal;ROCm 侧 glm53_rocm_kda_decode_kernel)五步:

  1. 深度 4 短卷积:q/k/v 各过一个 3 步滚动的 conv_state,再 silu——给纯递归加上极短程的局部记忆
  2. 逐通道衰减:d = exp(lower_bound · sigmoid(exp(a_log) · (raw_gate + dt_bias)))——可学习的"遗忘门",每通道独立决定留多少旧状态
  3. 归一化:q、k L2 归一化(q 乘 1/√2 量级缩放)
  4. Delta 规则(名字的由来):H = H·d; delta_v = (v − H·k) · sigmoid(β); H += k ⊗ delta_v; o = H·q——先用当前 k 探测状态里已记住的内容,只把残差 v − H·k 写回去。对比朴素线性注意力直接累加 H += k ⊗ v(旧信息只会稀释、永不修正),delta 规则能改写已存的关联
  5. 输出门:kda_o_norm RMSNorm 后乘 sigmoid 输出门(g_a/g_b 低秩投影)

状态尺寸与生命周期 ​

每层状态 = 卷积状态(session_glm_kda_conv_state_bytes)+ 递归状态(session_glm_kda_recurrent_state_bytes:64 头 × 128×128 f32)。它取代了这些层的 KV cache(kv_raw_dim = 0),所以:

  • 会话恢复 / SSD streaming 切层时要显式搬运状态(glm53_graph_copy_kda_state、ds4_session_glm_reset_kda_state)
  • prefill 是三内核流水:prepare → recurrence → output(ds4_gpu_glm53_kda_prefill 入口)

性能路径 ​

  • M3 Ultra BF16 融合:Q4 工件把 kda_q/k/v 留在 BF16,ds4_gpu_glm53_matmul_bf16_qkv 一个内核同时产出 q/k/v(metal/glm53_bf16.metal),砍掉每层三次 dispatch——decode 24.74 t/s(M3 Ultra 512GB)
  • 量化:KDA dense 张量在 Q2/Q4 工件里都升 Q8_0(Q2 工件单独保 kda_q/kda_k 在 Q4_K)——递归状态每步都被读写,量化噪声会随递归累积,这里不能省

相关概念 ​

  • gdn — Qwen3.8 的同族层(Gated DeltaNet):同样的 delta 规则 + 门控思想,48 v 头配 16 k 头的头组织
  • mla — DeepSeek 侧的 cache 压缩路线:latent 仍按 token 存行,是"压缩"不是"归零"
  • moe — GLM 5.3 的 288 专家取 8 + 1 共享,与 KDA 同为省算力/省内存的稀疏化手段
  • Part 3 §6 — GLM 5.3 完整架构与层混合