Files
enginex-ascend-910-vllm/csrc/attention/sparse_flash_attention/README.md
Sun Ruoxi 7f8a1b1f7a init v0.23.0
Signed-off-by: Sun Ruoxi <sunruoxi@4paradigm.com>
2026-08-27 15:11:51 +08:00

233 lines
9.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SparseFlashAttention
## 产品支持情况
|产品 | 是否支持 |
|:----------------------------|:-----------:|
|<term>Ascend 950PR/Ascend 950DT</term>| √ |
|<term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>| √ |
|<term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>| √ |
|<term>Atlas 200I/500 A2 推理产品</term>| × |
|<term>Atlas 推理系列产品</term>| × |
|<term>Atlas 训练系列产品</term>| × |
## 功能说明
- API功能sparse_flash_attentionSFA是针对大序列长度推理场景的高效注意力计算模块该模块通过“只计算关键部分”大幅减少计算量然而会引入大量的离散访存造成数据搬运时间增加进而影响整体性能。
- 计算公式:
$$
\text{softmax}(\frac{Q@\tilde{K}^T}{\sqrt{d_k}})@\tilde{V}
$$
其中$\tilde{K},\tilde{V}$为基于某种选择算法(如`lightning_indexer`得到的重要性较高的Key和Value一般具有稀疏或分块稀疏的特征$d_k$为$Q,\tilde{K}$每一个头的维度。
本次公布的`sparse_flash_attention`是面向Sparse Attention的全新算子针对离散访存进行了指令缩减及搬运聚合的细致优化。
## 参数说明
<table style="undefined;table-layout: fixed; width: 1080px"><colgroup>
<col style="width: 200px">
<col style="width: 150px">
<col style="width: 480px">
<col style="width: 150px">
<col style="width: 100px">
</colgroup>
<thead>
<tr>
<th>参数名</th>
<th>输入/输出/属性</th>
<th>描述</th>
<th>数据类型</th>
<th>数据格式</th>
</tr></thead>
<tbody>
<tr>
<td>query</td>
<td>输入</td>
<td>attention结构的Query输入不支持空tensor和非连续。layout_query为BSND时shape为(B,S1,N1,D)layout_query为TND时shape为(T1,N1,D)。</td>
<td>FLOAT16、BFLOAT16</td>
<td>ND</td>
</tr>
<tr>
<td>key</td>
<td>输入</td>
<td>attention结构的Key输入不支持空tensor和非连续。layout_kv为PA_BSND时shape为(block_num, block_size, KV_N, D)其中block_num为PageAttention时block总数layout_kv为BSND时shape为(B, S2, KV_N, D)layout_kv为TND时shape为(T2, KV_N, D)。</td>
<td>FLOAT16、BFLOAT16</td>
<td>ND</td>
</tr>
<tr>
<td>value</td>
<td>输入</td>
<td>attention结构的Value输入不支持空tensor和非连续shape与key的shape一致。</td>
<td>FLOAT16、BFLOAT16</td>
<td>ND</td>
</tr>
<tr>
<td>sparseIndices</td>
<td>输入</td>
<td>离散取kvCache的索引不支持空tensor和非连续。sparse_size为一次离散选取的block数需要保证每行有效值均在前半部分、无效值均在后半部分且sparse_size大于0。layout_query为BSND时shape为(B, Q_S, KV_N, sparse_size)layout_query为TND时shape为(Q_T, KV_N, sparse_size)。</td>
<td>INT32</td>
<td>ND</td>
</tr>
<tr>
<td>blockTable</td>
<td>输入</td>
<td>表示PageAttention中kvCache存储使用的block映射表不支持空tensor和非连续。第二维长度不小于所有batch中最大的S2对应的block数量即S2_max / block_size向上取整shape支持(B,S2/block_size)。</td>
<td>INT32</td>
<td>ND</td>
</tr>
<tr>
<td>actualSeqLengthsQuery</td>
<td>输入</td>
<td>表示不同Batch中query的有效token数不支持空tensor和非连续。可传入None表示与query的S长度相同支持长度为B的一维tensor且每个Batch的有效token数不超过query中的维度S大小且不小于0。layout_query为TND时该入参必须传入且以元素数量作为B值每个元素表示当前batch与之前所有batch的token数总和。</td>
<td>INT32</td>
<td>ND</td>
</tr>
<tr>
<td>actualSeqLengthsKv</td>
<td>输入</td>
<td>表示不同Batch中key和value的有效token数不支持空tensor和非连续。可传入None表示与key的S长度相同支持长度为B的一维tensor且每个Batch的有效token数不超过key/value中的维度S大小且不小于0。layout_kv为TND或PA_BSND时该入参必须传入其中layout_kv为TND时每个元素表示当前batch与之前所有batch的token数总和即前缀和因此后一个元素的值必须大于等于前一个元素的值。</td>
<td>INT32</td>
<td>ND</td>
</tr>
<tr>
<td>queryRope</td>
<td>输入</td>
<td>表示MLA结构中的query的rope信息不支持空tensor和非连续。layout_query为TND时shape为(B,S1,N1,Dr)layout_query为BSND时shape为(T1,N1,Dr)。</td>
<td>FLOAT16、BFLOAT16</td>
<td>ND</td>
</tr>
<tr>
<td>keyRope</td>
<td>输入</td>
<td>表示MLA结构中的key的rope信息不支持空tensor和非连续。layout_kv为TND时shape为(B,S1,N1,Dr)layout_kv为BSND时shape为(T1,N1,Dr)layout_kv为PA_BSND时shape为(block_num,block_size,N2,Dr)。</td>
<td>FLOAT16、BFLOAT16</td>
<td>ND</td>
</tr>
<tr>
<td>scaleValue</td>
<td>可选属性</td>
<td>代表缩放系数。</td>
<td>FLOAT16</td>
<td>-</td>
</tr>
<tr>
<td>sparseBlockSize</td>
<td>可选属性</td>
<td>代表sparse阶段的block大小。sparse_block_size为1时为Token-wise稀疏化场景sparse_block_size大于1且小于等于128时为Block-wise稀疏化场景块内token共享相同的稀疏化决策。</td>
<td>INT64</td>
<td>-</td>
</tr>
<tr>
<td>layoutQuery</td>
<td>可选属性</td>
<td>标识输入query的数据排布格式默认值为"BSND"支持传入BSND和TND。</td>
<td>STRING</td>
<td>-</td>
</tr>
<tr>
<td>layoutKv</td>
<td>可选属性</td>
<td>标识输入key的数据排布格式默认值为"BSND"支持传入TND、BSND和PA_BSND其中PA_BSND在使能PageAttention时使用。</td>
<td>STRING</td>
<td>-</td>
</tr>
<tr>
<td>sparseMode</td>
<td>可选属性</td>
<td>表示sparse的模式。sparse_mode为0时代表全部计算sparse_mode为3时代表rightDownCausal模式的mask对应以右下顶点往左上为划分线的下三角场景。</td>
<td>INT64</td>
<td>-</td>
</tr>
<tr>
<td>preTokens</td>
<td>可选属性</td>
<td>用于稀疏计算表示attention需要和前几个Token计算关联仅支持默认值2^63-1。</td>
<td>INT64</td>
<td>-</td>
</tr>
<tr>
<td>nextTokens</td>
<td>可选属性</td>
<td>用于稀疏计算表示attention需要和后几个Token计算关联仅支持默认值2^63-1。</td>
<td>INT64</td>
<td>-</td>
</tr>
<tr>
<td>attentionMode</td>
<td>可选属性</td>
<td>表示attention的模式仅支持传入2表示MLA-absorb模式。</td>
<td>INT64</td>
<td>-</td>
</tr>
<tr>
<td>returnSoftmaxLse</td>
<td>可选属性</td>
<td>用于表示是否返回softmax_max和softmax_sum。True表示返回False表示不返回默认值为False。该参数仅在训练且layout_kv不为PA_BSND场景支持。</td>
<td>BOOL</td>
<td>-</td>
</tr>
<tr>
<td>attentionOut</td>
<td>输出</td>
<td>公式中的输出不支持空tensor和非连续。layout_query为BSND时shape为(B,S1,N1,D)layout_query为TND时shape为(T1,N1,D)。</td>
<td>FLOAT16、BFLOAT16</td>
<td>ND</td>
</tr>
<tr>
<td>softmaxMaxOut</td>
<td>输出</td>
<td>Attention算法对query乘key的结果取max得到softmax_max不支持空tensor和非连续。layout_query为BSND时shape为(B,N2,S1,N1/N2)layout_query为TND时shape为(N2,T1,N1/N2)。</td>
<td>FLOAT</td>
<td>ND</td>
</tr>
<tr>
<td>softmaxSumOut</td>
<td>输出</td>
<td>Attention算法query乘key的结果减去softmax_max后取exp并求sum得到softmax_sum不支持空tensor和非连续。layout_query为BSND时shape为(B,N2,S1,N1/N2)layout_query为TND时shape为(N2,T1,N1/N2)。</td>
<td>FLOAT</td>
<td>ND</td>
</tr>
</tbody>
</table>
## 约束说明
- 该接口支持推理场景下使用。
- 该接口支持图模式。
- N1支持1/2/4/8/16/32/64/128。
- block_size为一个block的token数block_size取值为16的倍数且最大支持1024。
- 参数query中的D和key、value的D值相等为512参数query_rope中的Dr和key_rope的Dr值相等为64。
- 参数query、key、value的数据类型必须保持一致。
- 当前只支持query_rope和key_rope传入不支持rope为空。
- 支持sparse_block_size整除block_size。
- <term>Ascend 950PR/Ascend 950DT</term>
- 只支持sparse_block_size为1。
- <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term><term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>
- 支持[1,128]且要求是2的幂次方在PageAttention场景下要求sparse_block_size整除block_size
## 调用示例
<table class="tg"><thead>
<tr>
<th class="tg-0pky">调用方式</th>
<th class="tg-0pky">样例代码</th>
<th class="tg-0pky">说明</th>
</tr></thead>
<tbody>
<tr>
<td class="tg-9wq8" rowspan="6">aclnn接口</td>
<td class="tg-0pky">
<a href="./examples//test_aclnn_sparse_flash_attention.cpp">test_aclnn_sparse_flash_attention
</a>
</td>
<td class="tg-lboi" rowspan="6">
通过
<a href="./docs/aclnnSparseFlashAttention.md">aclnnSparseFlashAttention
</a>
接口方式调用算子
</td>
</tr>
</tbody></table>