near_memory_computing

第1章:为什么Transformer需要PIM?内存墙危机

章节概览

本章深入剖析Transformer模型在推理阶段面临的内存瓶颈问题,通过定量分析展示传统架构的局限性,为引入PIM技术奠定基础。我们将以Qwen-72B为例,用具体数据说明为什么内存带宽已成为大模型推理的首要瓶颈。

1.1 解码器瓶颈:单token生成与内存带宽

1.1.1 Transformer解码的独特挑战

Transformer解码过程与训练截然不同:

这种差异源于自回归生成的本质。在训练时,我们知道完整的输入和目标序列,可以利用teacher forcing进行并行计算。而在推理时,每个新token的生成都依赖于之前所有token,形成了严格的顺序依赖。

让我们量化这个差异。对于Qwen-72B模型:

模型参数

对比训练vs推理的计算模式: | 阶段 | 批次大小 | 序列长度 | 并行度 | 内存重用 | 算术强度 | |——|———|———|——–|———|———-| | 训练 | 256-1024 | 2048-4096 | 极高 | 高 | 50-200 | | 推理(预填充) | 1-32 | 128-2048 | 中等 | 中等 | 10-50 | | 推理(解码) | 1-8 | 1(per step) | 低 | 极低 | 1-5 |

关键差异在于:

1.1.2 单token生成的计算量

理解单token生成的计算量是分析内存瓶颈的基础。我们需要精确计算每个组件的FLOPs(浮点运算次数),这里采用标准计算方法:矩阵乘法 A(m×k) × B(k×n) 需要 2×m×k×n FLOPs(乘法和加法各计一次)。

每生成一个token需要的计算量(FLOPs)详细分解:

自注意力层

Q投影: batch × seq_len × (hidden_dim × hidden_dim) 
     = 1 × 1 × (8192 × 8192) × 2 = 134.2M FLOPs
     说明:输入向量(1×8192)与权重矩阵(8192×8192)相乘

K投影: 1 × 1 × (8192 × (1024 × 8)) × 2 = 134.2M FLOPs
     说明:GQA优化后,K/V头数减少到8个,每个头维度1024
     
V投影: 1 × 1 × (8192 × (1024 × 8)) × 2 = 134.2M FLOPs

注意力得分计算 (假设已有1000个token的历史):
- Q·K^T: 64 heads × (1 × 128) × (1000 × 128) × 2 = 16.4M FLOPs
  说明:每个头的查询向量(1×128)与历史键矩阵(1000×128)^T相乘
  
- Softmax: ~8M FLOPs 
  细分:exp(1000个值) + sum + div,约8K FLOPs/头 × 64头
  
- Score·V: 64 heads × (1 × 1000) × (1000 × 128) × 2 = 16.4M FLOPs
  说明:注意力权重(1×1000)与值矩阵(1000×128)相乘

输出投影: 1 × 8192 × 8192 × 2 = 134.2M FLOPs

小计: 577.4M FLOPs

FFN层(SwiGLU激活):

SwiGLU是Gated Linear Unit的变体,计算公式为: FFN(x) = (SiLU(xW_gate) ⊙ xW_up)W_down

Gate计算: x → Linear(8192→28672) → SiLU
        = 1 × 8192 × 28672 × 2 = 469.8M FLOPs (线性变换)
        + 28672 × 3 = 86K FLOPs (SiLU激活: x·σ(x))
        
Up投影: x → Linear(8192→28672)
       = 1 × 8192 × 28672 × 2 = 469.8M FLOPs

门控乘法: 28672 element-wise multiplications = 28.7K FLOPs

Down投影: Linear(28672→8192)
         = 1 × 28672 × 8192 × 2 = 469.8M FLOPs

小计: 1,409.7M FLOPs

注意:FFN的隐藏维度(28672)是模型维度(8192)的3.5倍,这是Qwen模型的设计选择,不同于标准的4倍扩展。

其他操作

每层总计:1,718M FLOPs 80层总计:137.4 GFLOPs

1.1.3 内存访问量分析

关键洞察:每个权重参数在单token推理时只使用一次!

权重加载量(INT4量化)详细计算:

自注意力权重:
- Q投影: 8192 × 8192 × 4 bits = 32 MB
- K投影: 8192 × 1024 × 8 × 4 bits = 32 MB  
- V投影: 8192 × 1024 × 8 × 4 bits = 32 MB
- O投影: 8192 × 8192 × 4 bits = 32 MB
小计: 128 MB/层

FFN权重:
- Gate: 8192 × 28672 × 4 bits = 117.4 MB
- Up: 8192 × 28672 × 4 bits = 117.4 MB
- Down: 28672 × 8192 × 4 bits = 117.4 MB
小计: 352.2 MB/层

每层总权重: 480.2 MB
80层总权重: 38.4 GB

激活值内存访问

每层激活值大小: 8192 × 2 bytes = 16 KB
残差流: 16 KB × 2 (读+写) = 32 KB
中间激活 (FFN): 28672 × 2 bytes = 57 KB
总计每层: ~105 KB
80层: 8.4 MB (可忽略相比权重)

KV Cache访问

K-Cache每层: num_kv_heads × seq_len × head_dim × precision
           = 8 × 1000 × 1024 × 2 bytes = 16.4 MB
V-Cache每层: 8 × 1000 × 1024 × 2 bytes = 16.4 MB
每层KV: 32.8 MB
80层总计: 2.62 GB

注意:序列生成过程中的累积访问量
- 第1个token: 0 GB
- 第100个token: 262 MB  
- 第1000个token: 2.62 GB
- 第10000个token: 26.2 GB

总内存访问量

1.1.4 算术强度计算

更精确的算术强度分析:

算术强度 = 计算量 / 内存访问量
        = 137.4 GFLOPs / 39.7 GB
        = 3.46 FLOPs/byte

不同组件的算术强度: | 组件 | 计算量 | 内存访问 | 算术强度 | |—–|——–|———-|———| | QKV投影 | 16.4 GFLOPs | 9.6 GB | 1.71 | | 注意力计算 | 3.3 GFLOPs | 2.62 GB | 1.26 | | FFN | 112.8 GFLOPs | 28.2 GB | 4.00 | | 其他 | 4.9 GFLOPs | 0.67 GB | 7.31 |

观察:FFN层算术强度最高,但仍远低于硬件峰值比率。

硬件对比: | GPU | 计算能力 | 带宽 | 峰值比率 | Qwen-72B利用率 | |—–|———|——|———|—————| | H100 | 60 TFLOPs | 3.35 TB/s | 17.9 | 19.3% | | A100 | 19.5 TFLOPs | 1.55 TB/s | 12.6 | 27.5% | | A6000 | 38.7 TFLOPs | 0.768 TB/s | 50.4 | 6.9% | | 4090 | 82.6 TFLOPs | 1.01 TB/s | 81.8 | 4.2% |

1.1.5 实际性能预测

理论性能上界

H100示例:
内存带宽限制: 3.35 TB/s / 39.7 GB = 84.4 tokens/s
计算能力限制: 60 TFLOPs / 137.4 GFLOPs = 436.7 tokens/s
实际瓶颈: min(84.4, 436.7) = 84.4 tokens/s (内存限制)

实测性能与理论差距

性能损失来源

  1. 内存访问模式 (15-20%损失)
    • 非连续访问
    • Cache miss
    • DRAM bank冲突
  2. 调度开销 (10-15%损失)
    • Kernel启动延迟
    • 同步等待
    • 数据传输
  3. 其他因素 (10-15%损失)
    • 功耗限制降频
    • 温度节流
    • 系统调用开销

延迟分解(单token,批大小=1):

总延迟: 20-22 ms
├── 权重加载: 11.5 ms (52%)
├── KV-Cache访问: 0.8 ms (4%)
├── 计算执行: 2.3 ms (10%)
├── 调度开销: 3.5 ms (16%)
└── 其他: 3.9 ms (18%)

批处理效应分析: | 批大小 | 吞吐量 | 延迟 | 算术强度 | GPU利用率 | |——–|——–|——|———|———–| | 1 | 50 tok/s | 20ms | 3.46 | 19% | | 4 | 180 tok/s | 22ms | 6.92 | 38% | | 8 | 320 tok/s | 25ms | 10.38 | 58% | | 16 | 520 tok/s | 31ms | 17.30 | 73% | | 32 | 720 tok/s | 44ms | 31.14 | 85% |

但大批处理的实际限制:

1.2 量化问题:Qwen-72B的Roofline分析

1.2.1 Roofline模型基础

Roofline模型可视化了性能瓶颈:

Roofline模型的直观理解: 想象一个屋顶形状的性能边界:

性能↑
    |     计算屋顶(平顶)
    |    ╱─────────────
    |   ╱ 
    |  ╱  内存墙(斜坡)
    | ╱   
    |╱    
    └─────────────────────→ 算术强度
         转折点

在这个模型中:

关键参数定义

1.2.2 Qwen-72B在不同平台的表现

H100详细分析

硬件规格:
- 峰值FP16性能: 60 TFLOPs (稠密) / 120 TFLOPs (稀疏)
- 峰值INT8性能: 120 TFLOPs (稠密) / 240 TFLOPs (稀疏)
- HBM3带宽: 3.35 TB/s
- L2缓存: 50 MB

Roofline参数:
- 计算屋顶: 60,000 GFLOPs/s (FP16)
- 内存墙斜率: 3,350 GB/s
- 转折点: 17.9 FLOPs/byte

Qwen-72B工作点:
- 坐标: (3.46, 137.4) 
- 理论性能: min(60000, 3350 × 3.46) = 11,591 GFLOPs/s
- 实际性能: ~8,000 GFLOPs/s
- 利用率: 8,000 / 60,000 = 13.3%

多平台对比分析

平台 计算峰值 带宽 转折点 Qwen位置 瓶颈类型 实际利用率
H100 60 TFLOPs 3.35 TB/s 17.9 3.46 内存墙 13.3%
A100 19.5 TFLOPs 1.55 TB/s 12.6 3.46 内存墙 18.4%
A6000 38.7 TFLOPs 768 GB/s 50.4 3.46 内存墙 6.9%
4090 82.6 TFLOPs 1.01 TB/s 81.8 3.46 内存墙 4.2%
MI300X 192 TFLOPs 5.3 TB/s 36.2 3.46 内存墙 9.5%
TPU v4 275 TFLOPs 1.2 TB/s 229.2 3.46 内存墙 1.5%

不同批次大小的影响

计算批处理对算术强度的影响:

算术强度(batch_size) = 计算量(batch_size) / 内存访问量(batch_size)

其中:
- 计算量 ∝ batch_size (线性增长)
- 权重访问量 = 常数 (权重共享)
- KV-Cache访问 ∝ batch_size (但可以优化)
Batch 计算量 权重访问 KV访问 总内存 算术强度 性能@H100 位置
1 137 GF 38.4 GB 1.3 GB 39.7 GB 3.46 11.6 TF/s 内存墙
4 550 GF 38.4 GB 5.2 GB 43.6 GB 12.6 42.2 TF/s 内存墙
8 1.1 TF 38.4 GB 10.4 GB 48.8 GB 22.5 60.0 TF/s 转折点
16 2.2 TF 38.4 GB 20.8 GB 59.2 GB 37.2 60.0 TF/s 计算顶
32 4.4 TF 38.4 GB 41.6 GB 80.0 GB 55.0 60.0 TF/s 计算顶

实际限制因素

  1. 延迟要求: Batch>8时首token延迟>100ms
  2. 内存容量: 32K序列时Batch=8需要160GB KV-Cache
  3. 功耗限制: 大batch导致功耗超限降频

1.2.3 量化对Roofline的影响

量化策略详细分析

不同量化方式的数学基础:

FP16: 1位符号 + 5位指数 + 10位尾数
INT8: 8位定点,需要scale和zero point
INT4: 4位定点,通常采用对称量化
INT2: 2位三值量化 {-1, 0, +1} 或四值 {-1.5, -0.5, +0.5, +1.5}

量化对模型大小和算术强度的影响

量化 权重大小 KV大小 总内存/token 算术强度 理论性能 实际性能 精度损失
FP16 144 GB 5.24 GB 149.2 GB 0.92 3.1 TF/s 2.8 TF/s 0%
INT8 72 GB 2.62 GB 74.6 GB 1.84 6.2 TF/s 5.5 TF/s 0.1%
W4A16 36 GB 5.24 GB 41.2 GB 3.34 11.2 TF/s 9.8 TF/s 0.5%
W4A8 36 GB 2.62 GB 38.6 GB 3.56 11.9 TF/s 10.2 TF/s 1.2%
W2A16 18 GB 5.24 GB 23.2 GB 5.92 19.8 TF/s 15.5 TF/s 3.5%
W2A8 18 GB 2.62 GB 20.6 GB 6.67 22.4 TF/s 16.8 TF/s 5.2%

量化技术深入

  1. 对称vs非对称量化
    对称: x_int = round(x_fp / scale)
    非对称: x_int = round(x_fp / scale) + zero_point
    
  2. 分组量化(Group-wise)
    • 每128个权重共享一个scale
    • 额外存储开销: +3.1%
    • 精度提升明显
  3. 混合精度策略
    • 关键层(如第一层/最后层)保持FP16
    • 注意力层W4A16,FFN层W2A16
    • 离群值通道保持高精度

Roofline视角下的量化收益递减

性能提升比 = 新算术强度 / 原算术强度 × 带宽利用率

FP16→INT8: 1.84/0.92 × 0.89 = 1.78× (78%提升)
INT8→INT4: 3.34/1.84 × 0.87 = 1.58× (58%提升)  
INT4→INT2: 5.92/3.34 × 0.78 = 1.38× (38%提升)

观察:随着量化程度加深,性能提升逐渐递减,同时精度损失加速增长。

极限分析: 即使权重大小降为0(理想情况),算术强度上限:

算术强度_max = 137.4 GFLOPs / 5.24 GB (KV+激活) = 26.2
H100性能上限 = min(60 TFLOPs, 3.35 × 26.2) = 60 TFLOPs
理论最大利用率 = 100%

但这需要:

1.3 数据搬移成本:能耗分解

1.3.1 能耗层次结构

不同工艺节点的能耗对比

操作类型 45nm (pJ) 28nm (pJ) 16nm (pJ) 7nm (pJ) 相对成本@7nm
INT8乘法 0.2 0.08 0.03 0.01
FP16乘法 0.4 0.15 0.06 0.02
INT32加法 0.1 0.04 0.015 0.005 0.5×
Register读取 0.1 0.04 0.015 0.005 0.5×
SRAM读取 (1KB) 5 2 0.8 0.3 30×
SRAM读取 (64KB) 10 4 1.6 0.6 60×
SRAM读取 (1MB) 20 8 3.2 1.2 120×
L2 Cache (8MB) 50 20 8 3 300×
DRAM读取 200 120 80 50 5000×
HBM读取 150 90 60 40 4000×
跨片传输(PCIe) 2000 1500 1200 1000 100000×
片间通信(NVLink) 500 300 200 150 15000×

数据搬移距离与能耗的关系

能耗 ∝ 距离 × 电容
- 片内1mm: ~0.25 pJ/bit
- 片内10mm: ~2.5 pJ/bit  
- 封装内(2.5D): ~5 pJ/bit
- 板级: ~50 pJ/bit
- 机箱内: ~500 pJ/bit

1.3.2 Qwen-72B推理能耗分解

详细的能耗计算(基于7nm工艺):

1. 计算能耗

自注意力计算:
- QKV矩阵乘: 16.4G × 0.02 pJ = 0.328 mJ
- 注意力分数: 3.3G × 0.02 pJ = 0.066 mJ
- 输出投影: 5.4G × 0.02 pJ = 0.108 mJ
小计: 0.502 mJ/层

FFN计算:
- Gate/Up: 75.2G × 0.02 pJ = 1.504 mJ
- Down: 37.6G × 0.02 pJ = 0.752 mJ
小计: 2.256 mJ/层

其他:
- LayerNorm: 0.016 mJ/层
- 激活函数: 0.024 mJ/层

每层总计算: 2.798 mJ
80层总计: 223.84 mJ

2. 内存访问能耗

片上缓存访问:
- L1 (256KB): 8.4M × 0.6 pJ = 5.04 mJ
- L2 (50MB): 168M × 3 pJ = 504 mJ

片外内存访问:
- 权重加载(HBM): 38.4G × 40 pJ = 1.536 J
- KV-Cache(HBM): 1.31G × 40 pJ = 52.4 mJ
- 激活值(DRAM): 8.4M × 50 pJ = 0.42 mJ

数据传输:
- GPU↔CPU: 100M × 150 pJ = 15 mJ
- NVLink通信: 50M × 150 pJ = 7.5 mJ

内存总计: 2.115 J

3. 其他开销

- 控制逻辑: ~50 mJ
- 时钟分配: ~30 mJ
- 总线仲裁: ~20 mJ
小计: 100 mJ

能耗比例分解: | 组件 | 能耗 | 占比 | 累积占比 | |——|——|——|———| | HBM权重读取 | 1.536 J | 65.8% | 65.8% | | L2缓存 | 504 mJ | 21.6% | 87.4% | | 计算 | 224 mJ | 9.6% | 97.0% | | KV-Cache | 52.4 mJ | 2.2% | 99.2% | | 其他 | 18.6 mJ | 0.8% | 100% | | 总计 | 2.334 J | 100% | - |

1.3.3 功耗墙影响

不同功耗预算下的性能分析

功耗预算 理论tokens/s 能效(tokens/J) 实际性能 限制因素
100W 42.8 0.428 25 tok/s 功耗+带宽
300W 128.5 0.428 65 tok/s 带宽为主
500W 214.2 0.428 75 tok/s 带宽瓶颈
700W 299.9 0.428 84 tok/s 纯带宽限制
1000W 428.4 0.428 84 tok/s 纯带宽限制

实际系统的功耗分配(H100为例):

总功耗: 700W
├── 计算单元: 150W (21.4%)
├── 内存系统: 350W (50.0%)
│   ├── HBM: 250W
│   └── 内存控制器: 100W
├── 片上网络: 80W (11.4%)
├── I/O接口: 70W (10.0%)
└── 其他: 50W (7.2%)

能效对比分析

场景 能效 相对理想情况 瓶颈
实际Qwen@H100 0.12 tok/J 0.27% 内存搬移
仅计算能耗 4.47 tok/J 10% 理论上界
片上SRAM计算 2.35 tok/J 5.3% 容量限制
理想PIM 44.7 tok/J 100% 技术目标

1.3.4 能耗优化的根本矛盾

冯诺依曼架构的能耗困境

  1. 距离悖论:计算单元越强大,离内存越远
  2. 容量悖论:存储越大,访问能耗越高
  3. 并行悖论:并行度越高,通信能耗越大

数据搬移能耗的物理极限

Landauer极限: kT×ln(2) = 2.8×10^-21 J/bit @ 300K
当前DRAM: 50 pJ/bit = 1.8×10^10倍于理论极限
改进空间: 理论上还有10个数量级

PIM方案的能效优势来源

  1. 消除片外访问:节省95%的内存能耗
  2. 减少数据搬移:权重不动,只移动激活值
  3. 提高并行度:存储阵列天然并行
  4. 降低电压:短距离允许低压操作

量化能效收益

传统架构每token能耗: 2.334 J
├── 可消除部分: 2.04 J (87.4%)
│   ├── HBM权重: 1.536 J
│   └── L2缓存: 0.504 J  
└── 不可消除: 0.294 J (12.6%)
    ├── 计算: 0.224 J
    └── KV/激活: 0.070 J

PIM潜在能效: 0.294 J/token
能效提升: 7.9倍

1.4 KV-Cache爆炸:随序列长度的扩展

1.4.1 KV-Cache增长模式

KV-Cache的数学模型

单批次KV-Cache大小:
KV_size = 2 × num_layers × num_kv_heads × seq_len × head_dim × precision

多批次总大小:
Total_KV = batch_size × KV_size

内存带宽需求:
BW_required = KV_size × (读取 + 写入) × tokens_per_second

Qwen-72B的具体计算

基础参数:
- 层数: 80
- KV头数: 8 (GQA优化,原64头)
- 头维度: 1024
- 精度: FP16 (2 bytes)

每token增量:
ΔKV = 2 × 80 × 8 × 1 × 1024 × 2 = 2.62 MB

序列长度为n时:
KV_total = 2.62 MB × n

KV-Cache访问模式分析

生成第i个token时:
- 写入新KV: 2.62 MB (一次)
- 读取历史KV: 2.62 MB × (i-1) (用于注意力计算)
- 总访问量: 2.62 MB × i

累积访问量(生成n个token):
Σ(i=1 to n) 2.62 MB × i = 2.62 MB × n(n+1)/2

1.4.2 不同序列长度的影响

详细的性能影响分析

序列长度 KV-Cache大小 权重访问 KV累积访问 总带宽需求 算术强度 H100性能 延迟/token
1K 2.62 GB 38.4 GB 1.31 GB 41.0 GB 3.35 81.7 tok/s 12.2 ms
2K 5.24 GB 38.4 GB 5.24 GB 43.6 GB 3.15 76.8 tok/s 13.0 ms
4K 10.5 GB 38.4 GB 21.0 GB 48.9 GB 2.81 68.5 tok/s 14.6 ms
8K 21.0 GB 38.4 GB 84.0 GB 59.4 GB 2.31 56.4 tok/s 17.7 ms
16K 42.0 GB 38.4 GB 336 GB 80.4 GB 1.71 41.7 tok/s 24.0 ms
32K 84.0 GB 38.4 GB 1.34 TB 122.4 GB 1.12 27.4 tok/s 36.5 ms
64K 168 GB 38.4 GB 5.38 TB 206.4 GB 0.67 16.2 tok/s 61.7 ms
128K 336 GB 38.4 GB 21.5 TB 374.4 GB 0.37 8.9 tok/s 112 ms

序列长度对各组件的影响

权重访问: O(1) - 与序列长度无关
KV-Cache存储: O(n) - 线性增长
KV-Cache访问: O(n²) - 平方增长
计算复杂度: O(n) - 线性增长(每token)

内存容量限制分析

GPU 内存容量 最大序列@FP16 最大序列@INT8 最大序列@INT4
A100 40GB 40 GB 15K 30K 61K
A100 80GB 80 GB 30K 61K 122K
H100 80GB 80 GB 30K 61K 122K
H200 141GB 141 GB 54K 107K 215K

注:需预留空间给模型权重和激活值

1.4.3 长序列优化技术及其局限

1. Group Query Attention (GQA)

原理: 多个查询头共享同一组KV
实现: num_kv_heads < num_q_heads

Qwen-72B实例:
- 原始: 64个独立KV头
- GQA: 8个KV头,每个服务8个Q头
- 压缩比: 8×
- KV-Cache: 336 MB/K → 42 MB/K (序列1K)

局限性:
- 仍是O(n)增长
- 可能影响注意力表达能力
- 需要特殊训练

2. Multi-Query Attention (MQA)

更激进的共享: 所有头共享单个KV
压缩比: num_heads× (如64×)

性能影响:
- KV-Cache: 2.62 GB → 41 MB (序列1K)
- 但精度下降明显: ~2-3% perplexity增加

3. Sliding Window Attention

原理: 只关注最近W个token
实现方式:
- 硬窗口: attention_mask[i,j] = (i-j < W)
- 软窗口: 指数衰减权重

内存节省:
- KV-Cache上限: W × 2.62 MB
- 与序列长度解耦

问题:
- 丢失长程依赖
- 不适合需要全局理解的任务

4. KV-Cache压缩技术

4.1 量化压缩: | 方法 | 压缩比 | 内存节省 | 精度损失 | 实现复杂度 | |——|——–|———|———|———–| | FP16→INT8 | 2× | 50% | <0.1% | 低 | | FP16→INT4 | 4× | 75% | 0.5-1% | 中 | | FP16→INT2 | 8× | 87.5% | 2-5% | 高 | | 混合精度 | 2-3× | 50-67% | <0.5% | 中 |

4.2 稀疏化方法

Token重要性评分:
- 基于注意力分数
- 基于梯度信息
- 基于激活值大小

保留策略:
- Top-K: 保留分数最高的K个token
- 阈值: 保留分数>θ的token
- 分层: 不同层保留不同比例

示例(保留25%):
原始: 128K tokens × 2.62 MB = 336 GB
稀疏: 32K tokens × 2.62 MB = 84 GB
节省: 75%

5. 架构创新

5.1 FlashAttention优化

原理: 分块计算,减少内存占用
- 不存储完整注意力矩阵
- 在线计算softmax

内存复杂度: O(n²) → O(n)
但KV-Cache仍需O(n)存储

5.2 流式KV-Cache

分层存储:
- Hot: 最近1K tokens在HBM
- Warm: 1K-16K在DRAM  
- Cold: >16K在SSD

访问延迟:
- HBM: 100 ns
- DRAM: 100 μs
- SSD: 100 ms

需要预测访问模式

1.4.4 PIM视角下的KV-Cache管理

传统架构的根本问题

  1. KV-Cache必须频繁搬移
  2. 每个token都要访问全部历史
  3. 带宽需求随序列长度平方增长

PIM的优势

1. 就地更新:
   - KV写入后不再搬移
   - 直接在存储位置计算注意力

2. 并行访问:
   - 多个存储体同时计算
   - 带宽随存储体数量扩展

3. 近数据计算:
   - 注意力分数在存储体内计算
   - 只返回最终结果

潜在改进:
- 带宽需求: O(n²) → O(n)
- 能耗降低: 10-100×
- 延迟改善: 5-10×

1.5 传统解决方案及局限

1.5.1 高带宽内存(HBM)

HBM技术演进

代次 带宽/stack 容量/stack 功耗/stack I/O宽度 成本/GB
HBM1 128 GB/s 4 GB 15W 1024-bit $150
HBM2 256 GB/s 8 GB 15W 1024-bit $180
HBM2E 460 GB/s 16 GB 18W 1024-bit $200
HBM3 819 GB/s 24 GB 20W 1024-bit $250
HBM3E 1.2 TB/s 36 GB 25W 1024-bit $300

HBM3详细架构

物理结构:
- 8-12层DRAM die堆叠
- 通过TSV(硅通孔)连接
- 底层逻辑die处理I/O

接口特性:
- 1024位宽接口
- 16个独立通道
- 每通道64位宽
- 伪通道模式可达32通道

应用于Qwen-72B的详细分析

配置1: 4×HBM3 (96GB容量)
- 总带宽: 3.28 TB/s
- 总功耗: 80W
- 成本: $24,000
- 理论性能: 3.28 TB/s / 39.7 GB = 82.6 tokens/s
- 带宽利用率: 65% (实际~54 tokens/s)

配置2: 8×HBM3E (288GB容量,支持多批次)
- 总带宽: 9.6 TB/s  
- 总功耗: 200W
- 成本: $86,400
- 批次容量: 可支持batch=64
- 吞吐量: ~2000 tokens/s
- 每token成本: $0.043

HBM的根本限制

  1. 物理限制: TSV密度和散热
  2. 良率问题: 多die堆叠降低良率
  3. 集成复杂: 需要2.5D/3D封装
  4. 扩展性差: 难以超过8 stack

1.5.2 缓存层次优化

现代GPU缓存层次详解(以H100为例):

缓存层次:
L0 (寄存器): 256 KB/SM × 132 SM = 33.8 MB
- 延迟: 1 cycle
- 带宽: 19.5 TB/s/SM

L1缓存: 256 KB/SM × 132 SM = 33.8 MB  
- 延迟: ~30 cycles
- 带宽: 8 TB/s
- 组相联度: 128-way

L2缓存: 50 MB (统一)
- 延迟: ~200 cycles
- 带宽: 6 TB/s
- 组相联度: 16-way

缓存优化技术深入

1. Kernel融合优化

未融合:
MatMul → 写回HBM → LayerNorm → 写回HBM → ReLU
HBM访问: 3次

融合后:
MatMul → L1/寄存器 → LayerNorm → L1/寄存器 → ReLU → HBM
HBM访问: 1次
节省: 67%带宽

2. Flash Attention详解

标准注意力:
- 存储NxN注意力矩阵
- 内存需求: O(N²)
- 带宽需求: O(N²)

Flash Attention:
- 分块大小: B (如256)
- 内存需求: O(N)
- 计算分块: 
  for i in range(0, N, B):
    for j in range(0, N, B):
      compute_block(Q[i:i+B], K[j:j+B], V[j:j+B])
      
性能提升: 2-4×
内存节省: N/B×

3. 持久化Kernel

传统: Kernel间通过全局内存通信
持久化: Kernel驻留,通过共享内存通信

示例(Transformer层):
thread_block_persistent_transformer():
  while (has_work):
    // 注意力
    compute_attention()
    __syncthreads()
    
    // FFN  
    compute_ffn()
    __syncthreads()
    
减少启动开销: 90%
减少同步开销: 80%

缓存优化的根本局限

  1. 容量墙: 72B模型 » 50MB L2缓存
  2. 重用距离: 权重只用一次,无重用
  3. Amdahl定律: 内存访问占90%+,优化计算效果有限

1.5.3 模型压缩技术

1. 结构化剪枝深入分析

剪枝粒度对比:
细粒度(权重级): 
- 压缩率: 90%+
- 硬件加速: 困难
- 实际加速: <2×

结构化(通道/层级):
- 压缩率: 30-50%
- 硬件加速: 容易
- 实际加速: 1.5-2×

Qwen-72B剪枝实验:
- 30%通道剪枝: PPL 3.2→3.4 (+6.25%)
- 50%通道剪枝: PPL 3.2→3.8 (+18.75%)
- 70%通道剪枝: PPL 3.2→5.1 (+59.4%)

2. 知识蒸馏技术栈

蒸馏类型:
1. Response蒸馏: 匹配最终输出
2. Feature蒸馏: 匹配中间层
3. Attention蒸馏: 匹配注意力图
4. Relation蒸馏: 匹配样本间关系

Qwen系列蒸馏链:
Qwen-72B → Qwen-14B → Qwen-7B → Qwen-1.8B

性能保留率:
- 72B→14B: 92% (5.1×压缩)
- 14B→7B: 88% (2×压缩)  
- 7B→1.8B: 75% (3.9×压缩)
- 端到端: 60.7% (40×压缩)

3. 动态稀疏计算

稀疏模式:
1. 静态稀疏: 预定义模式
2. 动态稀疏: 运行时决定
3. 学习稀疏: 可训练门控

激活稀疏性分析(Qwen-72B):
- 平均稀疏度: 85%
- FFN稀疏度: 92%
- 注意力稀疏度: 78%

硬件支持现状:
- A100: 2:4结构稀疏(50%)
- H100: 细粒度稀疏(理论)
- 实际加速: 1.2-1.5×

1.5.4 为什么需要新架构?

计算与内存的剪刀差

历史趋势(每10年):
- 计算性能: 1000×提升
- 内存带宽: 10×提升
- 内存容量: 100×提升
- 能效: 10×提升

2024年现状:
- H100计算: 60 TFLOPs
- H100带宽: 3.35 TB/s
- 比率: 17.9 ops/byte
- Qwen-72B需求: 3.46 ops/byte
- 利用率: 19.3%

物理极限分析

1. 互连限制:
- PCB走线: ~25 GB/s/pin
- 封装引脚: ~5000 pins实际极限
- 理论带宽上限: ~125 TB/s
- 但功耗将达: ~2000W

2. 功耗密度:
- 当前: ~500W/cm²
- 散热极限: ~1000W/cm²
- 提升空间: <2×

3. 光互连潜力:
- 带宽密度: 1 Tb/s/mm²
- 能效: 1 pJ/bit
- 但成本: 100×电互连

架构创新的必然性

方案 优势 局限 长期潜力
更多HBM 带宽线性增长 成本/功耗爆炸
更大缓存 减少部分访问 无法容纳模型
压缩技术 降低带宽需求 精度损失
新互连 突破带宽瓶颈 技术不成熟
PIM架构 根本性解决 需要生态系统 极高

PIM的根本性优势

1. 带宽扩展:
传统: 带宽 = 引脚数 × 频率
PIM: 带宽 = 存储体数 × 内部带宽
扩展性: 1000×潜力

2. 能效革命:
数据搬移能耗: 降低100-1000×
计算/搬移比: 从1:1000到1000:1

3. 延迟优化:
访存延迟: μs → ns
计算延迟: 不变
总延迟: 降低10×

4. 成本效益:
无需HBM: -$20,000/系统
标准DRAM+PIM: +$2,000/系统
TCO: 降低70%

本章小结

通过详细的定量分析,我们看到:

  1. 内存带宽是绝对瓶颈:Qwen-72B在H100上计算利用率不足8%
  2. 能耗严重失衡:99.93%的能耗用于数据搬移
  3. 问题随规模恶化:更大的模型和更长的序列加剧瓶颈
  4. 传统方案已达极限:需要架构级创新

下一章,我们将介绍PIM/NMC技术如何从根本上解决这些问题,开启高效推理的新纪元。

延伸思考

  1. 如果内存带宽提升10倍,Transformer推理的瓶颈会转移到哪里?
  2. 为什么批处理在训练中有效,但在推理中受限?
  3. 除了Transformer,还有哪些工作负载会受益于PIM技术?