QuanZhou's Wiki

M2-B Assignment:Multi-Head Causal Attention

状态:Archived · 历史任务书。本页公开 M2-B 当时的题目、范围和验收方法,不包含本站维护者的实现、测试答案或填写记录。当前任务从阶段 2 路线页进入。

页面中的评分命令、初始分数和文件布局对应 M2-B 的固定历史版本 00a531c。当前下载包只提供 M2-C 评分入口;开始当前练习请阅读 M2-C 任务书。

M2-B 用最小 NumPy 实现建立 Attention Oracle:先把投影结果拆成多个 Head,再完成 Q/K/V 投影,最后实现不带 KV Cache 的 Multi-Head Causal Attention。完成它之后,Cached MHA、GQA 和真实 Serving 实验才有可信的数值基线。

Phase 1 Checkoff
  → P0 NumPy 语义
  → M0 Single-Head KV Cache
  → M1 Batch Size Curve
  → M2-A1 Head 轴
  → M2-A2 Q/K/V 投影
  → M2-B 无 Cache MHA(Completed)
  → M2-C Cached MHA  ← 当前
  → M2-D GQA
  → M2-E KV 容量
  → S0 真实 vLLM 环境

先分清几份材料

这些文件不是几份并列的手册,它们位于同一条执行链上:

你要回答的问题应该打开的材料职责
当前位于哪一层?阶段 2 路线页依赖、状态、交付、Checkoff 与下一层
现在具体做什么?本 README当前任务、允许修改的范围、命令与评分
怎样审计阶段边界?阶段 2 路线页依赖、状态、交付与停止条件
空白工作表在哪里?checkoffs/m2-b-causal-attention.md公开模板,不保存本站维护者的答案
我的答案和证据记在哪里?私人作答仓库中的同名文件实现、失败记录、Checkoff 与结果
机制与结果怎样解释?阶段 2 路线页中的文章区系统文章解释机制,实验文章总结已完成证据

正常路径是:路线页定位 → Assignment 执行 → M2-B 工作表记录 → 实现与测试 → results 验收。只有需要审计详细实验协议或停止条件时,才打开总计划。

本页归档的练习是 M2-B。它当时以 M2-A1 与 M2-A2 为可运行起点,并故意在 M2-B 保留 TODO;当前公开 Starter 已进入 M2-C。

历史任务:M2-B · 无 Cache MHA Oracle

只编辑 src/inference_lab/multi_head_attention.py 和自己的测试记录。让每个 Batch、每个 Head 独立完成 Scaled Dot-Product Causal Attention;不要提前加入 KV Cache、GQA、Head 合并或 Output Projection。

获取历史 Starter

需要复查当时的起点和评分时,在单独目录检出固定版本:

$ git clone --no-checkout https://github.com/Qizi706/qizi706.github.io.git p2-m2-b-archive
$ cd p2-m2-b-archive
$ git checkout --detach 00a531c5b9b1429dd759acd934065a7a8d36be5a
$ cd labs/p2-inference-systems
$ make setup
$ make grade

该历史版本的初始评分应该呈现这个状态:

$ make grade
== m2-a1: PASS (20/20) ==
== m2-a2: PASS (20/20) ==
== m2-b: FAIL (0/60) ==

Score: 40/100
Still working: m2-b

在该历史版本中,只运行 M2-B 可以使用任一命令:

$ make m2-b
$ ./grade-lab m2-b
$ make GRADEFLAGS=m2-b grade

make test 只运行已经完成的回归测试,因此在 M2-B 尚未实现时仍应通过。make grade 代表整份作业的当前完成度,会在 TODO 处失败。

历史评分方式

Exercise内容分值定向命令
M2-A1split_heads Shape、坐标映射与内存共享20make m2-a1
M2-A2Q/K/V 投影、GQA Shape 契约与非法输入20make m2-a2
M2-BScore、Causal Mask、Softmax、Oracle 与隔离性60make m2-b

M2-B 的公开评分测试保存在固定历史版本的 grader_tests/test_m2_b_causal_attention.py,当前 M2-C 下载包不包含该文件。先根据任务说明写自己的最小测试;卡住时再逐级查看工作表、错误输出和公开评分测试,不要直接从测试倒推并粘贴实现。

已完成的起点

M2-A1:拆分 Head

split_heads(projected, num_heads) 已把 [B,T,H×D_head] 转换为 [B,H,T,D_head],并通过 Shape、坐标映射与内存共享测试:

$ make m2-a1
Ran 3 tests
OK
== m2-a1: PASS (20/20) ==

M2-A2:投影 Q/K/V

project_qkv(...) 已接受 X=[B,T,D_model] 和三个二维权重,返回带显式 Head 轴的 Q/K/V,并在矩阵乘法或 reshape 前检查非法配置:

$ make m2-a2
Ran 3 tests
OK
== m2-a2: PASS (20/20) ==

这里保留 A1/A2 只是为了提供 M2-B 的可信起点;它们的个人预测、失败与验收历史只保存在私人作答仓库。

M2-B:实现无 Cache MHA(历史题目)

编辑函数:

def multi_head_causal_attention(
    q: np.ndarray,
    k: np.ndarray,
    v: np.ndarray,
) -> tuple[np.ndarray, np.ndarray]:
    """Return per-head output and attention weights without a KV cache."""

输入 Q/K/V 都是 [B,H,T,D_head]。返回值顺序固定为 output, weights:

weights  [B,H,T,T]
output   [B,H,T,D_head]

你的实现必须满足:

建议步骤

先关闭实现文件。下载者可在自己的副本中填写 checkoffs/m2-b-causal-attention.md;本站维护者必须填写私人作答仓库中的同名文件,不能修改公开模板。然后在私人仓库的 tests/test_multi_head_attention.py 中写一个不调用生产函数的标量 Oracle,保存第一次失败,再完成 TODO。

如果需要提示,请按这个顺序展开:

完成后应该看到:

$ make m2-b
Ran 5 tests
OK
== m2-b: PASS (60/60) ==

Score: 60/60
All selected exercises passed.

完成检查

M2-B 定向评分通过后,运行整份作业和历史回归:

$ make grade
$ make test
$ git diff --check

最终评分必须是 Score: 100/100。然后回到私人作答仓库的 M2-B 工作表填写第一次失败、修正规则与闭卷解释;只有验收清单全部完成,才进入 M2-C Cached MHA。网站上的同名页面始终保持为空白模板。

历史文件布局

p2-inference-systems/
├── README.md                 # 下载、启动和公开/私有边界
├── lab.json                 # 发布白名单与证据门禁
├── Makefile                 # setup、回归与单项评分入口
├── grade-lab       # 公开评分脚本
├── assignments/
│   └── m2-b-causal-attention.md       # 历史任务书
├── checkoffs/
│   └── m2-b-causal-attention.md       # 历史空白模板
├── grader_tests/
│   └── test_m2_b_causal_attention.py          # M2-B 公开验收测试
├── src/inference_lab/
│   └── multi_head_attention.py        # M2-A1/A2 起点与 M2-B TODO
└── tests/
    └── test_multi_head_attention.py   # 前置能力回归

已完成任务的源码、工作表和原始证据由私人作答仓库管理,不进入本站发布包。