已实现

v00_full_recompute

本版本引入什么

这是最小但可用的基线:一个 Qwen2.5 风格的纯解码器模型,一次处理一个请求,并在每个生成步骤重新计算完整序列。

它包含后续版本持续复用的核心组件:词元嵌入、RoPE、RMSNorm、分组查询注意力、SwiGLU、Transformer Block、权重加载和贪心生成。

为什么引入

清晰的基线让后续每项优化都有具体对象。没有这个版本,KV 缓存、批处理、槽位、分页存储和 CUDA Graph 就会像彼此孤立的技巧,而不是对真实瓶颈的回应。

核心原则

自回归生成每次追加一个词元,然后在提示词和当前全部生成词元上运行模型。因果注意力阻止位置看到未来,但实现仍会在每一步重新计算旧词元的 K 和 V。

这种实现简单直接,但代价会随序列长度快速增长。

建议对比的文件

  • llm.py:单请求生成循环。
  • layer/gqa.py:第一份完整 GQA 实现。
  • model/qwen2_5.py:后续版本保留的模型骨架。

保留的权衡

本版本优先保证清晰,而不是效率。它有意不适合高效服务,因此自然引出下一个问题:怎样避免重复计算历史注意力状态?