Files
enginex-ascend-910-vllm/csrc/attention/lightning_indexer/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

270 lines
8.9 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.

# LightningIndexer
## 产品支持情况
|产品 | 是否支持 |
|:----------------------------|:-----------:|
|<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>| × |
## 功能说明
- 算子功能:`lightning_indexer`基于一系列操作得到每一个token对应的Top-$k$个位置。
- 计算公式:
$$
Indices=\text{Top-}k\left\{[1]_{1\times g}@\left[(W@[1]_{1\times S_{k}})\odot\text{ReLU}\left(Q_{index}@K_{index}^T\right)\right]\right\}
$$
对于某个token对应的Index Query $Q_{index}\in\R^{g\times d}$给定上下文Index Key $K_{index}\in\R^{S_{k}\times d},W\in\R^{g\times 1}$,其中$g$为GQA对应的group size$d$为每一个头的维度,$S_{k}$是上下文的长度。
## 参数说明
<table style="undefined;table-layout: fixed; width: 1080px"><colgroup>
<col style="width: 200px">
<col style="width: 150px">
<col style="width: 480px">
<col style="width: 200px">
<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>
<ul>
<li>公式中的输入Q。</li>
<li>不支持空tensor和非连续。</li>
<li>layout_query为BSND时shape为(B,S1,N1,D)layout_query为TND时shape为(T1,N1,D)。</li>
</ul>
</td>
<td>FLOAT16、BFLOAT16</td>
<td>ND</td>
</tr>
<tr>
<td>key</td>
<td>输入</td>
<td>
<ul>
<li>公式中的输入K。</li>
<li>不支持空tensor和非连续。</li>
<li>layout_key为PA_BSND时shape为(block_num, block_size, N2, D)其中block_num为PageAttention时block总数、block_size为一个block的token数layout_key为BSND时shape为(B, S2, N2, D)layout_key为TND时shape为(T2, N2, D)。</li>
</ul>
</td>
<td>FLOAT16、BFLOAT16</td>
<td>ND</td>
</tr>
<tr>
<td>weights</td>
<td>输入</td>
<td>
<ul>
<li>公式中的输入W。</li>
<li>不支持空tensor和非连续。</li>
<li>layout_query为BSND时shape为(B,S1,N1)layout_query为TND时shape为(T1,N1)。</li>
</ul>
</td>
<td>FLOAT16、BFLOAT16、FLOAT</td>
<td>ND</td>
</tr>
<tr>
<td>actual_seq_lengths_query</td>
<td>输入</td>
<td>
<ul>
<li>每个Batch中Query的有效token数。</li>
<li>不支持空tensor和非连续。</li>
<li>可传入None表示与query的S长度相同。</li>
<li>支持长度为B的一维tensor且每个Batch的有效token数不超过query中的维度S大小且不小于0。layout_query为TND时该入参必须传入并以元素数量作为B值。</li>
<li>每个元素表示当前batch与之前所有batch的token数总和即前缀和因此后一个元素的值必须大于等于前一个元素的值。</li>
</ul>
</td>
<td>INT32</td>
<td>ND</td>
</tr>
<tr>
<td>actual_seq_lengths_key</td>
<td>输入</td>
<td>
<ul>
<li>每个Batch中Key的有效token数。</li>
<li>不支持空tensor和非连续。</li>
<li>可传入None表示与key的S长度相同。</li>
<li>支持长度为B的一维tensor且每个Batch的有效token数不超过key/value中的维度S大小且不小于0。</li>
<li>layout_key为TND或PA_BSND时该入参必须传入其中layout_key为TND时每个元素表示当前batch与之前所有batch的token数总和即前缀和因此后一个元素的值必须大于等于前一个元素的值。</li>
</ul>
</td>
<td>INT32</td>
<td>ND</td>
</tr>
<tr>
<td>block_table</td>
<td>输入</td>
<td>
<ul>
<li>表示PageAttention中KV存储使用的block映射表。</li>
<li>不支持空tensor和非连续。</li>
<li>PageAttention场景下block_table必须为二维第一维长度需要等于B第二维长度不能小于maxBlockNumPerSeq每个batch中最大actual_seq_lengths_key对应的block数量</li>
<li>shape支持(B,S2/block_size)。</li>
</ul>
</td>
<td>INT32</td>
<td>ND</td>
</tr>
<tr>
<td>layout_query</td>
<td>属性</td>
<td>
<ul>
<li>用于标识输入Query的数据排布格式。</li>
<li>默认值为"BSND"当前支持BSND、TND。</li>
</ul>
</td>
<td>STRING</td>
<td>-</td>
</tr>
<tr>
<td>layout_key</td>
<td>属性</td>
<td>
<ul>
<li>用于标识输入Key的数据排布格式。</li>
<li>默认值为"BSND"当前支持PA_BSND、BSND、TND。</li>
</ul>
</td>
<td>STRING</td>
<td>-</td>
</tr>
<tr>
<td>sparse_count</td>
<td>属性</td>
<td>
<ul>
<li>topK阶段需要保留的block数量。</li>
<li>支持[1, 2048]以及3072、4096、5120、6144、7168、8192。</li>
<li>默认值为2048。</li>
</ul>
</td>
<td>INT32</td>
<td>-</td>
</tr>
<tr>
<td>sparse_mode</td>
<td>属性</td>
<td>
<ul>
<li>表示sparse的模式。</li>
<li>sparse_mode为0时代表defaultMask模式。</li>
<li>sparse_mode为3时代表rightDownCausal模式的mask对应以右顶点为划分的下三角场景。</li>
<li>默认值为3。</li>
</ul>
</td>
<td>INT32</td>
<td>-</td>
</tr>
<tr>
<td>pre_tokens</td>
<td>属性</td>
<td>用于稀疏计算表示attention需要和前几个Token计算关联仅支持默认值2^63-1。</td>
<td>INT64</td>
<td>-</td>
</tr>
<tr>
<td>next_tokens</td>
<td>属性</td>
<td>用于稀疏计算表示attention需要和后几个Token计算关联仅支持默认值2^63-1。</td>
<td>INT64</td>
<td>-</td>
</tr>
<tr>
<td>return_values</td>
<td>属性</td>
<td>
<ul>
<li>表示是否输出sparseValuesOut。</li>
<li>True表示输出False表示不输出默认值为False。仅在训练且layout_key不为PA_BSND场景支持。</li>
</ul>
</td>
<td>BOOL</td>
<td>-</td>
</tr>
<tr>
<td>sparse_indices</td>
<td>输出</td>
<td>
<ul>
<li>公式中的Indices输出。</li>
<li>不支持空tensor和非连续。</li>
<li>layout_query为BSND时输出shape为[B, S1, N2, sparseCount]layout_query为TND时输出shape为[T1, N2, sparseCount]。</li>
</ul>
</td>
<td>INT32</td>
<td>-</td>
</tr>
<tr>
<td>sparse_values</td>
<td>输出</td>
<td>
<ul>
<li>公式中的Indices输出对应的value值。</li>
<li>不支持空tensor和非连续。</li>
<li>shape与sparseIndicesOut保持一致。</li>
</ul>
</td>
<td>FLOAT16、BFLOAT16</td>
<td>ND</td>
</tr>
</tbody>
</table>
## 约束说明
- 该接口支持图模式。
- 参数key中的N2支持1。
- headdim支持128。
- block_size取值为16的倍数最大支持1024。
- 参数query、key的数据类型应保持一致。
- 参数weights不为`float32`参数query、key、weights的数据类型应保持一致。
- Ascend 950PR/Ascend 950DT
- query N1仅支持8、16、24、32、64。
- 参数weights不支持`float32`类型。
- A3 训练系列产品/Atlas A3 推理系列产品:
- query N1支持小于等于64。
## 调用示例
<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_lightning_indexer.cpp">test_aclnn_lightning_indexer
</a>
</td>
<td class="tg-lboi" rowspan="6">
通过
<a href="./docs/aclnnLightningIndexer.md">aclnnLightningIndexer
</a>
接口方式调用算子
</td>
</tr>
</tbody></table>