← 所有项目

Contribution Tasks

Dao-AILab/flash-attention

FA4 的 Python 调度层、测试基础设施、调度器逻辑、API 文档与数值正确性验证,都与 GPU kernel 性能工程高度重叠;Mac 上的 FakeTensorMode 路径让你能在无 GPU 条件下切入核心代码。

当前方向:活跃开发集中在 FA4(flash_attn/cute/):SM100/SM120 新特性(hd256、MLA、FP8、varlen decode、ping-pong)快速迭代,但测试覆盖、文档、调度器单元测试、Python 层 dispatch 开销与错误提示等「支撑性基础设施」明显落后于内核演进速度。

★ 25088Fork 31345 个候选任务Gemini:LongCat-2.0

更新于 2026-10-08T07:37:23+00:00 · 打开仓库 ↗

一、项目定位

FlashAttention 是 Dao-AILab 维护的精确注意力(exact attention)加速库,核心卖点是 IO-aware 的 tiling 实现:在 HBM 与 SRAM 之间按 tile 搬运与计算,把标准 Attention 的 HBM 读写压到理论下界,从而在不牺牲数值精度的前提下显著提速并省显存。仓库目前同时承载多代产品:FA2 在顶层 csrc/flash_attn(CUDA,Ampere/Ada/Hopper),FA3 在 hopper/(Hopper-only,FP16/BF16/FP8),而活跃开发已切到 FA4——用 CuTeDSL(NVIDIA CUTLASS DSL)写成、在运行时编译为 PTX/CUBIN,面向 Hopper (SM90) 与 Blackwell (SM100/SM110)。AGENTS.md 与 CLAUDE.md 明确写明「active development is on FA4 in flash_attn/cute/」,commit 热点也集中在 flash_attn/cute(近 43 次提交)、tests/cute(15 次)与 hopper/。FA4 以 flash-attn-4 包发布,最新 release 为 fa4-v4.0.0.beta33(2026-09-30),仍处于 beta 阶段。README 对 FA3 标注为「beta release for testing / benchmarking」,FA4 则仍在快速迭代(SM100 支持、MLA、FP8、varlen 等特性在最近提交中频繁出现)。整体定位:面向大模型训练/推理的底层 attention 原语层,被 PyTorch生态(HuggingFace、xFormers、SDXL/DiT 训练等)广泛依赖。

解决什么问题、给谁用

标准 scaled dot-product attention 在长序列下的瓶颈是 QK^T 与 softmax 中间矩阵必须完整写入 HBM,导致 (seq_len² · d) 的显存占用与带宽受限的读写。FlashAttention 通过 tiling + 在线 softmax(recompute P 而非保存完整注意力矩阵)把显存降到 O(N·d) 并减少 HBM 访问。FA4 进一步把实现迁移到 CuTeDSL,以便直接利用 Hopper 的 TMA、WGMMA、named barrier 等硬件原语,并在同一套 Python DSL 上同时覆盖 SM90 与 SM100/SM110。目标用户:(1) 大模型训练框架开发者(需要更快、更省显存的 attention 后端,例如 GPT、LLaMA、DiT 训练);(2) 推理/服务侧工程师(decode、varlen、paged-KV、MLA 等场景);(3) 硬件/编译器方向的研究者(CuTeDSL 内核模板、kernel 生成、性能调优)。典型场景:替换 torch.nn.functional.scaled_dot_product_attention 后端;为扩散模型视频生成提供长上下文注意力;在 H100/B200 上做 FP8/MLA decode;在 AMD MI300 上通过 CK 或 Triton 后端跑 FA2。

1) 大模型训练框架与研究人员——用 flash_attn_func / flash_attn_qkvpacked_func 替换原生 attention,降低显存、缩短 step time;2) 推理/服务工程师——使用 FA3/FA4 的 varlen、paged-KV、MLA、FP8 接口做低延迟 decode;3) 硬件性能工程师——在 flash_attn/cute/ 与 hopper/ 中研究 CuTeDSL 内核、TMA/WGMMA 利用、SM90/SM100 性能调优;4) AMD ROCm 用户——通过 csrc/flash_attn_ck 或 third_party/aiter Triton 后端在 MI200/MI300/RDNA 上获得 FA2 等价实现。

同类项目与差别

核心能力

能力在哪成熟度
FA2 CUDA 前向/反向(Ampere/Ada/Hopper)csrc/flash_attn/, flash_attn/flash_attn_interface.py成熟
FA2 ROCm Composable Kernel 后端csrc/flash_attn_ck/, flash_attn/flash_attn_interface.py成熟
FA2 ROCm Triton 后端(aiter)third_party/aiter, flash_attn/flash_attn_triton_amd.py成熟
FA3 Hopper FP16/BF16/FP8 前向与反向hopper/flash_attn_3/, hopper/flash_api.cpp实验
FA4 CuTeDSL 内核(SM90 / SM100 / SM110)flash_attn/cute/, flash_attn_interface.py实验
FA4 1CTA / 2CTA MLA(dense + sparse + paged)flash_attn/cute/, tests/cute/test_flash_attn_mla.py实验
varlen / paged-KV / rotary / ALiBi / dropoutflash_attn/flash_attn_interface.py, csrc/flash_attn/, hopper/成熟(FA2)/ 实验(FA4)
FP8 前向(FA3/FA4)hopper/, flash_attn/cute/实验
kernel 生成与实例化(SM80/SM90 mainloop 模板)hopper/instantiations/, hopper/generate_kernels.py, hopper/mainloop_fwd_sm90_tma_gmma_ws.hpp成熟(FA3)/ 实验(FA4)
训练集成(分布式、梯度检查点)training/成熟
性能基准与回归测试benchmarks/, tests/, tools/two_pass_tests.sh成熟

阶段:成熟(FA2)+ beta(FA3)+ 快速迭代 beta(FA4)。FA2 是业界事实标准;FA3 README 自标 beta;FA4 以 flash-attn-4 包发布,最新 tag 为 fa4-v4.0.0.beta33,commit 集中在 SM100/MLA/varlen 特性,仍属 beta。

技术栈:Python;C++;CUDA;CuTeDSL (nvidia-cutlass-dsl>=4.6.2);Composable Kernel (ROCm);Triton (via aiter);PyTorch (>=2.2);ninja;apache-tvm-ffi;quack-kernels>=0.5.3;CMake / setuptools (setup.py);GitHub Actions CI (.github/workflows);pre-commit

规模:仓库目录含 10 个顶层目录;csrc/ 197 项(含 composable_kernel、cutlass、flash_attn、flash_attn_ck、fused_dense_lib、layer_norm);hopper/ 507 项;flash_attn/ 110 项;tests/ 53 项;training/ 145 项;benchmarks/ 12 项。最近提交集中在 flash_attn/cute(43 次热点)、tests/cute(15 次)、csrc/flash_attn_ck(4 次)。FA4 release 已发到 fa4-v4.0.0.beta33(2026-09-30),保持约每周一次 beta 节奏(beta31→beta32→beta33 各隔一周)。star 数未提供,需验证。

二、架构与代码地图

仓库按「代际 × 硬件目标」自然分成五层。 1) 接入层(Python API):flash_attn/__init__.py、flash_attn/cute/__init__.py、flash_attn/cute/interface.py、hopper/flash_attn_interface.py、hopper/flash_attn_3/。职责是把 flash_attn_func / flash_attn_varlen_func 这些用户可见 API 翻译成内部 kernel 调用,处理 dtype、causal、softcap、varlen、paged KV、MLA 等开关。 2) 调度层(tile / split / batch 调度):flash_attn/cute/prepare_scheduler.py、flash_attn/cute/tile_scheduler.py、flash_attn/cute/seqlen_info.py、flash_attn/cute/block_info.py、flash_attn/cute/cu_blocks_kernel.py,以及 hopper/flash_prepare_scheduler.cu、hopper/heuristics.h。职责是把 (batch, heads, seqlen) 切成 CTA tile、决定 split-KV 数、生成 cu_seqlens / cu_blocks / SchedulerMetadataTensorsTorch,并为 SM100 的 CLC / dynamic-persistent 调度器喂状态。 3) 执行层(CuTeDSL kernel 主体):flash_attn/cute/flash_fwd*.py、flash_attn/cute/flash_bwd*.py、flash_attn/cute/flash_fwd_mla*.py、flash_attn/cute/flash_bwd_mla*.py、flash_attn/cute/sm100_hd256_2cta_fmha_backward_*.py。这是 FA4 的核心——用 CuTeDSL 在 Python 里写 TMA + WGMMA + named-barrier 的 forward/backward/MLA kernel。 4) 硬件抽象层(pipeline / barrier / copy / mma 描述):flash_attn/cute/pipeline.py、flash_attn/cute/named_barrier.py、flash_attn/cute/copy_utils.py、flash_attn/cute/mma_sm100_desc.py、flash_attn/cute/barrier.py、flash_attn/cute/ampere_helpers.py、flash_attn/cute/blackwell_helpers.py。封装 Hopper/Blackwell 的 async pipeline、TMA、bulk-copy、UMMA/TMEM 描述符,让 kernel 层只描述「怎么算」。 5) 工具层(build / test / bench / debug):setup.py、flash_attn/cute/cute_dsl_ptxas.py、flash_attn/cute/cute_dsl_utils.py、tests/cute/、benchmarks/、AI/*.md、tools/。负责编译到 PTX/CUBIN、持久化 kernel cache、two-pass 测试、SASS 级调试。 FA2(csrc/flash_attn/)与 FA3(hopper/)是上一代 C++/CUDA 实现,仍被 ROCm/CK 与老卡维护,但提交热点已切到 FA4 的 flash_attn/cute。

接入层调度层执行层硬件抽象层工具层flash_attn.cute.interface → flash_attn.cute.prepare_scheduler:请求请求flash_attn.cute.interface → flash_attn.cute.flash_fwd:TensorTensorflash_attn.cute.interface → flash_attn.cute.flash_bwd:TensorTensorflash_attn.cute.prepare_scheduler → flash_attn.cute.tile_scheduler:元数据元数据flash_attn.cute.tile_scheduler → flash_attn.cute.flash_fwd:调度调度flash_attn.cute.tile_scheduler → flash_attn.cute.flash_bwd:调度调度flash_attn.cute.flash_fwd → flash_attn.cute.hardware_pipeline:TMA/WGMMATMA/WGMMAflash_attn.cute.flash_bwd → flash_attn.cute.hardware_pipeline:TMA/WGMMATMA/WGMMAflash_attn.cute.flash_fwd_mla → flash_attn.cute.hardware_pipeline:TMA/WGMMATMA/WGMMAflash_attn.cute.flash_bwd_mla → flash_attn.cute.hardware_pipeline:TMA/WGMMATMA/WGMMAflash_attn.cute.fmha_sm100_hd256 → flash_attn.cute.hardware_pipeline:TMA/WGMMATMA/WGMMAflash_attn.cute.block_sparse → flash_attn.cute.flash_fwd_mla:稀疏索引稀疏索引flash_attn.cute.cute_dsl_build → flash_attn.cute.flash_fwd:PTX/CUBINPTX/CUBINflash_attn.cute.cute_dsl_build → flash_attn.cute.flash_bwd:PTX/CUBINPTX/CUBINflash_attn.cute.testing → flash_attn.cute.interface:测试测试flash_attn.cute.bench → flash_attn.cute.interface:benchbenchcsrc.flash_attn_ck → flash_attn.cute.interface:ROCm 后端ROCm 后端hopper.flash_attn_3 → flash_attn.cute.interface:FA3 后端FA3 后端flash_attn.cute.interfaceflash_attn.cute.interfaceflash_attn.cute.prepare_schedulerflash_attn.cute.…flash_attn.cute.testingflash_attn.cute.testingflash_attn.cute.tile_schedulerflash_attn.cute.…flash_attn.cute.flash_fwdflash_attn.cute.flash_fwdflash_attn.cute.flash_bwdflash_attn.cute.flash_bwdflash_attn.cute.flash_fwd_mlaflash_attn.cute.flash_fwd_mlaflash_attn.cute.flash_bwd_mlaflash_attn.cute.flash_bwd_mlaflash_attn.cute.fmha_sm100_hd256flash_attn.cute.…flash_attn.cute.block_sparseflash_attn.cute.block_sparseflash_attn.cute.hardware_pipelineflash_attn.cute.…flash_attn.cute.cute_dsl_buildflash_attn.cute.…flash_attn.cute.benchflash_attn.cute.benchcsrc.flash_attn_ckcsrc.flash_attn_ckhopper.flash_attn_3hopper.flash_attn_3csrc.flash_attncsrc.flash_attn
FA4 以 flash_attn.cute 为核心的代际分层架构,上层 API 经调度层切 tile 后派发到 CuTeDSL kernel,底层由硬件抽象层封装 TMA/WGMMA/pipeline。
模块 / 路径职责 · 入口 · 依赖
flash_attn.cute.interface
flash_attn/cute/interface.py
1 文件
FA4 的 Python 入口,把 flash_attn_func / flash_attn_varlen_func 派发到具体 kernel
入口:flash_attn_func, flash_attn_varlen_func
依赖:flash_attn.cute.flash_fwd, flash_attn.cute.flash_bwd, flash_attn.cute.tile_scheduler, flash_attn.cute.prepare_scheduler
AGENTS.md 与 README 都把它作为 from flash_attn.cute import flash_attn_func 的落点
flash_attn.cute.flash_fwd
flash_attn/cute/flash_fwd.py
1 文件 + 多架构变体
FA4 forward 主 kernel(SM90/SM100/SM120 多架构派发)
入口:flash_fwd_sm90, flash_fwd_sm100, flash_fwd_sm120(文件名即入口,具体类名需验证)
依赖:flash_attn.cute.pipeline, flash_attn.cute.copy_utils, flash_attn.cute.mma_sm100_desc, flash_attn.cute.mask, flash_attn.cute.softmax, flash_attn.cute.tile_scheduler
commit 热点集中在 SM100 hd256、ping-pong、MLA 等 forward 变体
flash_attn.cute.flash_bwd
flash_attn/cute/flash_bwd.py
1 文件 + 多架构变体
FA4 backward 主 kernel(dQ/dK/dV 计算)
入口:flash_bwd_sm90, flash_bwd_sm100, flash_bwd_sm120, flash_bwd_preprocess, flash_bwd_postprocess
依赖:flash_attn.cute.flash_fwd(共享 tiling 逻辑), flash_attn.cute.pipeline, flash_attn.cute.tile_scheduler
最近提交在 hd256 backward、deterministic、seqused_q/k 支持上频繁改动
flash_attn.cute.flash_fwd_mla
flash_attn/cute/flash_fwd_mla_sm100.py
3 文件
FA4 MLA(Multi-head Latent Attention)forward,服务 DeepSeek 类模型
入口:flash_fwd_mla_sm100, flash_fwd_mla_1cta_sm100, flash_fwd_mla_1cta_kb64_sm100
依赖:flash_attn.cute.seqlen_info, flash_attn.cute.block_info, flash_attn.cute.pack_gqa, flash_attn.cute.tile_scheduler
最近 commit 把 dense / sparse top-k / paged / 1CTA-2CTA 都合进 MLA dispatch
flash_attn.cute.flash_bwd_mla
flash_attn/cute/flash_bwd_mla_sm100.py
4 文件
FA4 MLA backward(dK/dV/dQ 拆分 kernel)
入口:flash_bwd_mla_sm100, flash_bwd_mla_dk_sm100, flash_bwd_mla_dq_dqv_sm100, flash_bwd_mla_dq_dqv_sm100_h64
依赖:flash_attn.cute.flash_bwd, flash_attn.cute.tile_scheduler
MLA backward 按 head 数拆分 1CTA/2CTA,是近期热点
flash_attn.cute.tile_scheduler
flash_attn/cute/tile_scheduler.py
1 文件
SM90/SM100/SM120 的 tile 调度器:static / dynamic-persistent / CLC
入口:SchedulerState, ClcSchedulerState, DynamicPersistentSchedulerState, SingleTileVarlenScheduler, Sm100FmhaClcDynamicTileScheduler, compute_sm100_fmha_varlen_grid
依赖:cutlass.pipeline, cutlass.utils.ClcDynamicPersistentTileScheduler, quack.cute_dsl_utils
封装了 CLC 硬件调度器与 dynamic-persistent 软件调度器,是 SM100 性能关键
flash_attn.cute.prepare_scheduler
flash_attn/cute/prepare_scheduler.py
1 文件
在 host 侧把 (batch, seqlen, heads) 转成 scheduler 元数据(cu_blocks、cu_seqlens、split 信息)
入口:FlashPrepareScheduler, SchedulerMetadataTensorsTorch
依赖:flash_attn.cute.seqlen_info, flash_attn.cute.block_info, flash_attn.cute.cu_blocks_kernel
对应 FA3 的 hopper/flash_prepare_scheduler.cu,是 FA4 的纯 CuTeDSL 重写
flash_attn.cute.hardware_pipeline
flash_attn/cute/pipeline.py
1 文件
封装 Hopper/Blackwell 的 async pipeline(TMA/UMMA/CpAsync/NamedBarrier)
入口:PipelineStateSimple, make_pipeline_state, PipelineTmaAsync, PipelineUmmaAsync, PipelineClcFetchAsync
依赖:cutlass.pipeline, cutlass._mlir.dialects.nvvm
把 CUTLASS pipeline 包装成 Python-DSL 友好的形式,是 kernel 层的主要依赖
flash_attn.cute.fmha_sm100_hd256
flash_attn/cute/sm100_hd256_2cta_fmha_backward_*.py
3 文件
SM100 headdim=256 的 2CTA fused MHA backward(DK/DV 与 DQ 拆 kernel)
入口:BlackwellFusedMultiHeadAttentionBackwardDKDVKernel, BlackwellFusedMultiHeadAttentionBackwardDQKernel
依赖:flash_attn.cute.tile_scheduler, flash_attn.cute.mask, flash_attn.cute.copy_utils, cutlass.utils.blackwell_helpers
最近提交热点:deterministic、stack 回收、length 推导
flash_attn.cute.block_sparse
flash_attn/cute/block_sparsity.py
3 文件
block-sparse attention 的稀疏度计算与 top-K gather
入口:compute_block_sparsity, topk_gather_kv(同目录 compute_block_sparsity.py、topk_gather_kv.py)
依赖:flash_attn.cute.block_info, flash_attn.cute.seqlen_info
配合 benchmarks/benchmark_sparse_mla_fwd.py 与 AI/SPARSE_MLA_*.md 使用
flash_attn.cute.cute_dsl_build
flash_attn/cute/cute_dsl_ptxas.py
2 文件(含 cute_dsl_utils.py)
把 CuTeDSL @jit 函数编译到 PTX/CUBIN,管理持久化 cache
入口:需验证(应为 compile / ptxas 封装)
依赖:nvidia-cutlass-dsl, apache-tvm-ffi, torch
AGENTS.md 提到的 FLASH_ATTENTION_CUTE_DSL_CACHE_ENABLED 与 two-pass 测试都依赖它
flash_attn.cute.testing
flash_attn/cute/testing.py
1 文件
FA4 测试基础设施:FakeTensor 模式、env 装饰器、kernel 变体遍历
入口:maybe_fake_tensor_mode, is_fake_mode
依赖:flash_attn.cute.cute_dsl_build, torch._subclasses.fake_tensor
tests/cute/*.py 都依赖它实现 two-pass 编译/执行分离
csrc.flash_attn_ck
csrc/flash_attn_ck/
约 10 文件
ROCm CK 后端:FA2 的 AMD 实现(mha_fwd/mha_bwd/varlen)
入口:mha_fwd, mha_bwd, mha_varlen_fwd, mha_varlen_bwd(flash_api.cpp)
依赖:composable_kernel, ATen, HIP
最近修复了 num_splits heuristic;README 明确这是 ROCm 默认后端
hopper.flash_attn_3
hopper/
507 文件
FA3(Hopper-only,C++/CUDA,FP16/BF16/FP8)
入口:flash_fwd_kernel_sm90, flash_bwd_kernel_sm90, flash_api.cpp, flash_api_stable.cpp
依赖:CUTLASS SM90 TMA/WGMMA, CUDA >= 12.3
README 标 beta;仍被维护但活跃开发已切到 FA4
csrc.flash_attn
csrc/flash_attn/
约 197 文件(含 src/)
FA2 原始 CUDA 实现(Ampere/Ada/Hopper)
入口:flash_fwd_kernel, flash_bwd_kernel, flash_api.cpp, generate_kernels.py
依赖:CUDA, CUTLASS 2.x
老一代,仍被 PyTorch 生态大量依赖,但提交极少
flash_attn.cute.bench
flash_attn/cute/benchmark.py
2 文件(benchmark.py、bench_utils.py)
FA4 端到端 benchmark 入口
入口:benchmark_flash_attention(目录级,具体函数需验证)
依赖:flash_attn.cute.interface, flash_attn.cute.bench_utils
与 benchmarks/bench_sm90.py、benchmark_sparse_mla_fwd.py 互补
目录树(按文件数)
  • hopper/ 507 个文件
    __init__.py, benchmark_attn.py, benchmark_flash_attention_fp8.py, benchmark_mla_decode.py, benchmark_split_kv.py, block.h, copy_sm90_bulk_reduce.hpp, cuda_check.h, epilogue_bwd.hpp, epilogue_fwd.hpp, flash.h, flash_api.cpp, flash_api_stable.cpp, flash_attn_3
  • csrc/ 197 个文件
    composable_kernel, cutlass, flash_attn, flash_attn_ck, fused_dense_lib, layer_norm
  • training/ 145 个文件
    Dockerfile, README.md, configs, run.py, src, tests
  • flash_attn/ 110 个文件
    __init__.py, bert_padding.py, cute, flash_attn_interface.py, flash_attn_triton.py, flash_attn_triton_og.py, flash_blocksparse_attention.py, flash_blocksparse_attn_interface.py, layers, losses, models, modules, ops, pyproject.toml
  • tests/ 53 个文件
    cute, layers, losses, models, modules, ops, pyproject.toml, test_flash_attn.py, test_flash_attn_ck.py, test_flash_attn_triton_amd.py, test_rotary.py, test_util.py
  • assets/ 17 个文件
    fa4_paper.pdf, flash2_a100_fwd_bwd_benchmark.png, flash2_h100_fwd_bwd_benchmark.png, flash3_fp16_fwd.png, flashattention_logo.png, flashattn_banner.jpg, flashattn_banner.pdf, flashattn_memory.jpg, flashattn_speedup.jpg, flashattn_speedup_3090.jpg, flashattn_speedup_a100_d128.jpg, flashattn_speedup_t4.jpg, flashattn_speedup_t4_fwd.jpg, gpt2_training_curve.jpg
  • AI/ 16 个文件
    CLC_TRACE_DEBUG.md, DEBUG_2CTA.md, DEBUG_METHODOLOGY.md, RACECHECK_TMA_HAZARD.md, SASS_MMA_ANALYSIS.md, SM90_BLOCK_SIZE_TUNING.md, SM90_R2P_MASKING_SASS.md, SPARSE_MLA_1CTA.md, SPARSE_MLA_64H.md, SPARSE_MLA_DPSUM_PRECISION.md, SPARSE_MLA_EXACT_SOFTMAX_MAX.md, SPARSE_MLA_RECOMPUTE_P.md, VARLEN_PREPROCESS_TILE_BUG.md, parse_clc_log.py
  • benchmarks/ 12 个文件
    bench_sm90.py, benchmark_alibi.py, benchmark_attn.py, benchmark_causal.py, benchmark_flash_attention.py, benchmark_gemm.py, benchmark_mla_paged_kv.py, benchmark_sparse_mla_fwd.py, benchmark_varlen_sched.py, clc_bench.py, configs, tune_ex2_emu.py
  • tools/ 11 个文件
    ci, sass_diff.py, two_pass_tests.sh
  • .github/ 10 个文件
    actions, scripts, workflows
  • .gitignore/ 1 个文件
  • .gitmodules/ 1 个文件
  • .pre-commit-config.yaml/ 1 个文件
  • AGENTS.md/ 1 个文件
  • AUTHORS/ 1 个文件
  • CLAUDE.md/ 1 个文件

一次调用怎么流过这些模块

一次典型的 FA4 推理/训练前向调用链如下: 1) 用户调用 flash_attn.cute.interface.flash_attn_func(q, k, v, causal=..., softmax_scale=...)。interface 先做 dtype/shape 对齐(BF16/FP16,headdim 对齐到 8),判断走 standard、varlen、paged 还是 MLA 路径,并读取 env(FLASH_ATTENTION_MLA_1CTA、FLASH_ATTENTION_CUTE_DSL_CACHE_ENABLED 等)。 2) interface 调用 flash_attn.cute.prepare_scheduler.FlashPrepareScheduler,在 host 侧把 (batch, seqlen_q, seqlen_k, nheads, nheads_kv, headdim) 切成 M/N tile,计算 num_m_blocks、num_n_blocks、split-KV 数(num_splits_dynamic),产出 SchedulerMetadataTensorsTorch(含 cu_total_m_blocks、cu_total_splits_m_blocks、blocks_to_batch_idx、tile_count_semaphore)。对 varlen 还会先启动 CuSeqlensToBlocksKernel(cu_blocks_kernel.py)把 cu_seqlens 转成 block 偏移。 3) 根据目标架构(SM90/SM100/SM120)与 headdim、causal、MLA 标志,interface 选择具体 kernel:standard 走 flash_fwd.py 的 flash_fwd_sm{90,100,120};MLA 走 flash_fwd_mla_sm100.py;block-sparse 走 block_sparsity.py + topk_gather_kv.py。 4) kernel 启动前先由 flash_attn.cute.cute_dsl_ptxas 把 @cute.jit 函数编译成 PTX/CUBIN(若命中磁盘缓存 /tmp/${USER}/flash_attention_cute_dsl_cache/ 则跳过编译)。编译使用 nvidia-cutlass-dsl + apache-tvm-ffi,支持 FakeTensor 模式(不分配 GPU 显存)。 5) kernel 执行时,tile_scheduler.py 构造 SchedulerState(create_clc 或 create_dynamic_persistent),把硬件 CLC 或软件 dynamic-persistent 调度器初始化;pipeline.py 的 PipelineStateSimple / PipelineTmaAsync / PipelineUmmaAsync 管理 producer-consumer 环形缓冲。kernel 主体用 copy_utils.py 的 TMA bulk-copy 把 Q/K/V tile 从 HBM 搬到 SMEM,用 mma_sm100_desc.py 构造 WGMMA/UMMA 描述符做 QK^T 与 PV 矩阵乘,softmax.py 做在线 softmax(recompute P,不保存完整注意力矩阵),mask.py 注入 causal/local/ALiBi mask,named_barrier.py 做 warp-group 同步。 6) 输出 out(与 Q 同形状)与 softmax_lse(log-sum-exp,形状 b×h×seqlen_q,给 backward 用)被写回 HBM。 7) backward 时,flash_bwd.py / flash_bwd_mla_sm100.py 复用 forward 的 scheduler 元数据,用 flash_bwd_preprocess 把 dout 与 out 结合,再启动 dK/dV kernel(BlackwellFusedMultiHeadAttentionBackwardDKDVKernel)与 dQ kernel(BlackwellFusedMultiHeadAttentionBackwardDQKernel),最后 flash_bwd_postprocess 把部分和归约成最终梯度。 关键调度点:interface 的路径选择、prepare_scheduler 的 tile/split 决策、tile_scheduler 的 CLC vs dynamic-persistent 选择、pipeline 的 producer-consumer 同步。关键数据结构:SchedulerMetadataTensorsTorch、SchedulerState / ClcSchedulerState、PipelineStateSimple、cute.Tensor(Q/K/V/out/lse)。

1用户调用flash_attn_func · flash_attn/cute/interface.py2host 切 tileFlashPrepareScheduler · flash_attn/cute/prepare_scheduler.py3构造调度状态SchedulerState.create_clc / create_dynam · flash_attn/cute/tile_scheduler.py4编译/取缓存cute_dsl_ptxas · flash_attn/cute/cute_dsl_ptxas.py5launch forward kernelflash_fwd_sm100 · flash_attn/cute/flash_fwd_sm100.py6pipeline 同步PipelineStateSimple / PipelineTmaAsync · flash_attn/cute/pipeline.py7TMA copy + WGMMAcopy_utils / mma_sm100_desc · flash_attn/cute/copy_utils.py8在线 softmaxsoftmax · flash_attn/cute/softmax.py9写回 out + lseflash_fwd_sm100 · flash_attn/cute/flash_fwd_sm100.py

关键类型与函数

名称路径用途
flash_attn_funcflash_attn/cute/interface.pyFA4 用户入口:标准 attention 前向
flash_attn_varlen_funcflash_attn/cute/interface.pyFA4 用户入口:变长(varlen)attention 前向
FlashPrepareSchedulerflash_attn/cute/prepare_scheduler.pyhost 侧把 (batch, seqlen, heads) 切成 tile 并生成 scheduler 元数据
SchedulerMetadataTensorsTorchflash_attn/cute/prepare_scheduler.pyNamedTuple,承载 cu_blocks、cu_seqlens、split 信息、tile semaphore
CuSeqlensToBlocksKernelflash_attn/cute/cu_blocks_kernel.py把 cu_seqlens 转成 block 偏移的 CuTeDSL kernel
SchedulerState / ClcSchedulerState / DynamicPersistentSchedulerStateflash_attn/cute/tile_scheduler.pySM100 调度器运行时状态:CLC 硬件调度 或 软件 dynamic-persistent 调度
PipelineStateSimpleflash_attn/cute/pipeline.py用单个 Int32 编码 index + phase 的 pipeline 环形缓冲状态
flash_fwd_sm100 / flash_bwd_sm100flash_attn/cute/flash_fwd_sm100.py, flash_attn/cute/flash_bwd_sm100.pySM100 standard forward/backward kernel
flash_fwd_mla_sm100flash_attn/cute/flash_fwd_mla_sm100.pySM100 MLA forward(dense/sparse/paged/1CTA-2CTA)
BlackwellFusedMultiHeadAttentionBackwardDKDVKernelflash_attn/cute/sm100_hd256_2cta_fmha_backward_dkdvkernel.pySM100 hd256 2CTA backward dK/dV kernel
BlackwellFusedMultiHeadAttentionBackwardDQKernelflash_attn/cute/sm100_hd256_2cta_fmha_backward_dqkernel.pySM100 hd256 2CTA backward dQ kernel
mha_fwd / mha_bwdcsrc/flash_attn_ck/flash_api.cppROCm CK 后端 FA2 前向/反向 C++ 入口
flash_fwd_kernel_sm90 / flash_bwd_kernel_sm90hopper/flash_fwd_kernel_sm90.h, hopper/flash_bwd_kernel_sm90.hFA3 Hopper C++ kernel 主入口
maybe_fake_tensor_mode / is_fake_modeflash_attn/cute/testing.pytwo-pass 测试的 FakeTensor 装饰器
compute_block_sparsity / topk_gather_kvflash_attn/cute/compute_block_sparsity.py, flash_attn/cute/topk_gather_kv.pyblock-sparse MLA 的稀疏度计算与 KV gather

扩展点

最近在动的地方

建议阅读顺序

  1. README.md + AGENTS.md + CLAUDE.md(定位仓库:FA4 在 flash_attn/cute/,活跃开发;FA2 在 csrc/,FA3 在 hopper/)
  2. flash_attn/cute/__init__.py + flash_attn/cute/interface.py(用户入口:flash_attn_func / flash_attn_varlen_func)
  3. flash_attn/cute/prepare_scheduler.py + flash_attn/cute/seqlen_info.py + flash_attn/cute/block_info.py(host 侧 tile/split 决策)
  4. flash_attn/cute/tile_scheduler.py(CLC / dynamic-persistent 调度器)
  5. flash_attn/cute/pipeline.py + flash_attn/cute/named_barrier.py + flash_attn/cute/copy_utils.py + flash_attn/cute/mma_sm100_desc.py(硬件抽象层)
  6. flash_attn/cute/flash_fwd.py + flash_attn/cute/flash_fwd_sm100.py(SM100 standard forward kernel)
  7. flash_attn/cute/flash_bwd.py + flash_attn/cute/flash_bwd_sm100.py(SM100 standard backward kernel)
  8. flash_attn/cute/flash_fwd_mla_sm100.py + flash_attn/cute/flash_bwd_mla_sm100.py(MLA 变体)
  9. flash_attn/cute/sm100_hd256_2cta_fmha_backward_*.py(SM100 hd256 2CTA backward,最近热点)
  10. tests/cute/test_flash_attn.py + flash_attn/cute/testing.py + tools/two_pass_tests.sh(测试基础设施与 two-pass 工作流)

三、本地跑起来(没有 GPU 的 Mac)

安装

  1. # 1. 创建独立 Python 环境(推荐 Python 3.10–3.12,与 PyTorch 2.2+ 兼容)
  2. conda create -n fa4 python=3.11 -y && conda activate fa4
  3. # 2. 安装 PyTorch(Apple Silicon 用 MPS 后端,CPU 用默认)
  4. pip install torch torchvision torchaudio
  5. # 3. 克隆仓库(含子模块 third_party/aiter)
  6. git clone --recurse-submodules https://github.com/Dao-AILab/flash-attention.git
  7. cd flash-attention
  8. # 4. 安装 FA4 的 Python 依赖(仅 CPU/MPS,不编译 CUDA kernel)
  9. # 注意:nvidia-cutlass-dsl 依赖 CUDA 运行时,在 Mac 上无法真正编译 kernel,
  10. # 但可以安装包以导入 Python 模块、阅读 CuTeDSL 代码。
  11. pip install -e "flash_attn/cute[dev]" 2>&1 | tee install.log
  12. # 5. 若上一步因 CUDA 依赖失败,则仅安装可运行部分:
  13. pip install einops apache-tvm-ffi quack-kernels # 跳过 nvidia-cutlass-dsl
  14. pip install -e flash_attn/cute # 无 extras,可能仍会尝试编译,需验证
  15. # 6. 验证 Python 导入(不触发 kernel 编译)
  16. python -c "from flash_attn.cute import flash_attn_func; print('import ok')"
  17. # 7. 安装测试/开发工具
  18. pip install pytest pytest-xdist pre-commit ruff
  19. # 关键环境变量(Mac 上无 GPU 时设置)
  20. export FLASH_ATTENTION_SKIP_CUDA_BUILD=TRUE # 跳过 CUDA 编译,仅保留 Python 层
  21. export FLASH_ATTENTION_FORCE_BUILD=FALSE # 不强制本地编译

哪些路径能真跑

['【可在 CPU/MPS 上执行的代码路径】', '- flash_attn/cute/__init__.py、flash_attn/cute/interface.py:Python 调度层,可 import 并调用高层 API(但底层 kernel 会失败)。', '- flash_attn/cute/prepare_scheduler.py、flash_attn/cute/tile_scheduler.py、flash_attn/cute/seqlen_info.py、flash_attn/cute/block_info.py:调度逻辑,可在 CPU 上跑单元测试(部分测试用 FakeTensorMode)。', '- flash_attn/cute/pipeline.py、flash_attn/cute/named_barrier.py、flash_attn/cute/mask.py、flash_attn/cute/softmax.py:抽象描述,可在无 GPU 环境下 import 和调试。', '- flash_attn/flash_attn_triton.py、flash_attn/flash_attn_triton_og.py:Triton 实现,理论上可在 AMD GPU 或 CPU 上跑,但 Mac 上无 Triton 后端支持,仅能读代码。', '- tests/cute/test_*.py 中标记 @maybe_fake_tensor_mode(USE_FAKE_TENSOR) 的测试:用 FakeTensorMode 编译 kernel,不分配 GPU 内存(见 AGENTS.md 两阶段测试说明)。', '- tests/test_util.py、tests/test_rotary.py:纯 CPU 测试,无 GPU 依赖。', '', '【只能在 GPU 上执行的代码路径】', '- flash_attn/cute/flash_fwd*.py、flash_attn/cute/flash_bwd*.py、flash_attn/cute/flash_fwd_mla*.py、flash_attn/cute/flash_bwd_mla*.py:CuTeDSL kernel 主体,编译到 PTX/CUBIN,必须 NVIDIA GPU。', '- flash_attn/cute/sm100_hd256_2cta_fmha_backward_*.py、flash_attn/cute/sm100_*、flash_attn/cute/sm120_*:SM100/SM120 专用 kernel,需 Blackwell GPU。', '- csrc/flash_attn/src/*.cu:FA2 CUDA kernel,需 Ampere/Ada/Hopper GPU。', '- csrc/flash_attn_ck/*.cpp:ROCm Composable Kernel 实现,需 AMD GPU。', '- hopper/ 下所有 .cu、.hpp、.h:FA3 Hopper-only 实现,需 H100/H800。', '- benchmarks/*.py、hopper/benchmark_*.py:基准测试,需真实 GPU。', '', '【Mac 上的实际策略】', '- 本地用 FakeTensorMode 跑编译阶段测试(验证 kernel 能否编译通过),用 Colab 免费 T4 做最终执行验证。', '- 阅读代码时重点关注 flash_attn/cute/ 下的调度与 kernel 逻辑,用 print 或 logging 调试 Python 层。']

最小可运行

  1. # 冒烟测试 1:验证 Python 导入与高层 API(CPU/MPS,不触发 kernel 编译)
  2. python -c "from flash_attn.cute import flash_attn_func; from flash_attn.cute.interface import flash_attn_varlen_func; print('API import OK')"
  3. # 冒烟测试 2:用 FakeTensorMode 编译 FA4 forward kernel(无 GPU 内存分配,仅验证编译)
  4. FLASH_ATTENTION_FAKE_TENSOR=1 FLASH_ATTENTION_CUTE_DSL_CACHE_ENABLED=1 pytest tests/cute/test_flash_attn.py -k "test_flash_attn_output" -x --no-header 2>&1 | head -50
  5. # 冒烟测试 3:运行纯 CPU 测试(test_util、test_rotary)
  6. pytest tests/test_util.py tests/test_rotary.py -x -q
  7. # 冒烟测试 4:在 Colab T4 上执行真实 forward/backward(需 GPU)
  8. # 先安装:pip install flash-attn-4
  9. # 然后运行:
  10. python -c "
  11. import torch
  12. from flash_attn.cute import flash_attn_func
  13. q = torch.randn(2, 1024, 8, 16, device='cuda', dtype=torch.float16)
  14. k = torch.randn(2, 1024, 8, 16, device='cuda', dtype=torch.float16)
  15. v = torch.randn(2, 1024, 8, 16, device='cuda', dtype=torch.float16)
  16. out = flash_attn_func(q, k, v, causal=True)
  17. print('FA4 forward OK, shape:', out.shape)
  18. "
  19. # 冒烟测试 5:运行完整 FA4 测试套件(需 GPU,Colab T4 约 30–60 分钟)
  20. FLASH_ATTENTION_FAKE_TENSOR=0 FLASH_ATTENTION_CUTE_DSL_CACHE_ENABLED=1 pytest tests/cute/test_flash_attn.py -x -q
  21. # 冒烟测试 6:验证调度器与 block_info 逻辑(CPU)
  22. python -c "
  23. from flash_attn.cute.prepare_scheduler import FlashPrepareScheduler
  24. from flash_attn.cute.block_info import BlockInfo
  25. scheduler = FlashPrepareScheduler(num_warps=4, tile_m=128, tile_n=128, nheads=8, nheads_kv=8, headdim=128)
  26. print('Scheduler init OK')
  27. "

测试

['测试框架:pytest + pytest-xdist(并行执行),部分测试用 @maybe_fake_tensor_mode 装饰器支持 FakeTensorMode。', '', '测试目录:', '- tests/cute/test_flash_attn.py:FA4 forward/backward 主测试(smoke_test 2/5)。', '- tests/cute/test_flash_attn_mla.py:MLA(Multi-head Latent Attention)测试,覆盖 dense/sparse/paged KV。', '- tests/cute/test_flash_attn_varlen.py:变长序列(varlen)测试。', '- tests/cute/test_mask_mod.py、tests/cute/test_score_mod.py:mask 与 score 修饰符测试。', '- tests/cute/test_block_sparsity.py:块稀疏注意力测试。', '- tests/test_flash_attn.py:FA2 测试(需 GPU)。', '- tests/test_flash_attn_ck.py:ROCm CK 后端测试(需 AMD GPU)。', '- tests/test_flash_attn_triton_amd.py:Triton AMD 后端测试(需 AMD GPU)。', '- tests/test_util.py、tests/test_rotary.py:纯 CPU 工具测试。', '', '只跑 CPU 子集(Mac 无 GPU):', 'pytest tests/test_util.py tests/test_rotary.py -x -q # 纯 CPU,秒级完成', 'pytest tests/cute/test_flash_attn.py -k "test_block_info or test_seqlen_info or test_scheduler" -x -q # 调度逻辑测试', '', 'FakeTensorMode 编译阶段测试(无 GPU 内存分配,但会打开 CUDA 上下文):', 'FLASH_ATTENTION_FAKE_TENSOR=1 FLASH_ATTENTION_CUTE_DSL_CACHE_ENABLED=1 pytest -n 4 tests/cute/test_flash_attn.py -x # 编译所有 kernel,约 5–15 分钟', '', '完整测试套件(需 GPU,Colab T4):', 'FLASH_ATTENTION_FAKE_TENSOR=0 FLASH_ATTENTION_CUTE_DSL_CACHE_ENABLED=1 pytest tests/cute/ -x -q # 30–60 分钟', '', '耗时估算:', '- CPU 子集(test_util + test_rotary):< 10 秒。', '- FakeTensorMode 编译 pass(test_flash_attn.py):5–15 分钟(取决于 CPU 核心数)。', '- GPU 执行 pass(test_flash_attn.py):20–40 分钟(T4)。', '- 完整 tests/cute/ 套件:30–60 分钟(T4)。']

调试

CI

['CI 框架:GitHub Actions(.github/workflows/),含 bump beta tag 脚本(.github/scripts/bump_beta_tag.py)。', '', 'CI 主要跑:', '- 代码格式检查:ruff format(最近 commit fb97d25 为 ruff format 提交)。', '- 静态检查:pre-commit(.pre-commit-config.yaml 配置)。', '- 编译测试:FLASH_ATTENTION_FAKE_TENSOR=1 编译 pass + FLASH_ATTENTION_FAKE_TENSOR=0 执行 pass(见 tools/two_pass_tests.sh)。', '- 完整测试套件:pytest tests/cute/ 在多个 GPU 上并行(-n 256 workers)。', '', 'PR 会被以下检查卡住:', '- ruff format 格式不符(最近 commit fb97d25 显示仓库已强制 ruff 格式化)。', '- pre-commit 钩子失败(isort、ruff、mypy 等)。', '- FakeTensorMode 编译失败(kernel 无法编译)。', '- GPU 执行阶段测试失败(数值精度、shape 不匹配等)。', '- FLASH_ATTENTION_TEST_EXPECT_CACHED=1 时 kernel 未命中缓存(CI 要求所有 kernel 在编译 pass 中已缓存)。']

坑

四、维护者与社区

高频迭代。FA4 当前处于 beta 阶段,最近三个 release(fa4-v4.0.0.beta31/32/33)分别在 2026-09-16、2026-09-23、2026-09-30 发布,约每周一个 beta。commit 集中在 flash_attn/cute(近 43 次提交热点)、tests/cute(15 次)与 hopper/,最近提交(2026-10-04)仍在推进 SM100 hd256 backward 与 varlen Q/decode 的修复与统一。FA2/FA3 仍有维护提交(如 split-KV combine 归一化、Windows 构建修复),但开发重心已明确切到 FA4。

谁角色依据
Tri Dao项目发起人与核心维护者(Dao-AILab 负责人,FA 系列论文第一作者)README 中论文与博客链接均指向 tridao.me;setup.py 顶部 Copyright 2023 Tri Dao;AUTHORS 与仓库归属 Dao-AILab
JohnsonmsFA4 CuTe 内核核心开发者(MLA、SM100/SM120、head_dim 扩展方向)Issue #2456 RFC「FA4 — head_dim=256 & head_dim=512」与 #2969「dsink loses precision」指派给 Johnsonms;近期提交如 #2938「1CTA MLA forward (dense + sparse top-k), MLA dispatch heuristic, sparse MLA backward at any head count」直接扩展 MLA 支持
tzadouriFA4 内核开发者(head_dim 扩展与调度方向)Issue #2456 RFC「FA4 — head_dim=256 & head_dim=512」共同指派给 tzadouri,表明其负责 head_dim=256/512 调度与 kernel 适配
micmelesseROCm / CK / aiter 后端维护者Issue #2933「Use aiter's gfx950 asm backward kernels in the CK backend」指派给 micmelesse;PR #2963「CK: add gfx12 BF16 D256 split-head backward kernels」涉及 ROCm CK 后端
ssiuFA2 Turing 支持与维护README 中 flash-attention-turing 仓库作者,负责 Turing GPU 上的 FA2 子集支持
Dao-AILab 团队成员(协作 review)CI/CD、构建系统、跨平台(Windows/ROCm/CUDA 13)维护PR #2872「Fix Windows builds with CUDA 13 and PyTorch 2.15」、#2940「ruff format」、#2948「Allow apache-tvm-ffi 0.1.11」等由 Dao-AILab 成员提交,涉及构建、格式化、依赖升级

流程与 Review 风格

仓库根目录没有独立的 CONTRIBUTING.md,贡献流程主要靠 AGENTS.md / CLAUDE.md 与 setup.py 环境变量驱动。CLAUDE.md 明确:活跃开发在 flash_attn/cute/,安装用 pip install -e "flash_attn/cute[dev]",测试用 pytest tests/cute/test_flash_attn.py 等;并给出「two-pass testing」流程(先用 FLASH_ATTENTION_FAKE_TENSOR=1 并行编译,再用缓存执行)。pre-commit 配置存在(.pre-commit-config.yaml),且 PR #2940 专门做 ruff format,表明代码风格用 ruff 强制格式化。没有看到 CLA/DCO 文件。Issue 模板与 PR 模板未在根目录显式出现,但 .github/workflows 与 .github/actions 存在,CI 会跑构建与测试。贡献者应先在 GitHub Issue 复现/讨论(如 #2957、#2969 带具体 GPU 与 head_dim 条件),再提 PR。

Review 风格偏「硬核内核工程师」:紧贴具体 GPU 架构、head_dim、varlen、GQA、deterministic 等细节。Issue 标题高度具体(如「[CuTe, SM100] dsink loses precision: dpsum uses the bf16-rounded O」「[CuTe, SM90] Paged KV with page_size != tile_n: wrong output at head_dim 80/96 (non-causal), illegal memory access at 160/224」),要求复现条件精确到 dtype、head_dim、page_size、causal 开关。PR 拆分细致(如 #2964–#2968 把「Unify hd256 backward」拆成 5 个子 PR:tests first → 2CTA schedules → opt-in → GQA/varlen → delete dedicated kernels),说明维护者偏好小步、可审查的增量提交。响应速度:高频提交与 weekly beta release 表明核心维护者几乎每日在线;Issue 指派(Johnsonms、tzadouri、micmelesse)显示会按模块分派。对数值精度、illegal memory access、deterministic 类 Issue 反应最快。

渠道

这里的规矩

维护者现在最想要的帮助

五、切入方案

建议长期负责:FA4 Python 层(flash_attn/cute/)的测试基础设施、调度器单元测试、以及 SM100/SM110 新特性的文档与 benchmark 基线
AGENTS.md 与 CLAUDE.md 明确写明「active development is on FA4 in flash_attn/cute/」,commit 热点(flash_attn/cute 43 次、tests/cute 15 次)证实这是当前开发中心。该层的工作(测试、文档、benchmark 脚本、错误提示、调度器单测)大量可在 CPU/FakeTensorMode 下完成,仅最终数值确认需 Colab T4。这条路径从「补测试/文档」起步,逐步深入到「调度器逻辑 → kernel 调试 → 新特性实现」,是通向维护者身份的最稳妥路线——既避开无 GPU 的硬约束,又直接服务于核心维护者(Johnsonms、tzadouri)当前最活跃的模块。

它现在缺什么(你无 GPU 也能补)

缺口依据为什么是你
FA4 的 Python 层测试覆盖在 SM100/SM110 新特性上仍然稀疏,尤其缺少 head_dim=256 backward、varlen decode、MLA sparse top-k 等组合场景的细粒度单测commit 热点集中在 flash_attn/cute(43 次)与 tests/cute(15 次),但最近提交如 #2938「1CTA MLA forward (dense + sparse top-k), sparse MLA backward at any head count」、#2952「Allow deterministic=True in the hd256 backward」、#2951「hd256: S ping-pong on SM103, 2CTA for varlen Q and decode」都引入了新 kernel 变体;tests/cute/ 目录仅 15 次提交热点,且 AGENTS.md 列出的测试文件只有 test_flash_attn.py、test_flash_attn_mla.py、test_flash_attn_varlen.py 等少数几个,未见针对 hd256 backward / varlen decode / MLA sparse 的独立测试文件。写测试只需要在 CPU 上构造小张量、用 FakeTensorMode 触发 kernel 编译路径(AGENTS.md 已明确支持 FLASH_ATTENTION_FAKE_TENSOR=1),无需真实 GPU 即可验证接口正确性与形状/类型分发逻辑。这是无 GPU 条件下最高杠杆的贡献。
FA4 文档与 README 对 SM100/SM110 支持矩阵、已支持特性(MLA、FP8、varlen、head_dim=256)的描述严重滞后于代码实际能力README 仍把 FA3 标为「beta release for testing / benchmarking」,FA4 章节仅给出最小安装示例;最新 release fa4-v4.0.0.beta33(2026-09-30)已支持 SM100/SM110、MLA、FP8、varlen decode、hd256 backward(见 #2952、#2938、#2951),但 README 与 usage.md 未同步更新支持矩阵表格。文档工作完全在 CPU 上完成,只需读源码(flash_attn/cute/interface.py、flash_attn/cute/__init__.py、tests/cute/ 中的测试参数)即可整理出真实支持矩阵。这是建立社区信任与降低贡献者门槛的关键一步。
FA4 缺少独立的、可离线运行的 benchmark 脚本与回归基准,尤其缺少 SM100/SM110 上 hd256、MLA、varlen decode 的性能基线benchmarks/ 目录有 bench_sm90.py、benchmark_mla_paged_kv.py、benchmark_sparse_mla_fwd.py、benchmark_varlen_sched.py 等,但无 bench_sm100.py 或 bench_hd256.py;最近提交 #2951、#2952 引入 hd256 新 kernel 却未伴随可复现的 benchmark 脚本。benchmark 脚本本身可在 CPU 上编写与 dry-run 验证(用 FakeTensorMode 或仅需验证脚本逻辑),最终数值确认才需 Colab T4 几十分钟。这是把「能跑」变成「可衡量」的桥梁。
FA4 的 error message 与输入校验在 Python 接口层(interface.py、flash_fwd*.py 入口)仍然粗糙,用户遇到不支持的 dtype/head_dim/varlen 组合时难以定位Issue #2456 RFC「FA4 — head_dim=256 & head_dim=512」与 #2969「dsink loses precision」表明边界条件处理仍是活跃议题;flash_attn/cute/interface.py 作为用户入口,其参数校验与错误提示在快速迭代中未同步完善。改善错误提示只需读 Python 层代码,无需 GPU。这是高 ROI 的「让库对新人友好」贡献,也让你自己快速熟悉所有代码路径。
FA4 的 CI / 测试基础设施文档缺失,尤其缺少「如何在无 GPU 环境下跑测试」的明确指引AGENTS.md 与 CLAUDE.md 详细描述了两阶段测试(FakeTensorMode 编译 + 真实执行),但 README 与 CONTRIBUTING(为空)均未提及;tools/two_pass_tests.sh 存在但无顶层文档链接。你自己在 MacBook Air 上就会遇到这个问题,解决它同时产出文档,直接降低后续所有贡献者的门槛。
FA4 的调度器(prepare_scheduler.py、tile_scheduler.py、cu_blocks_kernel.py)缺少独立的单元测试与注释,CLC/dynamic-persistent 调度逻辑的正确性仅靠端到端测试覆盖flash_attn/cute/prepare_scheduler.py 是 hopper/flash_prepare_scheduler.cu 的 CuTeDSL 重实现(文件头注释明确说明),tile_scheduler.py 含 ClcDynamicPersistentTileScheduler 封装;tests/cute/ 中无对应独立测试文件。调度器逻辑可在 CPU 上用 FakeTensorMode 或纯 Python 单元测试验证(SchedulerMetadataTensorsTorch 是纯 Python NamedTuple),无需 GPU。这是理解 FA4 核心并切入深层贡献的捷径。
FA4 与 FA2/FA3 的 API 兼容性对照文档缺失,用户从旧版本迁移时缺乏明确指引flash_attn/__init__.py(FA2)、flash_attn/cute/__init__.py(FA4)、hopper/flash_attn_interface.py(FA3)三套接口并存;usage.md 仅覆盖旧版用法,未给出迁移对照表。整理对照表只需读三个 __init__.py 与 interface.py,纯文档工作,无 GPU 依赖。这是社区高需求、低门槛的贡献。
FA4 的 ROCm/CK 后端(csrc/flash_attn_ck/)与 CUDA 后端在 varlen、split-K 等特性上的行为差异缺少文档与回归测试commit #2901「Fix num_splits heuristic, which could never return more than 1」暴露 CK 后端 split-K 逻辑与 CUDA 侧不一致;tests/test_flash_attn_ck.py 存在但覆盖范围未知,README 中 ROCm 章节未提及与 CUDA 的行为差异。整理差异与补充测试可在 CPU 上读代码完成,最终验证才需 ROCm GPU(可暂缓)。这是跨后端一致性这一长期议题的切入点。

第 1–30 天:看懂并露面

第 31–60 天:稳定产出

第 61–90 天:接管一块

第一批 PR

题目范围为什么安全
Add unit tests for FlashPrepareScheduler and SchedulerState在 tests/cute/test_prepare_scheduler.py(新建)中覆盖 FlashPrepareScheduler 的 __init__、get_grid_shape、__call__ 的 FakeTensorMode 编译路径,以及 SchedulerMetadataTensorsTorch 的字段访问;在 tests/cute/test_tile_scheduler.py(新建)中覆盖 SchedulerState.create_clc、create_dynamic_persistent、consumer_wait/release 状态机。纯 Python + FakeTensorMode,不触发真实 GPU 执行;测试对象是调度器状态机,不涉及数值精度;失败时不会影响现有端到端测试。
Document SM100/SM110 support matrix in README更新 README 的「FlashAttention-4」章节,新增支持矩阵表格(dtype × head_dim × causal × varlen × MLA × FP8 × sliding window),每个单元格标注「✅/❌/部分」并引用对应测试文件或 Issue 编号作为证据;同步更新 usage.md 中的安装示例。纯文档变更,不触任何代码编译或测试;维护者对文档更新接受度高;可建立信任。
Add input validation tests for flash_attn.cute.interface在 tests/cute/test_interface.py(新建)中测试 flash_attn_func 与 flash_attn_varlen_func 对非法参数(如不支持的 dtype、head_dim=300、varlen 但无 cu_seqlens)的错误抛出行为,验证 ValueError 消息包含可操作的提示。仅测试错误路径,不改变成功路径行为;FakeTensorMode 下即可验证接口分发逻辑;失败时回滚简单。
Add benchmark scripts for SM100 hd128/hd256 forward and backward新建 benchmarks/bench_sm100.py 与 benchmarks/bench_hd256.py,复用 benchmarks/bench_sm90.py 的结构,覆盖 hd128/hd256 × fp16/bf16 × causal/non-causal × forward/backward;脚本支持 --dry-run 参数在 CPU 上验证逻辑。新增文件,不修改现有代码;dry-run 模式保证 CPU 上可验证;最终数值确认才需 Colab T4,风险可控。
Add migration guide: FA2 → FA3 → FA4 API comparison新建 docs/migration.md(或更新 usage.md),列出三套 API 的函数签名、参数差异、返回值差异、支持的 dtype/head_dim 范围,并给出典型迁移代码片段。纯文档,无代码风险;信息来源是三个 __init__.py 与 interface.py,可交叉验证;维护者长期需要此类文档。

怎么知道自己站住了

风险与对策
  • 无 GPU 导致无法验证 kernel 实际性能与数值精度,贡献长期停留在「文档/测试」层,难以切入核心 kernel 开发:用 FakeTensorMode 覆盖编译路径与接口逻辑;与有 GPU 的社区成员结对(在 Issue 中明确「需要 Colab T4 验证」);申请 Lambda Labs / Colab Pro 等免费/低成本 GPU 资源;优先选择「调度器逻辑」「tile 策略」这类可在 CPU 上验证正确性的方向。
  • FA4 处于 beta 阶段(最新 fa4-v4.0.0.beta33),API 与 kernel 接口快速变化,文档与测试很快过时:文档中明确标注「as of fa4-v4.0.0.beta33」版本号;测试用参数化覆盖而非硬编码;订阅 release notification,在每个新 beta 发布后跑一次测试套件;优先写「支持矩阵」类文档而非「具体用法」类文档,前者变化频率更低。
  • 核心维护者(Tri Dao、Johnsonms)响应慢或对新贡献者冷漠,导致 PR 长期挂起:先从小范围、高确定性的 PR(文档、拼写修复、单测)入手建立信任;在 Issue 中充分引用代码证据(文件路径 + 行号)证明自己做过功课;同时在 PyTorch/HuggingFace 相关 repo 建立并行贡献记录,降低对单一社区的依赖。
  • 仓库同时维护 FA2/FA3/FA4/CK 四代产品,代码路径复杂,容易改错层(如改了 FA2 而非 FA4):每次改动前用 git log --oneline -20 <文件路径> 确认该文件近期活跃;在 PR 描述中明确标注「Target: FA4 in flash_attn/cute/」;首次 PR 请 maintainer 确认 scope。
  • MacBook Air 16GB 内存有限,跑大型测试套件或编译时可能 OOM:用 pytest -n 2 限制并行 worker 数量;用 -k 过滤只跑相关测试子集;设置 MAX_JOBS=2 限制 ninja 并行编译;优先在 FakeTensorMode 编译 pass 工作,该 pass 不分配 GPU 内存但会开 CUDA context(每个几百 MB),需控制并发。
  • ROCm/CK 后端(csrc/flash_attn_ck/)与 CUDA 后端行为差异大,整理一致性文档时容易遗漏边界情况:先聚焦 CUDA 后端(flash_attn/cute/),CK 后端作为第二阶段;用 Issue #2901「Fix num splits heuristic」这类具体 bug 作为切入点,而非一次性整理全量差异。
  • 贡献者与核心开发者的时区差异导致沟通延迟:在 PR 描述中提供完整的自检清单(已跑过的测试、已验证的文件路径),减少来回沟通次数;在 Issue 中用异步友好的格式(代码片段 + 文件引用 + 建议方案)提问。
  • 项目对外部贡献者的代码风格、commit message 格式有隐含要求,首次 PR 因格式问题被拒:先跑 pre-commit run --all-files(.pre-commit-config.yaml 已配置 ruff);参考最近 10 个 merged PR 的 commit message 格式(如 [CuTe, SM100] Allow deterministic=True in the hd256 backward (#2952));在 PR 模板中明确引用相关 Issue 编号。

六、怎么介入这个项目

建议顺序

成为长期维护者的路径
  • 从测试/文档类「支撑性 PR」入手,建立信任(维护者对这类低风险贡献接受度高)
  • 逐步切入 flash_attn/cute/ 的调度器与 Python 层逻辑(prepare_scheduler、tile_scheduler、interface)
  • 积累对 FA4 代码路径的理解后,参与 SM100/SM120 新特性的正确性验证与性能分析
  • 长期可走向 FA4 多架构支持(SM120、MLA、FP8)或分布式训练性能方向

七、任务卡

任务 1优先 · medium · CPU · 2-3 个晚上

为 FlashPrepareScheduler / SchedulerState / tile_scheduler 添加 FakeTensorMode 单元测试

无人认领3 条评论更新 2026-10-01

用到的专长:算子内核性能工程 + PyTorch 内核测试经验,能快速理解调度器状态机与 FakeTensorMode 编译路径。

目标:新建 tests/cute/test_prepare_scheduler.py 与 tests/cute/test_tile_scheduler.py,覆盖 FlashPrepareScheduler 的 __init__、get_grid_shape、__call__ 的 FakeTensorMode 编译路径,以及 SchedulerState.create_clc、create_dynamic_persistent、consumer_wait/release 状态机转换。

为什么值得长期做:调度器是 FA4 性能关键路径(#2426 明确列出 Python 层开销 ~73us/call),理解调度器状态机是切入 FA4 深层贡献的捷径;当前 tests/cute/ 中无独立调度器测试文件,属于明显缺口。

怎么介入:在 Issue #2426 下评论,说明打算添加调度器单元测试,询问维护者对测试范围与文件命名的期望。
第一个 PR 的边界:仅新建两个测试文件(tests/cute/test_prepare_scheduler.py、tests/cute/test_tile_scheduler.py),不修改任何现有代码。
第一步:阅读 flash_attn/cute/prepare_scheduler.py、flash_attn/cute/tile_scheduler.py、flash_attn/cute/seqlen_info.py、flash_attn/cute/block_info.py,理解 SchedulerMetadataTensorsTorch 的字段与状态机逻辑。
本机怎么复现 / 验证:git clone 仓库后 pip install -e .[test],然后 FLASH_ATTENTION_FAKE_TENSOR=1 pytest tests/cute/test_prepare_scheduler.py tests/cute/test_tile_scheduler.py -v 运行测试(Mac 上无 GPU 也可执行)。
认领留言(英文,可直接贴到 Issue)
Hi! I'd like to add unit tests for FlashPrepareScheduler and SchedulerState under FakeTensorMode, since the current test suite lacks independent scheduler tests. I'll create tests/cute/test_prepare_scheduler.py and tests/cute/test_tile_scheduler.py covering the init/get_grid_shape/__call__ paths and the CLC/dynamic-persistent state machine transitions. Could you confirm if you'd prefer separate test files or merging into existing test_flash_attn.py? I'll have a PR ready in 2-3 days.
大致实施方案
  • 在 tests/cute/ 下新建 test_prepare_scheduler.py
  • 使用 @maybe_fake_tensor_mode(USE_FAKE_TENSOR) 装饰器编写测试
  • 覆盖 FlashPrepareScheduler 的 __init__、get_grid_shape、__call__ 方法
  • 覆盖 SchedulerMetadataTensorsTorch 的字段访问与构造
  • 新建 test_tile_scheduler.py,覆盖 SchedulerState.create_clc、create_dynamic_persistent
  • 覆盖 consumer_wait / release 状态机转换
  • 在 Mac 上运行 pytest tests/cute/test_prepare_scheduler.py tests/cute/test_tile_scheduler.py 验证
可能涉及的目录或文件
  • flash_attn/cute/prepare_scheduler.py
  • flash_attn/cute/tile_scheduler.py
  • flash_attn/cute/seqlen_info.py
  • flash_attn/cute/block_info.py
  • tests/cute/testing.py(FakeTensorMode 基础设施)
验收方式
  • pytest tests/cute/test_prepare_scheduler.py -v(新增)
  • pytest tests/cute/test_tile_scheduler.py -v(新增)
  • FLASH_ATTENTION_FAKE_TENSOR=1 pytest tests/cute/test_prepare_scheduler.py tests/cute/test_tile_scheduler.py -v
  • 确认所有测试在 Mac(无 GPU)上通过
开工前问题与风险

向维护者确认

  • SchedulerState 的 CLC 与 dynamic-persistent 路径是否需要分别测试?
  • 是否需要覆盖 cu_blocks_kernel 的 Python 层逻辑?
  • FakeTensorMode 下是否需要模拟不同的 (batch, seqlen, heads) 组合?

风险

  • FakeTensorMode 可能无法覆盖所有 kernel 变体路径
  • 调度器状态机逻辑复杂,测试可能遗漏边界条件
  • 测试文件命名需与现有 test_flash_attn.py 等保持一致
任务 2优先 · medium · CPU · 2 个晚上

为 flash_attn.cute.interface 添加输入校验与错误提示测试

已有 PR #28022 条评论更新 2026-09-27

用到的专长:PyTorch 内核开发与测试经验,熟悉 Python 接口层的参数分发与校验逻辑。

目标:新建 tests/cute/test_interface.py,测试 flash_attn_func 与 flash_attn_varlen_func 对非法参数(不支持的 dtype、head_dim=300、varlen 但无 cu_seqlens、max_seqlen 类型错误)的错误抛出行为,验证 ValueError 消息包含可操作的提示。

为什么值得长期做:Python 接口层是用户入口,#2801 暴露了参数校验缺失的问题;改善错误提示是无 GPU 条件下最高 ROI 的贡献,也让你快速熟悉所有代码路径。

怎么介入:在 Issue #2801 下评论,说明打算添加接口层输入校验测试,询问维护者是否需要同步修复发现的校验缺失。
第一个 PR 的边界:仅新建 tests/cute/test_interface.py,不修改 interface.py 的校验逻辑(除非维护者明确要求)。
第一步:阅读 flash_attn/cute/interface.py,梳理所有参数校验点与现有错误提示。
本机怎么复现 / 验证:pip install -e .[test] 后运行 pytest tests/cute/test_interface.py -v,Mac 上无 GPU 也可执行(FakeTensorMode 验证接口分发逻辑)。
认领留言(英文,可直接贴到 Issue)
Hi! Following up on #2801, I'd like to add comprehensive input validation tests for flash_attn.cute.interface. I'll create tests/cute/test_interface.py covering invalid dtype, head_dim, missing cu_seqlens, and max_seqlen type mismatches, with user-friendly error messages. Should I also fix any missing validation I find, or keep this PR test-only? I'll have a draft ready in 2 days.
大致实施方案
  • 在 tests/cute/ 下新建 test_interface.py
  • 使用 pytest.raises 测试非法 dtype(如 fp32、int8)的抛出行为
  • 测试非法 head_dim(如 300、512 在不支持的架构上)的抛出行为
  • 测试 varlen 调用但缺少 cu_seqlens 的抛出行为
  • 测试 max_seqlen_q / max_seqlen_k 为 tensor 时的类型处理(对应 #2801)
  • 验证错误消息包含可操作的提示(如 'Expected dtype in {fp16, bf16}' 而非裸 'invalid dtype')
  • 在 Mac 上运行 pytest tests/cute/test_interface.py 验证
可能涉及的目录或文件
  • flash_attn/cute/interface.py
  • flash_attn/cute/flash_fwd.py
  • flash_attn/cute/flash_bwd.py
  • flash_attn/cute/utils.py
验收方式
  • pytest tests/cute/test_interface.py -v(新增)
  • FLASH_ATTENTION_FAKE_TENSOR=1 pytest tests/cute/test_interface.py -v
  • 确认所有测试在 Mac(无 GPU)上通过
  • 确认错误消息对用户友好(可读性检查)
开工前问题与风险

向维护者确认

  • 是否需要为 FA4 的所有参数组合(causal、window_size、alibi_slopes、deterministic)都添加校验测试?
  • 错误消息的格式是否有现有约定(如与 FA2/FA3 保持一致)?
  • 是否需要同时修复发现的校验缺失(超出测试范围)?

风险

  • 参数组合爆炸,测试可能过于庞大
  • 错误消息的维护成本(后续接口变更需同步更新测试)
  • FakeTensorMode 可能无法触发所有校验路径
任务 3优先 · medium · CPU · 2-3 个晚上

为 splitkv early-exit LSE 问题(#2842)添加回归测试与文档

无人认领2 条评论更新 2026-09-27

用到的专长:CUDA kernel 性能工程 + 内存安全分析经验,能快速理解 LSE offset 计算与 varlen batch 布局。

目标:在 tests/test_flash_attn.py 或新建 tests/test_splitkv_early_exit.py 中,构造一个包含 zero-length(或 fully masked)KV sequence 的 varlen batch,验证 return_softmax_lse=True 时 LSE 写入地址正确,不污染其他 sequence 的 LSE slot。

为什么值得长期做:#2842 是一个真实的内存安全 bug(early-exit 路径写入错误 LSE slot),但当前测试套件从未构造 zero-length KV sequence 来触发;添加回归测试是防止此类 bug 回归的关键。

怎么介入:在 Issue #2842 下评论,说明打算添加回归测试,询问维护者对测试范围(SplitKV vs. non-SplitKV)的期望。
第一个 PR 的边界:新建 tests/test_splitkv_early_exit.py,不修改任何现有代码或 kernel 逻辑。
第一步:阅读 Issue #2842 正文中的代码定位(csrc/flash_attn/src/flash_fwd_kernel.h:552 vs :1030),理解 early-exit 路径与 normal exit 路径的 LSE offset 计算差异。
本机怎么复现 / 验证:pip install -e .[test] 后运行 pytest tests/test_splitkv_early_exit.py -v,Mac 上无 GPU 可执行(FakeTensorMode 验证接口分发与 LSE 形状)。
认领留言(英文,可直接贴到 Issue)
Hi! I'd like to add a regression test for the splitkv early-exit LSE bug described in #2842. I'll construct a varlen batch with a zero-length KV sequence and verify that return_softmax_lse=True writes -inf to the correct slot without polluting other sequences. Should I cover both SplitKV and non-SplitKV paths, or focus on the non-SplitKV path as described in the issue? I'll have a PR ready in 2-3 days.
大致实施方案
  • 阅读 csrc/flash_attn/src/flash_fwd_kernel.h 中 :552 与 :1030 的 LSE offset 计算逻辑
  • 构造一个 varlen batch,包含至少一个 zero-length KV sequence(cu_seqlens 中有相邻相等元素)
  • 调用 flash_attn_varlen_func(..., return_softmax_lse=True)
  • 验证返回的 LSE tensor 中,zero-length sequence 对应的 slot 为 -inf,且其他 sequence 的 LSE slot 未被污染
  • 在 Mac 上运行 pytest tests/test_splitkv_early_exit.py(新增)验证
可能涉及的目录或文件
  • csrc/flash_attn/src/flash_fwd_kernel.h
  • tests/test_flash_attn.py
  • flash_attn/flash_attn_interface.py
验收方式
  • pytest tests/test_splitkv_early_exit.py -v(新增)
  • FLASH_ATTENTION_FAKE_TENSOR=1 pytest tests/test_splitkv_early_exit.py -v
  • 确认测试在 Mac(无 GPU)上通过
  • 确认测试能捕获 #2842 中描述的 bug(如手动引入 bug 后测试失败)
开工前问题与风险

向维护者确认

  • 是否需要同时测试 SplitKV 与 non-SplitKV 路径?
  • zero-length KV sequence 的构造方式是否有现成工具函数?
  • 是否需要与 CUDA 后端测试保持一致(当前仅覆盖 FA2 CUDA 路径)?

风险

  • zero-length sequence 的构造可能依赖特定的 cu_seqlens 格式
  • FakeTensorMode 可能无法完全模拟 LSE 写入行为
  • 测试可能需要特定的 batch/segment 组合才能触发 early-exit
任务 4可选 · medium · Colab T4 · 2-3 个晚上

为 FA4 Python dispatch 开销(#2426)添加可复现的 micro-benchmark 脚本

无人认领3 条评论更新 2026-10-01

用到的专长:性能建模与 benchmark 设计经验,熟悉 Python 层 profiling 与 CUDA event 计时。

目标:新建 benchmarks/bench_dispatch_overhead.py,复用 benchmarks/bench_sm90.py 的结构,测量不同 (batch, seqlen, heads, hdim) 组合下的 Python dispatch 开销,支持 --dry-run 参数在 CPU 上验证逻辑。

为什么值得长期做:#2426 列出了 FA4 Python 层 ~73us/call 的详细开销分解,但缺少可复现的 benchmark 脚本;这是把「能跑」变成「可衡量」的桥梁,也是后续优化的基线。

怎么介入:在 Issue #2426 下评论,说明打算添加可复现的 dispatch overhead benchmark 脚本,询问维护者对测量范围(forward vs. backward)的期望。
第一个 PR 的边界:仅新建 benchmarks/bench_dispatch_overhead.py,不修改现有代码或 benchmark。
第一步:阅读 benchmarks/bench_sm90.py 与 benchmarks/bench_utils.py,理解现有 benchmark 的结构与测量方法。
本机怎么复现 / 验证:git clone 仓库后运行 python benchmarks/bench_dispatch_overhead.py --dry-run,Mac 上无 GPU 可验证脚本逻辑;最终性能数据需在 Colab T4 上运行 python benchmarks/bench_dispatch_overhead.py 获取(约 10-20 分钟)。
认领留言(英文,可直接贴到 Issue)
Hi! I'd like to create a reproducible micro-benchmark script for FA4's Python dispatch overhead, as detailed in #2426. I'll add benchmarks/bench_dispatch_overhead.py that measures end-to-end call time across different (batch, seqlen, heads, hdim) combinations, with a --dry-run mode for CPU-only validation. Should I measure both forward and backward overhead, or focus on forward first? I'll have a PR ready in 2-3 days.
大致实施方案
  • 阅读 benchmarks/bench_sm90.py 复用其参数解析、测量循环、结果输出结构
  • 新建 benchmarks/bench_dispatch_overhead.py
  • 实现 --dry-run 参数,在 CPU 上验证脚本逻辑(不实际调用 kernel)
  • 测量不同 (batch, seqlen, heads, hdim) 组合下的端到端调用时间
  • 分离 Python dispatch 开销(总时间 - kernel 执行时间,kernel 时间用 CUDA event 测量)
  • 输出与 #2426 一致的表格格式(us/call、% overhead)
  • 在 Mac 上运行 python benchmarks/bench_dispatch_overhead.py --dry-run 验证逻辑
可能涉及的目录或文件
  • benchmarks/bench_sm90.py
  • benchmarks/bench_utils.py
  • flash_attn/cute/interface.py
  • flash_attn/cute/flash_fwd.py
验收方式
  • python benchmarks/bench_dispatch_overhead.py --dry-run(Mac 上验证逻辑)
  • 在 Colab T4 上运行 python benchmarks/bench_dispatch_overhead.py 获取真实性能数据
  • 对比 #2426 中列出的 ~73us forward / ~95us backward 开销
  • 确认脚本输出格式与现有 benchmark 一致
开工前问题与风险

向维护者确认

  • 是否需要同时测量 forward 与 backward 的 dispatch 开销?
  • 是否需要与 FA2/FA3 的 dispatch 开销进行对比?
  • benchmark 结果的输出格式(CSV、Markdown 表格、JSON)?

风险

  • Python 开销测量受系统负载影响,结果可能不稳定
  • dry-run 模式无法验证真实性能数据
  • Colab T4 的免费使用时间有限(几十分钟)
任务 5可选 · medium · CPU · 2-3 个晚上(分散到三个 PR)

review 进行中的 PR(#2964、#2954、#2947)并补测试

已有 PR #29540 条评论更新 2026-10-02

用到的专长:GPU kernel 性能工程 + PyTorch 内核测试经验,能快速理解 FA4 的 tiling 与调度逻辑。

目标:review PR #2954、#2947、#2964 的代码变更,理解其设计意图,并为其中缺少测试覆盖的部分补充 FakeTensorMode 测试。

为什么值得长期做:#2954(SM80 sliding-window 优化)、#2947(SM80 block sparse 错误提示)、#2964(hd256 backward 统一)都是活跃 PR,review 并补测试是参与核心开发的最快路径。

怎么介入:在 PR #2954、#2947、#2964 的评论中说明打算补充测试,询问 PR 作者是否已有测试计划。
第一个 PR 的边界:在现有测试文件中补充测试用例,不新建测试文件,不修改 kernel 代码。
第一步:fetch 三个 PR 的分支到本地,阅读其代码变更与 review 评论。
本机怎么复现 / 验证:git fetch origin pull/<PR>/head:pr-<PR> && git checkout pr-<PR> 后运行 pytest tests/cute/test_flash_attn.py tests/cute/test_interface.py -v,Mac 上无 GPU 可执行。
认领留言(英文,可直接贴到 Issue)
Hi! I've reviewed PR #2954 (SM80 sliding-window forward optimization) and noticed the test coverage for sliding-window attention could be expanded. I'd like to add targeted tests in tests/cute/test_flash_attn.py covering the (window_size, causal, head_dim) combinations. Should I submit these as a separate PR or as a patch to this PR? I'll have the tests ready in 1-2 days.
大致实施方案
  • git fetch origin pull/2954/head:pr-2954 && git checkout pr-2954
  • 阅读 PR #2954 的代码变更(SM80 sliding-window forward 优化)
  • 在 tests/cute/test_flash_attn.py 中补充 sliding-window 的测试用例
  • git fetch origin pull/2947/head:pr-2947 && git checkout pr-2947
  • 阅读 PR #2947 的代码变更(SM80 block sparse 错误提示)
  • 在 tests/cute/test_interface.py 中补充 block sparse 错误提示的测试
  • git fetch origin pull/2964/head:pr-2964 && git checkout pr-2964
  • 阅读 PR #2964 的代码变更(hd256 backward 统一测试)
  • 在 PR 评论中提出测试补充建议或直接提交测试 patch
可能涉及的目录或文件
  • flash_attn/cute/flash_fwd.py(PR #2954)
  • flash_attn/cute/interface.py(PR #2947)
  • flash_attn/cute/flash_bwd.py(PR #2964)
  • tests/cute/test_flash_attn.py
  • tests/cute/test_interface.py
验收方式
  • pytest tests/cute/test_flash_attn.py -v(修改)
  • pytest tests/cute/test_interface.py -v(修改)
  • FLASH_ATTENTION_FAKE_TENSOR=1 pytest tests/cute/ -v
  • 确认所有测试在 Mac(无 GPU)上通过
开工前问题与风险

向维护者确认

  • PR 作者是否已有测试计划,避免重复工作?
  • 测试的粒度如何(单元测试 vs. 端到端测试)?
  • 是否需要与现有测试保持参数一致性?

风险

  • PR 可能仍在快速迭代,测试可能频繁失效
  • review 评论可能与 PR 作者的观点冲突
  • 测试补充可能被维护者视为「超出 PR 范围」