news 2026/7/16 17:12:03

CANN/ops-transformer: BSA块稀疏掩码选择算子

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN/ops-transformer: BSA块稀疏掩码选择算子

BSASelectBlockMask

【免费下载链接】ops-transformer本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-transformer

产品支持情况

产品是否支持
Ascend 950PR/Ascend 950DT
Atlas A3训练系列产品
Atlas A3推理系列产品
Atlas A2训练系列产品
Atlas A2推理系列产品
Atlas 200I/500 A2推理产品×
Atlas推理系列产品×
Atlas训练系列产品×

功能说明

  • 算子功能:aclnnBSASelectBlockMask是BSA(BlockSparseAttention)的前置算子,负责根据Query和Key的内容动态生成blockSparseMask,使BSA的调用链从"手动提供掩码"变为"根据Q/K内容自适应选择稀疏模式"。

  • 计算公式:

    设blockShape = [blockShapeX, blockShapeY],Sq是query最大序列长度,Skv是key最大序列长度, 则压缩后块数:

    $$ Xblocks = \lceil Sq / blockShapeX \rceil,\quad Yblocks = \lceil Skv / blockShapeY \rceil $$

    Step1:均值池化压缩 (Mean Pooling Compression)

    当actualBlockLenQuery / actualBlockLenKey为null时(完整压缩):

    $$ q_compressed[b, n, x, d] = \frac{1}{blockShapeX} \sum_{i=0}^{blockShapeX-1} query[b, n, x \cdot blockShapeX + i, d] $$

    $$ k_compressed[b, n, y, d] = \frac{1}{blockShapeY} \sum_{j=0}^{blockShapeY-1} key[b, n, y \cdot blockShapeY + j, d] $$

    当actualBlockLenQuery / actualBlockLenKey非null时(部分压缩),仅对每个block内前actualBlockLen个token取均值:

    $$ q_compressed[b, n, x, d] = \frac{1}{actualBlockLenQ[b,x]} \sum_{i=0}^{actualBlockLenQ[b,x]-1} query[b, n, x \cdot blockShapeX + i, d] $$

    $$ k_compressed[b, n, y, d] = \frac{1}{actualBlockLenK[b,y]} \sum_{j=0}^{actualBlockLenK[b,y]-1} key[b, n, y \cdot blockShapeY + j, d] $$

    Step2a:QK Matmul

    $$ score[b, n, x, y] = scale \cdot \sum_{d=0}^{D-1} q_compressed[b, n, x, d] \cdot k_compressed[b, n, y, d] $$

    Step2b:Softmax

    $$ attn_score[b, n, x, y] = softmax(score[b, n, x, :]) = \frac{\exp(score[b, n, x, y] - m_{final})}{l_{final}} $$

    Step3:TopK选择生成索引

    $$ topk_value = \text{round}(sparsity \times Xblocks \times Yblocks) $$

    $$ \mathcal{indices}= \text{TopK}\left(attn_score[b, n, x, y],; topK_value\right) $$

    其中indices为attn_score[b, n, x, y]中topk_value个最大值对应的索引集合。

    Step4:生成BlockSparseMask$$ blockSparseMaskOut[b, n, x, y] = \begin{cases} 1 & (b, n, x, y) \in \mathcal{indices} \ 0 & (b, n, x, y) \notin \mathcal{indices} \end{cases} $$

  • 数据排布格式:

    BSASelectBlockMask输入query、key的数据排布格式支持从多种维度排布解读,可通过queryLayout和keyLayout传入。为了方便理解后续支持的具体排布格式(如BNSD、TND等),此处先对排布格式中各缩写字母所代表的维度含义进行统一说明:

    • B:表示输入样本批量大小(Batch)
    • T:B和S合轴紧密排列的长度(Total tokens)
    • S:表示输入样本序列长度(Seq-Length)
    • H:表示隐藏层的大小(Head-Size)
    • N:表示多头数(Head-Num)
    • D:表示隐藏层最小的单元尺寸,需满足D = H / N(Head-Dim)
  • 当前支持的布局:

    • queryLayout: "TND" "BNSD"
    • keyLayout: "TND" "BNSD"

参数说明

参数名输入/输出/属性描述数据类型数据格式
query输入注意力计算中的query矩阵,即公式中的queryFLOAT16、BFLOAT16ND
key输入注意力计算中的key矩阵,即公式中的key数据类型与query保持一致ND
block_shape输入稀疏块形状数组,指定每个稀疏块的二维尺寸(行数和列数),即公式中的blockShapeINT64-
post_block_shape输入预留参数,用于Softmax后二次压缩。--
actual_seq_lengths输入每个batch的query的实际序列长度。INT64-
actual_seq_lengths_kv输入key的实际序列长度。INT64-
actual_block_len_query输入每个query block内实际压缩的有效seq长度,用于部分压缩场景, 即公式中的actualBlockLenQueryINT64-
actual_block_len_key输入每个key block内实际压缩的有效seq长度,用于部分压缩场景, 即公式中的actualBlockLenKeyINT64-
q_input_layout输入query的数据排布格式。指示输入张量在内存中的具体排布。String-
kv_input_layout输入key的数据排布格式。指示输入张量在内存中的具体排布。String-
num_key_value_heads输入key的注意力头数。Int-
scale_value输入缩放系数,即公式中的scaleFloat-
sparsity输入稀疏度保留比例。指定公式中attn_score中需要保留的块位置占全部块位置的比例。取值范围(0.0, 1.0)。Float-
block_sparse_mask_out输出块状稀疏掩码输出,即公式中的blockSparseMaskOutINT8ND

约束说明

  • actual_seq_lengths在queryLayout为"TND"时必选;actual_seq_lengths_kv在keyLayout为"TND"时必选。
  • 根据算子支持的输入Layout,query张量Shape中对应的head维度大小记为N1,key张量Shape中对应的head维度大小记为N2。必须满足N1 = N2(仅支持MHA)。
  • headDim = 128。
  • blockShapeX和blockShapeY必须为64的倍数。
  • query和key压缩后,query和key对应的Xblocks和Yblocks需满足Xblocks * Yblocks > 1。
  • query和key的数据类型必须一致,仅支持FLOAT16和BFLOAT16。
  • block_sparse_mask_out数据类型为INT8(二值:0或1)。
  • post_block_shape当前不支持,必须传入nullptr。
  • actual_block_len_query / actual_block_len_key若非null,每个元素取值范围[0, blockShapeX] / [0, blockShapeY];为null时完整压缩。

调用说明

调用方式调用样例说明
aclnn APItest_aclnn_bsa_select_block_mask只支持MHA和格式为TND\BNSD的场景,通过aclnnBSASelectBlockMask接口方式调用BSASelectBlockMask算子。

【免费下载链接】ops-transformer本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-transformer

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/16 17:06:17

终极免费RAM清理工具:三步让你的Windows重获新生

终极免费RAM清理工具:三步让你的Windows重获新生 【免费下载链接】WinMemoryCleaner This free RAM cleaner uses native Windows features to optimize memory areas. Its a compact, portable, and smart application. 项目地址: https://gitcode.com/gh_mirror…

作者头像 李华
网站建设 2026/7/16 17:05:21

Alipay Ruby Gem安全指南:RSA/RSA2签名验证原理与实现细节

Alipay Ruby Gem安全指南:RSA/RSA2签名验证原理与实现细节 【免费下载链接】alipay Unofficial alipay ruby gem 项目地址: https://gitcode.com/gh_mirrors/alipa/alipay 在支付宝支付集成中,RSA和RSA2签名验证是保障交易安全的核心机制。Alipay…

作者头像 李华
网站建设 2026/7/16 17:03:06

CS Demo Manager深度解析:从零开始的CS比赛分析革命

CS Demo Manager深度解析:从零开始的CS比赛分析革命 【免费下载链接】cs-demo-manager Companion application for your Counter-Strike demos. 项目地址: https://gitcode.com/gh_mirrors/cs/cs-demo-manager 一场比赛改变一切:CS玩家的真实痛点…

作者头像 李华
网站建设 2026/7/16 17:02:50

暗黑破坏神2存档编辑终极指南:5分钟掌握d2s-editor完整教程

暗黑破坏神2存档编辑终极指南:5分钟掌握d2s-editor完整教程 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 你是否曾经想过自定义暗黑破坏神2的角色属性?是否希望快速测试不同的装备组合?d2s-…

作者头像 李华
网站建设 2026/7/16 17:02:16

从3D模型到动画输出需要哪些步骤?从静态模型到可动资产的完整流程

从3D模型到动画输出,通常需要经过模型检查、骨骼绑定、动作来源选择、动作应用、动画预览、必要调整和格式导出。3D模型本身只是静态资产,只有完成骨骼绑定并接入动作数据后,才能变成可播放、可导出、可继续编辑的动画内容。对个人创作者、小…

作者头像 李华
网站建设 2026/7/16 17:01:57

Sherlock深度配置教程:从零开始定制你的完美应用启动器体验

Sherlock深度配置教程:从零开始定制你的完美应用启动器体验 【免费下载链接】sherlock A versatile application/command launcher for wayland. Built with rust and gtk4 项目地址: https://gitcode.com/gh_mirrors/sherlock30/sherlock Sherlock是一款为W…

作者头像 李华