赛题名字和入口描述修改 #73
|
|
@ -1,8 +1,8 @@
|
|||
# Flashattention 迁移 Benchmark 实战:从性能基线到 XPU-OJ 评测
|
||||
# Agent推理算子库优化-FlashAttention KV Cache Decode Benchmark 实战:从性能基线到 XPU-OJ 评测
|
||||
|
||||
## 1. 教程定位
|
||||
|
||||
本教程是参赛训练课程的 **FlashAttention Benchmark 入门与评测提交衔接** 模块,主要帮助用户跑通 FlashAttention paged KV-cache 推理核函数 `flash_attn_with_kvcache` 的基准测试流程,理解 benchmark 脚本的输入输出、性能指标和评测含义,并基于 XPU-OJ 题包完成一个最小正确版 `run_kernel` 的实现与提交。
|
||||
本教程面向 **沐曦-揭榜挂帅-Agent推理算子库优化-FlashAttention任务**,是围绕题目 **Agent推理算子库优化-FlashAttention KV Cache Decode** 的 **FlashAttention Benchmark 入门与评测提交衔接** 模块,主要帮助用户跑通 FlashAttention paged KV-cache 推理核函数 `flash_attn_with_kvcache` 的基准测试流程,理解 benchmark 脚本的输入输出、性能指标和评测含义,并基于 XPU-OJ 题包完成一个最小正确版 `run_kernel` 的实现与提交。
|
||||
|
||||
需要特别说明:本教程中的 benchmark 脚本主要用于帮助参赛者理解目标算子的调用方式、输入输出结构和性能基线,benchmark 脚本不是最终提交物。最终评测以 XPU-OJ 题包为准,参赛者需要根据题包中的接口约定实现自己的 `run_kernel`,并在输出结果对齐 OJ 参考结果的前提下提升性能。
|
||||
|
||||
|
|
@ -30,7 +30,7 @@
|
|||
|
||||
本模块适合以下人员:
|
||||
|
||||
* 参与 AI 基础设施竞赛的参赛者
|
||||
* 参与 **沐曦-揭榜挂帅-Agent推理算子库优化-FlashAttention任务** 的参赛者
|
||||
* 对 GPU 算子性能优化感兴趣的开发者
|
||||
* 需要了解 FlashAttention KV-Cache 推理性能的研究人员
|
||||
|
||||
|
|
@ -200,7 +200,7 @@ ls
|
|||
**预期结果:**
|
||||
|
||||
```text
|
||||
benchmark结果实例 benchmark_kvcache.py
|
||||
benchmark_kvcache.py
|
||||
```
|
||||
|
||||
### Step 4:配置基准测试参数
|
||||
|
|
@ -371,7 +371,7 @@ Benchmark 脚本用于理解目标算子的调用方式、输入输出 shape 和
|
|||
跑完 benchmark、建立性能基线后,选手需要完成以下转换:
|
||||
|
||||
1. 从 benchmark 脚本中理解目标 API,本任务对应 `flash_attn.flash_attn_interface` 中的 `flash_attn_with_kvcache`,使用 paged KV cache 布局。
|
||||
2. 在 XPU-OJ 平台上查看 `FlashAttention KV Cache Decode` 题目的接口约定。
|
||||
2. 在 XPU-OJ 平台上查看 **Agent推理算子库优化-FlashAttention KV Cache Decode** 题目的接口约定。
|
||||
3. 对照题包中的输入 shape、数据范围和精度要求。
|
||||
4. 编写自己的 `run_kernel(...)`。
|
||||
5. 提交 OJ,先通过正确性。
|
||||
|
|
@ -379,17 +379,17 @@ Benchmark 脚本用于理解目标算子的调用方式、输入输出 shape 和
|
|||
|
||||
### Step 9:题目说明与提交入口
|
||||
|
||||
注意:每个子题的接口参数、数据范围和精度要求可能不同,正式要求以对应 XPU-OJ 题目界面为准。本节以 **FlashAttention KV Cache Decode** 为例,演示从 benchmark 到 XPU-OJ 提交的完整流程。
|
||||
本教程只覆盖 **Agent推理算子库优化-FlashAttention KV Cache Decode** 这一题。正式接口、数据范围和精度要求以 XPU-OJ 题目界面为准。本节演示从 benchmark 到 XPU-OJ 提交的完整流程。
|
||||
|
||||
* **算子说明**:实现 paged KV cache 下的 decode 注意力,每个 batch 只有 1 个 query token,KV cache 按 page 存储,长度由 `seqlen_k` 决定。
|
||||
* **对应 OJ 题目**:XPU-OJ 上 `FlashAttention KV Cache Decode` 题(题号 20005)。
|
||||
* **对应 OJ 题目**:XPU-OJ 上 **Agent推理算子库优化-FlashAttention KV Cache Decode** 题。
|
||||
|
||||
使用组委会统一发放的账号登录 XPU-OJ,并进入对应赛题页面。
|
||||
使用组委会统一发放的账号登录 XPU-OJ,并进入对应比赛页面和题目页面。
|
||||
|
||||
1. 打开 XPU-OJ 平台:https://xpuoj.com/
|
||||
2. 使用组委会统一发放的账号和初始密码登录。
|
||||
3. 登录后进入比赛 / 题目列表页面。
|
||||
4. 找到对应题目,例如 `20005 FlashAttention KV Cache Decode`。
|
||||
3. 登录后进入比赛 / 题目列表页面,找到比赛 **沐曦-揭榜挂帅-Agent推理算子库优化-FlashAttention任务**。
|
||||
4. 找到对应题目 **Agent推理算子库优化-FlashAttention KV Cache Decode**。
|
||||
5. 点击进入题目详情页,查看题目描述、接口约定、数据范围和提交入口。
|
||||
|
||||

|
||||
|
|
@ -468,7 +468,7 @@ PAGE_BLOCK_SIZE = 16
|
|||
CAUSAL = 0
|
||||
```
|
||||
|
||||
当前 `FlashAttention KV Cache Decode` 题的校验方式为:
|
||||
当前 **Agent推理算子库优化-FlashAttention KV Cache Decode** 题的校验方式为:
|
||||
|
||||
```python
|
||||
torch.allclose(output_t.float(), output_ref.float(), rtol=1e-2, atol=1e-2)
|
||||
|
|
@ -505,14 +505,14 @@ OJ 对每次提交大致会走以下流程:
|
|||
7. 正确性通过后,统计运行耗时或性能指标
|
||||
8. 根据题目评分规则换算该题得分
|
||||
9. 更新该题历史最好成绩
|
||||
10. 汇总各题最好成绩,得到排行榜总分
|
||||
10. 在榜单中展示本题得分和排名
|
||||
```
|
||||
|
||||
### Step 12:分析评测结果与评分机制
|
||||
|
||||
**目标:** 理解 OJ 评测结果的含义,分析性能表现。
|
||||
|
||||
在 XPU-OJ 平台上查看提交结果。提交详情会显示状态、总得分、时间、内存、编译信息以及各测试点结果。
|
||||
在 XPU-OJ 平台上查看提交结果。提交详情会显示状态、本题得分、时间、内存、编译信息以及各测试点结果。
|
||||
|
||||

|
||||
|
||||
|
|
@ -555,15 +555,22 @@ OJ 对每次提交大致会走以下流程:
|
|||
|
||||
OJ 平台对单测试点的评分遵循以下公式:
|
||||
|
||||
$$
|
||||
```math
|
||||
S(T_k) = \frac{100}{1 + \left(\frac{1}{0.5} - 1\right) \cdot \frac{T_k - T_h}{T_b - T_h}}
|
||||
$$
|
||||
```
|
||||
|
||||
其中:
|
||||
|
||||
* $T_k$:你的 kernel 平均执行时间
|
||||
* $T_b$:Baseline 参考实现平均执行时间,对应 50 分
|
||||
* $T_h$:硬件理论下限耗时,$T_h = \max\left(\frac{\text{FLOPs}}{\text{peak\_tflops}},\ \frac{\text{bytes}}{\text{peak\_bw}}\right)$,对应 100 分
|
||||
* $T_h$:硬件理论下限耗时,对应 100 分,计算方式为:
|
||||
|
||||
```math
|
||||
T_h = \max\left(
|
||||
\frac{\mathrm{FLOPs}}{\mathrm{peak\_tflops}},
|
||||
\frac{\mathrm{bytes}}{\mathrm{peak\_bw}}
|
||||
\right)
|
||||
```
|
||||
|
||||
**关键分数节点:**
|
||||
|
||||
|
|
@ -576,11 +583,11 @@ $$
|
|||
|
||||
当单测试点得分超过 150 分时,平台会按对数压缩规则显示:
|
||||
|
||||
$$
|
||||
S_{\text{display}} = 150 + 10 \cdot \log_{10}(S/150)
|
||||
$$
|
||||
```math
|
||||
S_{\mathrm{display}} = 150 + 10 \cdot \log_{10}\left(\frac{S}{150}\right)
|
||||
```
|
||||
|
||||
总得分为各测试点得分的算术平均,总耗时为各测试点 $T_k$ 的求和。
|
||||
本题得分为各测试点得分的算术平均,本题总耗时为各测试点 $T_k$ 的求和。
|
||||
|
||||
### Step 13:榜单查看与初步优化方向
|
||||
|
||||
|
|
@ -590,9 +597,9 @@ $$
|
|||
|
||||

|
||||
|
||||
* **总得分:** 各题目得分的总和,排名按总得分从高到低排序。
|
||||
* **个人排名:** 页面顶部会显示“我的排名”和“我的总分”,方便快速了解自己的位置。
|
||||
* **各题目得分:** 表格中每列对应一个题目的得分,帮助分析不同算子优化任务上的表现。
|
||||
* **本题得分:** 展示该题的历史最好成绩,排名按本题得分从高到低排序。
|
||||
* **个人排名:** 页面顶部会显示你的当前排名和当前得分,方便快速了解自己的位置。
|
||||
* **提交次数:** 分数下方括号中的数字表示该账号在本题下的提交次数。
|
||||
|
||||
初步优化方向包括:
|
||||
|
||||
|
|
@ -637,7 +644,7 @@ opencode
|
|||
|
||||
| 任务阶段 | 参考 Prompt 模板 | 核心目的 |
|
||||
| --- | --- | --- |
|
||||
| 题包解析 | 请阅读题号 20005 的题目界面和 FlashAttention 任务包材料,总结 CUDA Maca `run_kernel` 函数签名、Paged KV Cache 寻址公式、精度校验方式和测试数据范围。 | 提取接口契约,明确参数 shape 和边界条件 |
|
||||
| 题包解析 | 请阅读 **Agent推理算子库优化-FlashAttention KV Cache Decode** 的题目界面和 FlashAttention 任务包材料,总结 CUDA Maca `run_kernel` 函数签名、Paged KV Cache 寻址公式、精度校验方式和测试数据范围。 | 提取接口契约,明确参数 shape 和边界条件 |
|
||||
| 生成冒烟代码 | 请生成一个最小可运行的 CUDA Maca `run_kernel` 实现,要求严格匹配 `extern "C"` 签名,支持 Paged KV Cache 的 `block_table` 寻址,支持 head 映射,优先保证正确性。 | 快速验证接口和环境 |
|
||||
| OJ 报错调试 | 我的代码提交后 `Wrong Answer`。这是我的代码和 SPJ Report。请检查 Paged KV 地址映射、bf16 到 float32 的计算转换、尾部 page 有效 token 判断是否正确。 | 结构化排查功能错误 |
|
||||
| 性能瓶颈分析 | 这是测试点的 SPJ Report。请分析 `User kernel` 与 `Hardware bound` 的差距,判断更接近 compute-bound 还是 memory-bound,并给出具体的 mctlass 或访存优化建议。 | 将 OJ 反馈转化为优化行动 |
|
||||
|
|
@ -645,7 +652,7 @@ opencode
|
|||
**题包解析 Prompt:**
|
||||
|
||||
```text
|
||||
请阅读 XPU-OJ 上题号 20005 FlashAttention KV Cache Decode 的题目说明,以及 flashattn_task_package 中与 benchmark / 提交相关的材料。
|
||||
请阅读 XPU-OJ 上 **Agent推理算子库优化-FlashAttention KV Cache Decode** 的题目说明,以及 flashattn_task_package 中与 benchmark / 提交相关的材料。
|
||||
|
||||
请输出以下内容:
|
||||
1. CUDA Maca 版本 run_kernel 的完整函数签名;
|
||||
|
|
@ -686,7 +693,7 @@ opencode
|
|||
**Wrong Answer 调试 Prompt:**
|
||||
|
||||
```text
|
||||
我的 FlashAttention KV Cache Decode 代码提交后出现 Wrong Answer。
|
||||
我的 Agent推理算子库优化-FlashAttention KV Cache Decode 代码提交后出现 Wrong Answer。
|
||||
|
||||
这是我的代码:
|
||||
[粘贴代码]
|
||||
|
|
@ -708,7 +715,7 @@ opencode
|
|||
**性能瓶颈分析 Prompt:**
|
||||
|
||||
```text
|
||||
这是 FlashAttention KV Cache Decode 某个测试点的 SPJ Report:
|
||||
这是 Agent推理算子库优化-FlashAttention KV Cache Decode 某个测试点的 SPJ Report:
|
||||
[粘贴报告]
|
||||
|
||||
请分析:
|
||||
|
|
@ -770,11 +777,11 @@ opencode
|
|||
|
||||
### 10.4 结合 OJ Report 做定向优化
|
||||
|
||||
不要只看总分。单测试点的 `Config`、`User kernel`、`Hardware bound` 和 `Speedup vs base` 更适合指导下一轮优化方向。长序列、大 batch、小 batch 的瓶颈可能完全不同。
|
||||
不要只看本题最终得分。单测试点的 `Config`、`User kernel`、`Hardware bound` 和 `Speedup vs base` 更适合指导下一轮优化方向。长序列、大 batch、小 batch 的瓶颈可能完全不同。
|
||||
|
||||
### 10.5 扩展到其他赛题
|
||||
### 10.5 继续优化本题
|
||||
|
||||
完成 FlashAttention KV Cache Decode 后,可以继续尝试 XPU-OJ 上的其他算子优化题目,例如 FlashInfer MLA Paged Attention 或 FlashInfer Paged Prefill
|
||||
完成 Agent推理算子库优化-FlashAttention KV Cache Decode 的冒烟提交后,可以继续围绕不同 batch、KV 长度和 head dimension 配置做定向优化。
|
||||
|
||||
## 附录:完整代码参考
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue