1. KTransformer2中的Dynamic Cache机制解析
在Transformer架构中,缓存机制是提升推理效率的关键组件。KTransformer2采用了两种缓存策略:Dynamic Cache(动态缓存)和Static Cache(静态缓存),它们都继承自同一个Cache基类。这两种缓存虽然共享相同的接口,但在实现细节和适用场景上存在显著差异。
1.1 缓存的基本结构与继承关系
Dynamic Cache和Static Cache都遵循相同的形状规范:
- Batch维度:对应输入的批量大小
- Heads维度:注意力头的数量
- Sequence维度:缓存序列长度
- Features维度:每个注意力头的特征维度
这种四维张量结构([batch_size, num_heads, seq_len, head_dim])与Transformer的注意力机制完美匹配。缓存中存储的不是最终的输出结果,而是注意力计算过程中的中间产物——Key向量和Value向量。这种设计使得模型在生成下一个token时,可以复用之前计算好的K、V值,避免重复计算。
关键理解:缓存存储的是注意力机制中的Key和Value矩阵,而非最终的注意力输出。这使得模型可以增量式地生成内容,而不需要每次都从头计算。
1.2 动态与静态缓存的更新机制对比
1.2.1 Dynamic Cache的更新方式
Dynamic Cache采用拼接(concatenation)的方式进行更新,每次调用update()时,新的K、V状态会通过torch.cat()操作与现有缓存拼接:
python复制# Dynamic Cache更新伪代码
def update(self, key_states, value_states, layer_idx):
if layer_idx not in self.cache:
self.cache[layer_idx] = (key_states, value_states)
else:
# 沿序列维度拼接
old_k, old_v = self.cache[layer_idx]
new_k = torch.cat([old_k
