01 · 先区分权重稀疏和Attention稀疏
| 稀疏对象 | 省什么 | 语义问题 |
|---|---|---|
| 权重矩阵 | 在特定格式下跳过零权重乘法,减少部分存储 | 把非零权重剪成零,通常改变模型。 |
| Attention连接 | 只计算允许的query/key位置或块 | 原生滑窗保持该模型定义;裁掉稠密模型历史会改变输出。 |
| 动态选择的位置 | 按规则挑选token或块 | 选择成本、质量变化和动态元数据也要计入。 |
两种稀疏需要不同数据格式和内核。“矩阵里有很多零”或“mask挡掉很多位置”只描述结果,不能证明设备跳过了这些运算。
依据:PyTorch · 2:4半结构稀疏、剪枝与推理 ↗ · PyTorch · FlexAttention与BlockMask作者讲解(2024) ↗
02 · 2:4权重:保留数值,同时记录位置
自设输入x=[1,2,3,4],稀疏权重w=[2,0,3,0]。稠密点积仍能做4次乘法,结果11;保存非零值[2,3]及位置[0,2],只做2次乘法也得到11。省算针对同一组已稀疏权重。
若原权重是[2,0.5,3,1],输出为16,把两项变零后输出11。因此剪枝产生的模型变化与稀疏内核对剪后权重的等价执行,是两个步骤。
对每组4个权重保留符合格式的2项
保存数值 + 位置元数据
执行支持该模式的稀疏矩阵内核
# 分组方向、布局、shape、dtype和设备能力依接口规定。2:4半结构稀疏以固定小组限制零的位置,便于硬件识别;任意50%零分布不一定满足格式。位置元数据和对齐占用空间,不能把“半数非零”直接算成所有相关内存都减半。训练时还要管理mask、梯度和优化器状态,推理支持也不等于全部反向自动提速。
03 · 滑窗Attention只看最近哪些位置
本篇定义因果窗口W包含当前token:位置i可看max(0,i−W+1)到i,不能看未来。不同实现对window参数的左右边界定义可能不同,接入时先转换成明确的可见性条件。
自设8个位置,W=3:位置0看[0],位置1看[0,1],位置2看[0,1,2],位置7看[5,6,7]。有效query/key对为1+2+3×6=21;完整因果Attention为1+2+…+8=36。
allowed(i,j) = (j <= i) and (j >= i-W+1)
只在allowed的位置算QK点积
Softmax只对这些位置归一化
按这些位置的V求输出长度N大于等于W时,有效对数为NW−W(W−1)/2,随N近似线性增长;完整因果对数N(N+1)/2是平方增长。这里只计Attention连接,Linear、FFN、输出投影等工作并未一同消失。
04 · mask不等于跳块:tile边界有余量
设备常按整块计算。若一个query/key块全部不可见,可以跳过;若块内只有一部分可见,仍可能执行块级矩阵运算,再mask掉边界位置。
8位置、W=3、方块边长2:21个有效对分布在7个块,覆盖7×4=28个坐标。边长4时,分布在3个块,覆盖48个坐标。窗口相同,但块越粗越可能包含无效位置。
有效位置与整块覆盖,不是一个数字
行=query,列=key;●允许,·所在块仍覆盖但此位置被mask,—整块可跳过。8位置、窗口含当前token;坐标覆盖不代表真实指令数或加速比。覆盖坐标只是教学计数,不是实际执行指令或速度。部分内核可以进一步处理边界。FlexAttention的BlockMask是一个阅读入口:用元数据区分可跳块、完整可见块和部分可见块;构造与更新元数据本身也有成本。
05 · 截掉历史,为什么答案可能变
自设最后一个查询对8个Key得分都为0,Value为[1,2,3,4,5,6,7,8]。完整因果输出是平均值4.5;W=3只汇总[6,7,8],输出7。即使被删掉的位置权重并不最大,归一化分母也变了。
如果模型训练时就使用该窗口,窗口内的执行可保持模型语义;把原稠密模型直接裁成窗口则是近似或结构修改,需要质量验证。两者不能用同一个“等价加速”标签概括。
多层窗口网络可以通过中间位置间接传递更远信息。例如每层W=3,位置7在第二层可以经位置5获得更早位置的信息。间接影响不等于当前层直接读取全部历史,长距离检索能力仍应评估。
06 · 窗口能否让KV不再无限增长
纯局部层在连续生成中,可以只保留未来查询仍会访问的位置,使用循环缓冲或其他有界管理。覆盖旧槽时,逻辑位置仍增长,RoPE与mask不能把物理槽号当成原位置。
不能看到某层滑窗就删除整个模型旧KV:其他全局层、全局token、不同窗口、前缀复用或其他请求可能仍需要它。分块Prefill也可能同时处理多个查询,需要这一批各查询可见范围的并集;过早淘汰会缺数据。
按层确认可见性规则
确定未来任务仍需要的逻辑位置
确认旧块没有未完成的读者或共享请求
更新逻辑位置→物理槽映射,再允许复用
# 只删除已证明不再需要的KV。07 · 比较同一个mask的两种执行
下载脚本用完整得分表加窗口mask,与只计算允许位置的循环比较输出,并用有限差分检查Q/K/V梯度。另验证窗口与完整Attention的反例、块覆盖计数,以及稀疏权重点积和位置元数据。CPU循环只验证语义,不测试设备效率。
建立稠密 + 同mask基线
构造窗口/块元数据,保留真实位置
执行候选跳块内核
核对输出和反向
测内核 + 元数据构造 + 布局转换总时间
若修改了原模型可见性,另做质量与长上下文评测把所有分数先算出来再设成−∞,可作为正确性基线,但一般没有省掉QK计算。固定模式可复用元数据;随输入或层改变的模式要更新,不能把旧mask当缓存结果直接套用。
依据:PyTorch · FlexAttention与BlockMask作者讲解(2024) ↗ · PyTorch · 2:4半结构稀疏、剪枝与推理 ↗
08 · 同时检查质量、格式与端到端收益
- 正确性:同稀疏权重/同mask下输出及梯度,边界、空块、位置与有效长度。
- 模型:剪枝或缩小窗口后的质量,恢复训练成本,长距离任务。
- 硬件:支持的稀疏模式、dtype、shape、布局及实际调用路径。
- 系统:元数据、重排、缓存管理、其余稠密层和完整服务/训练耗时。
NVIDIA半结构稀疏、PyTorch BlockMask与昇腾Attention接口是不同能力入口。不能把某CUDA支持条件直接套给所有GPU/NPU,也不能将一个Attention窗口参数当成结构化权重稀疏支持。
依据:PyTorch · 2:4半结构稀疏、剪枝与推理 ↗ · vLLM Ascend · 支持功能矩阵(main) ↗
- W=3时有效对数21,为什么tile=4的覆盖量是48?
- 权重一半为零,为什么普通稠密Matmul未必快一倍?
- 删除旧KV前,为什么还要看全局层和共享读者?
流程位置与关联方法
这个方法可能出现在多个位置;计算线包含模型计算与算子实现,执行线包含运行时、内存和通信。
资料与核查范围
原理依据以原始论文和官方文档为主;算例与时间线是教学推导。文档核查日期:2026-10-10。引用 main / latest 文档时,实际接口以安装版本为准。
- PyTorch · 2:4半结构稀疏、剪枝与推理 ↗
- PyTorch · FlexAttention与BlockMask作者讲解(2024) ↗
- Mistral 7B · 原始滑窗Attention架构 ↗
- Transformers · How Caching Works ↗
- vLLM Ascend · 支持功能矩阵(main) ↗
代码为接入片段或教学伪代码;本页没有声称完成 NVIDIA / 昇腾硬件实测。