尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

oil-gas-ops-prospect融合注意力算子FusedBiasSoftmax揭秘:3次算子发射合成1个kernel

oil-gas-ops-prospect融合注意力算子FusedBiasSoftmax揭秘:3次算子发射合成1个kernel oil-gas-ops-prospect融合注意力算子FusedBiasSoftmax揭秘3次算子发射合成1个kernel【免费下载链接】oil-gas-ops-prospect面向油气勘探oil gas exploration领域的昇腾自定义算子库。仓名即 oil-gas-ops油气算子 prospect勘探目标面向地震成像、全波形反演等勘探计算场景项目地址: https://gitcode.com/cann/oil-gas-ops-prospectoil-gas-ops-prospect是面向油气勘探领域的昇腾Ascend自定义算子库其中的FusedBiasSoftmax融合算子把注意力前向里常见的两次 bias 累加 一次 softmax共 3 次算子发射合成了1 个 kernel原地写回结果显著减少中间访存与 kernel 发射开销。本文带你读懂它的原理、实现与调用方式。 一分钟看懂FusedBiasSoftmax 算什么数学定义很简单$$y \mathrm{softmax}(x b_1 b_2,\ \mathrm{dim}-1)$$方向名称含义shapedtype输入xlogits[B, H, Q, S]fp32 / fp16 / bf16输入可选bias1可广播偏置如 mask bias[B,H,1,S]或[B,H,Q,S]与x相同输入可选bias2全尺寸偏置如 triangle bias[B,H,Q,S]与x相同输出ysoftmax 概率与x相同与x相同这正是 openfold 结构预测中注意力核心的标准形态logits 先加上mask bias可广播和triangle bias全尺寸再沿最后一维做 softmax。⚡ 为什么要把 3 次发射合成 1 个 kernel在原版 openfold 的attn_core_inplace_cuda.forward_中同样的语义要发射 3 次 kernellogits bias1add 算子logits bias2add 算子logits softmax(logits)in-place softmax每次发射都意味着中间结果写回 HBM主机内存→ 下一次 kernel 再读出来外加 kernel 发射本身的调度开销。而 bias 累加与 softmax 都是逐行独立、计算强度低的访存密集操作单独发射时性能会被访存和 launch 开销主导。FusedBiasSoftmax 的做法是数据进片上 UB 后就不落地——bias 累加、fp32 域 softmax、写回全部在一个 kernel 的流水内完成中间访存被彻底消除。 单 kernel 是怎么实现的实现分为 host 侧切分tiling与 device 侧流水线两部分。Host 侧按行切分预算 UB切分核心算法在 fused_bias_softmax_tiling_core.h逻辑直观按行均分把B*H*Q行均匀分给若干 AIV 核不能整除的余数行交给大核多处理 1 行见ComputeRowSplitUB 预算模型每行要占多少 UB按x 载入 y 写出 非 fp32 中转 bias 载入/中转逐项计价入队张量按 double buffer队列深度 2计两份再为高阶 SoftMax API 预留 32KB32B 对齐行宽S对齐到 32 字节padding 用 0 填充保证向量单元高效搬运dtypes 分发tiling key 取0fp32、1fp16、2bf16kernel 侧据此实例化不同模板。算子注册与约束校验见 FusedBiasSoftmax.cpp要求输入必须是 4D且S width满足1 ≤ S ≤ 4096。Device 侧双缓冲三拍流水线kernel 实现在 FusedBiasSoftmax.h入口为 fused_bias_softmax.cpp主循环是一组经典的三拍流水CopyIn ──→ Compute ──→ CopyOut 双缓冲预取下一拍 fp32 域 Add SoftMax 写回 GMCopyInDataCopyPad把 x 与 bias 行搬运入 UB同时预取下一迭代的数据用队列FBS_QUE_DEPTH 2隐藏搬运延迟广播形态的 bias1 只载入迭代覆盖到的 distinct 行省 UBCompute非 fp32 输入先Cast到 fp32 域bias 逐块Add再调用高阶SoftMaxAPI 完成行归一化——精度上等价于 fp32 累加写回时再Cast回原 dtypeCopyOut结果按原布局写回 GM。因为y与x共享同一块 device 内存原地写回连一份中间 buffer 都省掉了。 Python 调用3 行上手Python 封装在 fused_bias_softmax.py支持 PyTorch autograd 与 CPU 回退import os os.environ[OIL_GAS_OPS_FUSED_BIAS_SOFTMAX_IMPL] ascendc from oil_gas_ops_prospect.fused_bias_softmax import fused_bias_softmax, attention_core x torch.randn(2, 4, 64, 128, dtypetorch.bfloat16, devicenpu) b1 torch.randn(2, 4, 1, 128, dtypetorch.bfloat16, devicenpu) # 广播 b2 torch.randn(2, 4, 64, 128, dtypetorch.bfloat16, devicenpu) # 全尺寸 y fused_bias_softmax(x, b1, b2) # 原地写回 x几个实用细节实现切换环境变量OIL_GAS_OPS_FUSED_BIAS_SOFTMAX_IMPL取值torch默认/ascendc/auto张量不在 NPU 上时自动回退到纯 PyTorch 参考实现CPU 上也能跑通同一套代码attention_core 组合封装attention_core(q, k, v, bias1, bias2)等价 openfold 的AttentionCoreFunction.apply前向走FusedBiasSoftmax反向走配套融合算子FusedSoftmaxGradaclnn 直接调用C 侧接口为aclnnFusedBiasSoftmax样例见 test_aclnn_fused_bias_softmax.cpp。✅ 精度与性能如何验证测试覆盖三层均有现成脚本层级位置内容切分 UT无卡可跑test_fused_bias_softmax_tiling.cpp直接驱动 tiling 核心算法断言行切分与 UB 预算NPU 精度/性能test_fused_bias_softmax_npu.py精度对拍 原地写回断言 别名隔离 性能微基准aclnn 系统测试aclnnFusedBiasSoftmax按cases.json多 shape 循环 launch精度契约fp32max_diff ≤ 1e-5bf16 契约式atol2e-2, rtol4e-3。性能基准对 torch 参考实现逐 case 打印speedupwarmup 5、iter 20覆盖[2,4,64,128]~[8,8,256,256]的典型注意力形状。运行入口bash build.sh -u --st --opsfused_bias_softmax # 多 shape aclnn 系统测试 延伸阅读算子数学定义与约束全文docs/zh/op_list.md接口签名与环境变量docs/zh/api_list.md反向配套算子 FusedSoftmaxGrad 源码ascendc/operators/fused_softmax_grad/算子开发指南想写自己的融合算子docs/zh/develop/operator_development_guide.md想动手跑起来先克隆仓库支持 CANN 9.0.0、Ascend 910Bgit clone https://gitcode.com/cann/oil-gas-ops-prospect.git cd oil-gas-ops-prospect bash build.sh --install一句话总结FusedBiasSoftmax 用host 侧按行切分 device 侧双缓冲三拍流水 fp32 域中间计算三板斧把注意力前向的 3 次 kernel 发射压成 1 次中间数据不落 HBM是昇腾上做访存密集小算子融合的一个标准范式。【免费下载链接】oil-gas-ops-prospect面向油气勘探oil gas exploration领域的昇腾自定义算子库。仓名即 oil-gas-ops油气算子 prospect勘探目标面向地震成像、全波形反演等勘探计算场景项目地址: https://gitcode.com/cann/oil-gas-ops-prospect创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表