[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"news-4cbfe2a4-5b83-464d-bc5b-50acf224b1b0":3},{"id":4,"title":5,"summary":6,"original_url":7,"source_id":8,"tags":9,"published_at":23,"created_at":24,"modified_at":25,"is_published":26,"publish_type":27,"image_url":13,"view_count":28},"4cbfe2a4-5b83-464d-bc5b-50acf224b1b0","把 PyTorch SDPA 四个后端跑一遍 torch.profiler:HF 团队揭开 FlashAttention「13% 占用率」真相","Hugging Face 工程团队 7 月 10 日发布「Profiling in PyTorch」系列第 3 篇,在 A100 上用 torch.profiler 把 PyTorch SDPA 的 math、efficient(xformers)、flash(FlashAttention-2)、cuDNN 四个后端逐一跑过,挖出几条「直觉与 trace 对不上」的发现。\n\n第一条:`masked_fill` 改成原地 `masked_fill_`,trace 里多出来的就是隐藏的 Memcpy。out-of-place 操作先复制再改写,原地版在 `no_grad` 下直接覆盖原 tensor 内存,对 logits 这种大张量既省 kernel 又省显存。改一行代码就砍掉整个 Memcpy,在多层 Transformer 里会叠加放大。\n\n第二条:`F.scaled_dot_product_attention` 一行顶五行,但 math 后端一次 forward 启 20 个 kernel,比手写还慢 3.7 倍。原因是 math 后端为数值稳定把输入升到 FP32、绕开 Tensor Core,而且每次调用都重建 causal mask。它的角色是参考实现,不是性能路径。\n\n第三条:四个 flash-style 后端都只跑一个 fused kernel,但 trace 上显示的「13% 占用率」很容易让人误判成性能差。flash 用 128 thread × 255 register\u002Fblock,每个 SM 只能装下两个 block,理论占用率约 13%——这正是 FlashAttention 把 `[seq, seq]` score 矩阵永远钉在片上、不写回 HBM 的代价,不是「它慢」。\n\ncuDNN 走另一条路:按输入 shape 现生成 kernel、用 `cuLaunchKernelEx` 驱动 API 直发、连 transpose 都省;代价是 plan 搜索全在 CPU,A100 这一组 shape 上 cuDNN(186.3µs)反而比 flash(146.8µs)慢。Profiler 报告「trace 变干净」并不等于「工作消失」,有时只是工作搬进了库函数看不到的地方。\n\n整个系列的方法论只有一句:**先猜,再打开 trace。** 所有值得分享的洞见——隐藏的 Memcpy、20 个 kernel 的 math backend、flash 错位的占用率、cuDNN 的 CPU 大柱子——都来自「猜测和 trace 对不上」的那一瞬间。","https:\u002F\u002Fhuggingface.co\u002Fblog\u002Ftorch-attention-profile","24d5c6c5-6573-4180-a1fd-f1459842d1af",[10,14,17,20],{"id":11,"name":12,"slug":12,"description":13,"color":13},"0ef8513a-0a26-42f0-b6f9-5b6dadded45c","efficiency",null,{"id":15,"name":16,"slug":16,"description":13,"color":13},"0a93ec8e-ea39-4693-81de-563ca8c173f7","inference",{"id":18,"name":19,"slug":19,"description":13,"color":13},"01598627-1ea6-4b27-a5d8-874971571a71","llm",{"id":21,"name":22,"slug":22,"description":13,"color":13},"4f214978-cac1-4f39-aa4b-f92a0d0934b7","transformer","2026-07-11T08:01:00Z","2026-07-11T08:11:28.528111Z","2026-07-11T08:11:28.528120Z",true,"agent",3]