
当大模型上下文长度突破 128K 甚至更高时,稀疏注意力(Sparse Attention)架构成为平衡性能与效果的关键。而这一切的基石,恰恰是底层算子的效率突破。在 DeepSeek 等长序列模型中,Lightning Indexer 算子(“闪电索引器”)承担着从超长序列中快速定位关键 tokens的核心任务,其执行效率直接决定了稀疏注意力的落地可行性。许多开发者在模型部署时会发现:参数规模、上下文长度的提升相对容易,但算子的调度策略、访存优化和硬件适配能力才是制约推理吞吐量与延迟的真正瓶颈。

本文将深入解读 Lightning Indexer 算子的设计原理与关键执行路径,拆解其在长序列场景下的性能优化实践,为算子开发者和长序列模型优化工程师提供可落地的技术参考。
我是 Fanstuck,专注于大模型底层技术拆解与落地实践分享。如果您关注算子优化、长序列模型部署或 AI 系统性能调优,欢迎关注交流。
Lightning Indexer(闪电索引器)是长上下文 DeepSeek Sparse Attention (DSA) 架构中的关键组件,负责在超长序列中以极低的计算开销快速筛选出对当前查询 token 最相关的一小部分上下文 tokens。
它的工作流程包括两个阶段:首先,Lightning Indexer 扮演模型的“快速索引器”,为每个查询 token 计算其与所有历史上下文 token 的相关性分数;然后采用 Top-K 策略筛选出得分最高的 K 个候选 token。

接下来,模型仅对这 K 个经过筛选的关键 token 执行精细的注意力计算,将注意力计算复杂度从原来的 降低为 (其中 ),显著减少计算量。由于每一步只关注极少数关键内容,Lightning Indexer + Top-K 机制能够跳过大量无关信息,使长序列推理的计算成本大幅下降。据报道,引入这一机制后,128K 长上下文推理的开销降低约 50%,且模型精度几乎没有损失完成最终推理。
值得注意的是,Lightning Indexer 是 DeepSeek-V3.2-Exp 模型中实现这一突破的“闪电级”索引模块,也是 DSA 稀疏注意力架构的核心组成之一。它与细粒度 Token 选择机制相配合,在几乎不影响模型输出效果的前提下,实现了长文本训练和推理效率的大幅提升。Lightning Indexer 以极小的计算代价从超长序列中定位关键信息,为后续完整注意力计算减负提速,被视为迈向新一代长序列架构的关键一步。
Lightning Indexer 在 DSA 稀疏注意力中负责快速扫描整个超长上下文(例如 128K tokens),为每个查询 token 计算一个简化的索引分数,并选出 Top-K 的键值对供后续注意力使用。
/**
* This program is free software, you can redistribute it and/or modify it.
* Copyright (c) 2025 Huawei Technologies Co., Ltd.
* This file is a part of the CANN Open Software.
* Licensed under CANN Open Software License Agreement Version 2.0 (the "License").
* Please refer to the License for details. You may not use this file except in compliance with the License.
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
* See LICENSE in the root of the software repository for the full text of the License.
*/
/*!
* \file lightning_indexer.cpp
* \brief
*/
#include "kernel_operator.h"
#include "lib/matmul_intf.h"
#include "lightning_indexer_template_tiling_key.h"
#include "lightning_indexer_kernel.h"
using namespace LIKernel;
#define INVOKE_LI_NO_KFC_OP_IMPL(templateClass, ...) \
do { \
templateClass<LIType<__VA_ARGS__>> op; \
LI_COPY_TILING_DATA(LITilingData, tiling); \
op.Init(query, key, weights, actualSeqLengthsQ, actualSeqLengths, blocktable, sparseIndices, user, \
tiling_data, &tPipe); \
op.Process(); \
} while (0)
#define LI_COPY_TILING_DATA(tilingDataStruct, tiling) \
GET_TILING_DATA_WITH_STRUCT(tilingDataStruct, tiling_data_in, tiling); \
const tilingDataStruct *__restrict tiling_data = &tiling_data_in;
template <int DT_Q, int DT_K, int DT_OUT, int PAGE_ATTENTION, int LAYOUT_T, int K_LAYOUT_T>
__global__ __aicore__ void lightning_indexer(__gm__ uint8_t *query, __gm__ uint8_t *key, __gm__ uint8_t *weights,
__gm__ uint8_t *actualSeqLengthsQ, __gm__ uint8_t *actualSeqLengths,
__gm__ uint8_t *blocktable, __gm__ uint8_t *sparseIndices,
__gm__ uint8_t *workspace, __gm__ uint8_t *tiling)
{
#if (__CCE_AICORE__ == 310) || (defined __DAV_310R6__) || (__CCE_AICORE__ == 200)
#else
TPipe tPipe;
__gm__ uint8_t *user = GetUserWorkspace(workspace);
KERNEL_TASK_TYPE_DEFAULT(KERNEL_TYPE_MIX_AIC_1_2);
if constexpr (DT_Q == LI_TPL_FP16 && DT_K == LI_TPL_FP16 && DT_OUT == LI_TPL_INT32) {
INVOKE_LI_NO_KFC_OP_IMPL(LIPreload, half, half, int32_t, PAGE_ATTENTION,
LI_LAYOUT(LAYOUT_T), LI_LAYOUT(K_LAYOUT_T));
} else {
INVOKE_LI_NO_KFC_OP_IMPL(LIPreload, bfloat16_t, bfloat16_t, int32_t, PAGE_ATTENTION,
LI_LAYOUT(LAYOUT_T), LI_LAYOUT(K_LAYOUT_T));
}
#endif
}
下图(图1绿色区域)展示了 Lightning Indexer 的作用:输入序列隐状态 首先经过 Lightning Indexer 路径,提取出低维的索引查询向量 以及每个上下文 token 的索引键向量 (通过独立的线性投影层获得)。Lightning Indexer 对所有历史 token 计算查询与键的相关性得分,然后通过 Top-K 选择模块从所有键值对 中挑选出分数最高的 K 个候选。只有这 K 个候选键值对会送入后面的核心注意力(多查询注意力)计算,显著减少了参与完整注意力运算的 token 数量。

总的来说,Lightning Indexer 扮演着模型的“快速过滤器”角色——它以极低的计算开销(近似线性扫描)从超长序列中定位关键信息,为后续复杂的注意力计算大幅减负提速。官方技术报告显示,在128K长度上下文下引入该机制后,长序列推理首 token 输出延迟(TTFT)可维持在2秒以内,每产生一个新 token 的逐 token 输出延迟(TPOT)约为30毫秒。这表明 Lightning Indexer + Top-K 的策略在几乎不损失模型效果的情况下,实现了长文本推理实用且巨大的加速效果。
Lightning Indexer 的高效性来自于其定制算子的巧妙设计和实现。该算子在架构上被实现为一个融合 Kernel,将相关性打分和Top-K筛选等步骤合并在一起,通过深度优化实现端到端的快速筛选。 尤其是在华为昇腾 NPU 上,Lightning Indexer 算子充分利用了Cube 矩阵运算核和Vector 向量运算核的协同工作,将算法思路映射为高性能代码。其基本计算流程包括:首先,对当前查询token和所有历史token的简化表示向量进行点积相关性计算,然后对所得分数进行激活变换和排序筛选,最终输出Top-K索引结果。 这一流程在算子内部被划分为矩阵乘法和排序筛选两大部分,由Cube核和Vector核分别加速完成。具体而言:
计算阶段 | 核心任务 | 硬件核分工 | 技术优势 |
|---|---|---|---|
相关性打分 | 查询向量与键向量批量点积计算 | Cube 核 | 擅长大规模矩阵乘累加,高吞吐并行 |
激活与 Top-K 筛选 | ReLU 激活(负分置零)+ 部分排序 | Vector 核 | 擅长标量操作、条件判断,适配筛选逻辑 |
Lightning Indexer为每个查询维护一个低维度的索引查询向量 q^I(通过查询token投影获得)以及每个上下文token的索引键向量 k^I(通过上下文token投影获得)。这些向量维度被设计得远小于模型隐藏层维度,并且索引器的头数也很少,从而极大减少计算量。
相关性分数计算完成后,算子会对分数应用一个简单的激活函数 ReLU(Rectified Linear Unit)。选择ReLU的原因在于其计算开销极低——只需一次阈值比较即可完成,而不需要Softmax那样的全局归一化。 经过ReLU处理后,所有负相关性分数被置零,只保留正相关的token分数。接下来,由Vector向量核承担Top-K排序选择的任务:它需要从数以万计的候选token分数中找出数值最大的K个。Lightning Indexer算子在这里通过定制的部分排序算法(如堆选或者分块并行排序)实现高效的Top-K提取。

Vector核擅长各种标量操作和条件判断,因此被用来实现分块排序和筛选比较等逻辑。在实现中,通常将大数组按片划分,由Vector核对每片数据先行找到局部Top-K,然后逐步合并各片结果,最终得到全局Top-K列表。这一系列操作都封装在Lightning Indexer融合算子内部完成,直接输出Top-K的索引和值。不需额外的算子调用或数据搬运,大幅减少了开销。 需要强调的是,Lightning Indexer 本身是模型架构创新带来的独立技术点,并非 PyPTO 所特有;PyPTO 只是作为开发手段,使其高效地映射到硬件。最终,Lightning Indexer 作为一个融合算子已在昇腾 CANN 平台上开源实现,供算子开发者参考。
要深入理解 Lightning Indexer 算子的性能优化,需要剖析其在超长序列(如128K token)处理时的关键执行路径。面对如此庞大的序列长度,算子必须解决两个核心问题:如何高效地遍历计算海量分数,以及如何快速选出Top-K。Lightning Indexer 算子采用了分块处理(Tiling)+ 流水并行的方案来实现这一目标。 首先是分块计算策略。直接对128K长度序列一次性计算相关性分数并排序不仅需要巨大的片上存储空间,还会导致计算核长时间空闲等待。因此,Lightning Indexer 将整个序列按长度切分为若干Tile块(例如每次处理几千个token)。算子每次加载一个Tile的键向量数据到片上缓冲区,在Cube核上完成该Tile内所有token的点积打分。

这样做的好处是:每个Tile的数据量受控,可以放入片上高速缓存反复利用,避免频繁访存;同时Tile的大小可以根据Cube核计算吞吐和Vector核排序开销来折中选择,以实现后述的流水线均衡。 接下来是Top-K排序的流水实现。当Cube核在计算当前Tile的分数时,上一Tile的分数已经在Vector核上开始进行Top-K筛选,而下一Tile的数据也可同时从HBM主存加载到片上缓冲。这种三段流水让数据搬运、矩阵计算、排序筛选三个阶段彼此重叠并行,提高了硬件资源利用率。 具体而言:算子维护两个分数缓冲区作为双缓冲,Cube核交替将计算所得分数写入缓冲A/B;Vector核则和Cube核错开工作节奏,在Cube处理Tile_n时并行从缓冲区中读取Tile{n-1}的分数执行排序;与此同时,DMA控制器预取Tile{n+1}的键数据。这种Cube/Vector/访存三方流水线确保了在任意时刻,Cube矩阵核和Vector向量核都有工作在进行,尽可能消除空闲等待。

尤其在Top-K排序阶段,Lightning Indexer 算子通过局部Top-K合并算法降低单次排序的数据量(例如先在每个Tile内选出Top-K,再逐步归并),进一步减少了Vector核的串行比较开销。整套流程设计保证了即使面对128K这样极端长度的序列,算子也能以接近线性的开销完成重要token的筛选。

在优化前,Lightning Indexer 算子在长序列场景下存在以下性能瓶颈:
瓶颈类型 | 核心表现 | 对性能的影响 |
|---|---|---|
内存访存开销 | 128K 序列全量加载,HBM 带宽压力大,片上缓存溢出 | 计算核等待数据,访存成为主要延迟来源 |
排序阶段并行效率低 | 全局 Top-K 排序复杂度 O (L log L),Vector 核未充分利用 | 排序耗时远超计算,拖累整体吞吐 |
计算 / 排序不平衡 | Cube 核计算快、Vector 核筛选慢(或反之) | 流水线停滞,单一核闲置等待 |
算子调用与数据复用不足 | 量化、计算、筛选分拆为多个算子,中间数据反复读写 | 额外调度开销 + 内存 IO 延迟叠加 |

需要遍历超长序列的所有token以计算相关性分数,意味着大量的数据搬运。若直接对128K长度一次性计算,需从HBM加载海量键向量,对内存带宽和片上缓冲都是巨大压力。访存延迟可能使高速计算单元等待数据,从而内存IO成为瓶颈。
在获取所有 L 个分数后执行全局Top-K选择,如果采用简单排序或逐一比较,时间复杂度接近 O(L \log L)。对于几十万规模的元素,这是非常耗时的,而且传统排序难以充分利用向量化并行指令,Vector核可能运行效率低,拖累整体性能。
相关性计算由Cube核完成,排序筛选由Vector核完成。如果两部分耗时相差悬殊,就会造成流水线停滞。例如,若Cube核用极短时间算出所有分数,而Vector核花较长时间排序,Cube核将闲置等待;反之亦然。这种Cube和Vector核利用率不均衡会降低算子整体吞吐。
如果索引器的量化、计算、筛选由多个独立算子完成,每一步都需读写内存,中间结果无法复用,将引入额外的开销和延迟。 通过架构分析和早期的性能监测,上述瓶颈在初版实现中都有不同程度体现。例如,在没有特别优化时,计算128K序列索引分数可能导致片上缓存反复溢出到外存,Cube核短暂运行后需等待数据加载;而一次性对128K分数排序往往耗时远超计算阶段,成为主要延迟来源。Cube与Vector的执行没有重叠,则两者总有一个处于等待状态。识别这些瓶颈,为后续有针对性的优化提供了方向。
针对上述瓶颈,昇腾CANN进行了多层次的优化实践,极大提升了 Lightning Indexer 算子的性能。
将超长输入序列按一定长度切分为小块逐批处理,以适配片上存储和计算资源。通过选取合适的Tile大小(兼顾Cube核算力和Vector核排序能力),每块数据能完全缓存在片上SRAM/UB中,被Cube核高效地反复访问计算。这样大幅降低了HBM访存频率,提高了数据局部性和重用率。例如,如果每次处理B个token,则每个token的键向量只需要从内存加载一次,之后在Cube核计算多个查询时可重复使用。实践证明,合理的Tiling可以将内存带宽瓶颈显著缓解,使得Cube核不再长时间因等待数据而闲置。

通过精细的调度实现Cube计算阶段与Vector筛选阶段的重叠执行。。具体做法是采用双缓冲和异步调度:当处理Tile_i时预取Tile_{i+1}的数据,当Cube核处理Tile_i分数计算的同时,启动Vector核对Tile_{i-1}的Top-K选择。如此确保两类运算单元同时工作,各自消化不同阶段的任务。这种流水线并行使得Cube和Vector核利用率达到均衡,彼此之间几乎没有等待。从性能曲线看,优化后两部分耗时趋于重叠,算子总执行时间接近二者中的较大者,而非简单相加。此外,流水线还掩盖了一部分数据传输延迟,实现计算和通信重叠,进一步提高了整体效率。

将原本分开的多个操作尽量合并到单个算子内核中执行,减少算子调用开销和中间数据存取。一个典型案例是将 BF16/FP16 量化转换与相关性矩阵乘法融合:Cube 核读取键向量时直接按 BF16 低精度执行乘积累加,不需要先调用一个专门的量化算子再进行矩阵乘。这种融合使数据只读取一次就完成全部计算,避免了多余的格式转换和内存写读。
同样地,Lightning Indexer 本身被实现为一个从输入到输出 Top-K 全流程融合的算子,取代了可能的“GEMM算子 + 激活算子 + TopK算子”链条,实现一次内核启动完成所有工作。这不仅节省了调度开销,也充分利用了片上数据,避免了反复写回和读出的延迟。
针对昇腾硬件架构的特点进行了多项微优化。例如,充分利用 Cube 核的 BF16/INT8 低精度矩阵指令以提升算术吞吐率;利用 Vector 核的掩码寄存器和 SIMD 指令实现高效的小规模并行比较,加速 Top-K 合并过程;
经过以上优化,Lightning Indexer 算子的性能获得了显著提升。优化前后性能对比显示:在 128K 长序列的推理场景下,融合算子将端到端延迟大幅降低、吞吐率成倍提升。
对于算子开发者而言,其中的经验——如分块处理、流水重叠、融合内核以及针对性利用硬件特性等——都具有很高的参考价值。DeepSeek-V3.2-Exp 的实践为业界提供了宝贵范例,证明通过软硬件结合的创新,我们可以大幅拓展大模型的上下文能力边界,在长文本处理上实现性能与效果的双赢。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。