高端GPU的Pipeline Parallel和KV Cache是什么
这是一个非常关键、但经常被一句话带过的工程问题。我逐条给你做概念 → 机制 → 为什么在消费级卡上“⚠️”的解释。理解完这三点,你就会明白为什么前面我一直不推荐消费卡做高并发生产。
一、Tensor Parallel(张量并行)是什么?
1️⃣ 它解决什么问题?
单张卡放不下模型 / 算不动模型。
以 Linear 层为例:
Y = X · W
Tensor Parallel 的做法是:
- 把 W 按列或行切分
- 每张 GPU 只算一部分
- 然后 把结果合并
GPU0: W0 → Y0
GPU1: W1 → Y1
↓
All-Reduce / All-Gather
↓
Y
2️⃣ 为什么通信这么频繁?
- Transformer 每一层都有多个 Linear
- 每一层都要合并结果
- 一个 token 的 forward 就会发生 几十次通信
3️⃣ 为什么在消费级卡上“⚠️(可用但效率低)”?
- 无 NVLink
- 只能 PCIe / TCP
- 通信时间 > 计算时间
结果:
- TP=2 勉强
- TP≥4 性能急剧下降
- 延迟抖动大
所以:能跑,但不“扩”
二、Pipeline Parallel(流水线并行)是什么?
1️⃣ 它解决什么问题?
模型太大,一张卡放不下,但又不想频繁通信。
做法:
- 把模型层切成几段
- 每段放在一张 GPU
- 像流水线一样传激活值
GPU0 (Layers 1–8)
↓
GPU1 (Layers 9–16)
↓
GPU2 (Layers 17–24)
2️⃣ Pipeline 的关键成本是什么?
- 激活值跨卡传输
- bubble(空转)
- stage 之间强依赖
3️⃣ 为什么消费级卡也是“⚠️”?
- 激活 tensor 很大
- PCIe / 网络传输慢
- P99 latency 非常容易拉长
在高 QPS 下,流水线 stall 会被无限放大。
三、KV Cache 分布是什么?
kv cache是block级别内的缓存
https://www.cnblogs.com/aibi1/p/19439847
1️⃣ KV Cache 是什么?
在 Transformer 推理中:
- Key / Value 会缓存
- 用于后续 token 的 attention
- 是推理中最大的内存消耗
2️⃣ KV Cache 分布是什么意思?
把 KV cache 分散存到多张 GPU:
GPU0: tokens 0–2048
GPU1: tokens 2049–4096
GPU2: tokens 4097–8192
这样可以:
- 支持更长上下文
- 提高并发
3️⃣ 为什么在消费级卡上是“⚠️”?
- Attention 每一步都要访问 KV
- 跨卡访问 = 高延迟
- 没 NVLink → 性能灾难
KV cache 是最怕慢通信的组件
四、三者的共同点(为什么一起标 ⚠️)
| 并行方式 | 通信频率 | 通信量 | 对 NVLink 依赖 |
|---|---|---|---|
| Tensor Parallel | 极高 | 中 | 极高 |
| Pipeline Parallel | 中 | 高 | 高 |
| KV cache 分布 | 极高 | 极高 | 极高 |
没有 NVLink,这三件事就会互相放大问题。
五、为什么数据中心卡可以?
- NVLink 带宽 ×10
- 延迟低
- P2P 直连
- NCCL 优化成熟
所以:
这些并行方式在数据中心卡上是“默认可用”,在消费卡上是“工程风险项”。
六、给你一个“是否应该用它们”的判断表
| 你的场景 | 是否用 |
|---|---|
| 单卡 | 不用 |
| 多副本 | 不用 |
| 13B + 高 QPS | 必须 |
| 长上下文 | 必须 |
| 消费卡 | 尽量不用 |
七、一句话总结(非常重要)
Tensor Parallel / Pipeline Parallel / KV Cache 分布,本质都是“用通信换显存和算力”。
消费级卡通信弱,所以只能谨慎用;数据中心卡通信强,所以可以大胆用。
如果你愿意,我可以下一步用 时序图 给你画出「一个 token 在 TP + KV cache 下的通信路径」,看完你会彻底“有感觉”。
要不要?
KV Cache跟transformer 的KV矩阵关系
这个问题非常关键,需要精确区分概念:vLLM 推理加速中的 KV Cache 和 Transformer 架构里的 K/V/Q 矩阵虽然相关,但不是完全相同的东西。下面我给你完整拆解。
一、Transformer 的 KVQ 矩阵是什么
在标准 Transformer 的 self-attention 中:
- 输入向量 (X) 通过 线性层生成:
[
Q = X W_Q,\quad K = X W_K,\quad V = X W_V
]
- (W_Q, W_K, W_V) 是权重矩阵
- 维度:通常 (Q, K, V \in \mathbb{R}^{seq_len \times d})
- 每一层每一个 token 都会生成新的 Q/K/V
- 注意力计算:
[
Attention(Q, K, V) = Softmax\left(\frac{Q K^T}{\sqrt{d}}\right) V
]
所以:
- KVQ 矩阵是 每一层每一步计算注意力的基础张量
- 每次 forward 都要生成 Q/K/V
二、推理加速中的 KV Cache 是什么
在推理阶段(尤其是 autoregressive / GPT 推理):
- 每次生成新 token 时,前面生成的 token 的 K/V 不会变化
- 为了避免重复计算,vLLM 会 把之前的 K/V 缓存下来:
- 每层每个 attention head 都有一个缓存 KV
- 新 token 只生成 Q,然后用 Q × Cached K 计算 attention
- 优点:
- 避免重复计算 (K = X W_K, V = X W_V)
- 降低 GPU 计算 / 显存带宽消耗
- 关键优化:可以做 长上下文 + batch 合并
这就是 vLLM 推理加速里的 KV Cache
三、KV Cache 与 Transformer 的 KVQ 的关系
| Transformer KV/Q | vLLM KV Cache | |
|---|---|---|
| 来源 | 每层 Linear 层生成 | Transformer 的 K/V 矩阵缓存下来 |
| 维度 | seq_len × d | seq_len × d (累积缓存) |
| 是否可变 | 每步生成 | 对历史 token 不变,只更新新 token |
| 作用 | 注意力计算 | 避免重复计算 / 加速推理 |
| Q | 每步实时生成 | 每步用 Q × Cached K |
一句话理解:
KV Cache 是 Transformer KV 矩阵的历史累积缓存,它本身不是新的矩阵,而是原矩阵的“存储复用”。
四、工程角度的优化意义
- 显存分布:
- KV Cache 可以按层、按头、按卡分布存储
- 支持长上下文(8k、16k token)
- 批量推理优化:
- 多请求共享 KV Cache(vLLM batching)
- 减少重复矩阵乘法 → 提升 QPS
- 与 TP/Pipeline 的关联:
- Tensor Parallel / Pipeline Parallel 要把 KV Cache 分布在 GPU
- 没有 NVLink / PCIe 慢 → KV Cache 访问成为瓶颈
五、总结一句话
KV Cache = Transformer KV 矩阵的历史累积存储,用于推理加速;Q 矩阵每步仍需实时生成。
换句话说,它是 KV 的“记忆”,不是新的计算矩阵。
为什么KV矩阵可以缓存,不用重复计算
这是一个非常核心的概念,也是理解 KV Cache 推理优化 的基础。我们来仔细拆解。
一、Transformer attention 中 Q/K/V 的生成逻辑
假设我们有一个 Transformer 层:
- 输入序列 (X = [x_1, x_2, ..., x_t])
- 每个 token 都会生成:
[
Q_t = x_t W_Q,\quad K_t = x_t W_K,\quad V_t = x_t W_V
]
- 注意力计算公式:
[
Attention(Q_t, K_{1:t}, V_{1:t}) = \text{Softmax}\left(\frac{Q_t K_{1:t}^T}{\sqrt{d}}\right) V_{1:t}
]
注意:每次生成新 token 时,需要用 新 token 的 Q 和 历史 token 的 K/V 做 attention。
二、为什么历史 token 的 K/V 不会变化
1️⃣ 权重矩阵 W_K / W_V 是固定的
- Transformer 推理阶段 模型权重不再更新
- 所以对历史 token 生成的 K/V:
[
K_i = x_i W_K, \quad V_i = x_i W_V \quad (i < t)
]
是固定的,不会随新 token 改变。
2️⃣ 生成新 token 只依赖新 token 的输入
- 新 token (x_t) 会生成新的 Q/K/V
- 但旧 token (x_1..x_{t-1}) 已经生成了 K/V
- 它们不再变化 → 可以缓存
3️⃣ 前面生成的 token K/V 的作用
- 历史 K/V 参与 当前 token 的注意力计算
- 但不会被修改
- KV Cache 就是把这些历史 K/V 保留下来,避免重复计算:
Time step t-1:
Token 1 → K1,V1
Token 2 → K2,V2
...
Cache: [K1,K2,...K_{t-1}], [V1,V2,...V_{t-1}]
Time step t:
Token t → Q_t, K_t, V_t
Attention(Q_t, Cache_K, Cache_V)
核心思想:前面的 token 是历史信息,不变,只需要存储,不需要重新计算
三、为什么只有 Q 每步都要生成
- 新 token 的注意力查询来自 当前 token
- 所以 Q 必须实时生成
- K/V 对历史 token 是已知的,不变 → 可以复用
四、KV Cache 的优势
-
避免重复线性变换:
- 不再计算 (K_i W_K, V_i W_V)(i < t)
-
节省计算和显存带宽
-
支持长上下文推理(8k、16k token)
五、一句话总结
KV Cache 的本质就是“记住历史 token 的 K/V”,因为这些 K/V 在推理阶段不会变化,而 Q 是新 token 的查询,每步都必须生成”。
如果你愿意,我可以画一张序列时序图,直观展示每步 token Q/K/V 的生成和 KV Cache 的存储逻辑,让你一眼看懂为什么“历史 K/V 不变,新 token 只生成 Q/K/V”。
你希望我画吗?

浙公网安备 33010602011771号