一个 8KB 的参数,让 7B 大模型推理速度提升 4 倍,内存压缩 248 倍
问题:Attention 跑不了长序列
Transformer 的自注意力机制有个根本性问题:
r
A_ij = exp(q_i^T k_j / √d) / Σ_l exp(q_i^T k_l / √d)
序列长度 n 翻倍 → 计算量翻 4 倍,KV Cache 也翻 4 倍。
一个 7B 模型处理 4K 序列,KV Cache 就要占 168MB;处理 64K 序列,需要 2GB+ ,普通笔记本根本跑不动。
20 年来,大家一直在想办法绕开这个 O(n²):
- FlashAttention:优化 I/O 路径,不改变复杂度
- MQA/GQA:多查询/分组查询注意力,共享 K/V
- 稀疏注意力:预设稀疏模式,灵活度差
- Mamba/RWKV:线性复杂度,但效果有差距
我们的思路不同:不是近似,而是"聪明地压缩"。
我们的方案:Signal Field Attention
想象你听一个人说话:
- 他刚刚说的(近场),你听得清清楚楚
- 他很久之前说的(远场),你记住了大概意思,不需要一字不差
SFA 就是让 LLM 学会这个机制:
双通道架构
scss
┌─────────────────────────┐
输入 Q_t ───────→ │ SFA 注意力机制 │
│ │
┌─────┴─────┐ │
│ 近场通道 │──→ softmax(k个token)───→ O_near
│ 精确计算 │ │
└───────────┘ │
(最近 k 个 token,精确计算) │
│
┌───────────┐ │
│ 远场通道 │──→ EWMA 压缩状态 ──→ α · S_far
│ 压缩存储 │ │
└───────────┘ │
(历史所有 token 的加权平均) │
│
┌─────────────────────────┐ │
│ 融合: O = O_near + α·S_far │
└─────────────────────────┘ │
↓
输出
近场通道:对最近的 k 个 token 做标准 softmax 注意力(精确)
远场通道 :用 EWMA(指数加权移动平均) 压缩历史 KV 到固定大小的状态 S
融合:两个通道的输出加权求和
核心公式
ini
S_t = γ · S_{t-1} + (1-γ) · mean(K_hist)
O = O_near + α · S_far
- γ ∈ (0,1):衰变因子,控制"记忆"多远
- α:可学习混合系数
整个 SFA 只需要约 8KB 的可学习参数。
实验结果(直接上图数据)
推理加速:4.16 倍
在 Qwen2.5-7B-Instruct (4-bit) 上的测试结果:
| 序列长度 | 标准注意力 | SFA | 加速比 |
|---|---|---|---|
| 128 tokens | 45ms | 12ms | 3.75× |
| 1,024 tokens | 720ms | 173ms | 4.16× |
| 4,096 tokens | 11,520ms | 2,769ms | 4.16× |
关键发现:序列越长,加速越稳定。
内存压缩:248 倍
| 序列长度 | 标准 KV Cache | SFA KV Cache | 压缩比 |
|---|---|---|---|
| 1,024 | 168 MB | 4.2 MB | 40× |
| 4,096 | 672 MB | 8.6 MB | 78× |
| 8,192 | 2.1 GB | 8.6 MB | 248× |
到了 64K 序列,标准注意力内存溢出,SFA 正常运行。
困惑度:甚至更好!
在 Qwen2.5-0.5B 上,替换 3 个层做蒸馏训练后:
| 层 | 原始 PPL | SFA PPL | 变化 |
|---|---|---|---|
| 第 0 层(浅层) | 22.375 | 23.062 | +3.07% |
| 第 11 层(中层) | 22.375 | 22.255 | -0.57% |
| 第 23 层(深层) | 22.375 | 20.011 | -10.57% |
深层反而更好了! 因为我们压缩掉的是冗余的语法细节,保留的是高层语义。
训练成本
| 指标 | 数值 |
|---|---|
| 额外参数 | 8.1 KB |
| 训练步数 | < 800 步 |
| 训练时间 | < 2 分钟 |
| 显存占用 | ~200 MB |
为什么深层效果更好?
这其实有一个理论直觉:
- 浅层编码语法、词法细节 → 这些需要精确信息 → 压缩损失大
- 深层编码语义、抽象概念 → 这些信息天然可压缩 → 压缩后反而更鲁棒
这和其他论文的观察一致:Transformer 的深层表示更"语义化"、更"抽象"。
和 LoRA 的对比
| LoRA | SFA | |
|---|---|---|
| 目的 | 微调 | 推理加速 |
| 额外参数 | 0.1-1% 模型大小 | ~8KB |
| 推理加速 | 无 | 4.16× |
| 内存节省 | 无 | 248× |
| 训练数据 | 需要任务数据 | 从基础模型蒸馏 |
两者不冲突,甚至可以组合使用。
局限性(说实话)
- 蒸馏训练能获得最优效果(虽然训练超快)
- 浅层有 ~3% 的 PPL 退化
- 目前只在自回归语言建模上测试过
- 最佳压缩窗口 k 可能因模型而异
我们做了什么
完整的技术栈
bash
qn1-experiments/
├── 01-signal-field/ # SFA 核心算法(纯 Python)
├── 02-huayue/ # 混合架构探索
├── 03-guiyuan/ # 增量推理:预填/解码分离
├── 04-lingya/ # 正交基微调
├── 05-ring-buffer/ # 环形缓冲区 KV Cache
├── 06-rca/ # 频域注意力
├── 07-metal-kernel/ # Metal 加速内核
├── 08-ultra/ # 极致部署优化
├── src/ # MLX 完整模型实现
│ ├── taicu_sf_v2.py # SFA 完整替换
│ ├── taicu_0.5b_distill.py # 0.5B 蒸馏
│ ├── taicu_7b_benchmark.py # 7B 基准测试
│ └── ...
├── LICENSE # MIT
└── TECHNICAL_REPORT.md # 论文
特性
- ✅ 纯 Python 实验 (
01-到08-目录):零依赖,任何平台可跑 - ✅ MLX 完整实现 (
src/目录):Apple Silicon 原生加速 - ✅ MIT 开源:可以商用
- ✅ 论文:完整技术报告 + 参考文献
一键运行
bash
cd 01-signal-field
python test_signal_field.py # 验证 SFA 原理
cd src
python taicu_sf_v2.py # 7B 模型完整推理
python ../run_all.py # 运行所有实验
给 SFA 点个赞
代码全开源,MIT 协议:
如果你也在做高效 LLM 推理、长序列处理、或者 Attention 的优化------这个方案值得一试。
8KB 的改动,4 倍的速度,248 倍的内存压缩。
这或许就是"让 AI 学会压缩记忆"的第一步。
本文代码和论文同步开源。欢迎 fork、PR、讨论。