Files
enginex-ascend-910-vllm/csrc/attention/lightning_indexer/README.md

270 lines
8.9 KiB
Markdown
Raw Normal View History

# 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>