一文读懂动态分块Dynamic Patching原理:Kairos-23M如何自适应划分序列粒度

📅 2026/8/20 19:50:59
一文读懂动态分块Dynamic Patching原理:Kairos-23M如何自适应划分序列粒度
一文读懂动态分块Dynamic Patching原理Kairos-23M如何自适应划分序列粒度【免费下载链接】kairos_23m-npu项目地址: https://ai.gitcode.com/atlasleong/kairos_23m-npu在零样本zero-shot时序预测领域Kairos-23M 是一个仅 2300 万参数的时序基础模型却能在多个预测任务上表现亮眼。它最核心的杀手锏就是动态分块Dynamic Patching机制不再把整条时间序列一刀切成长度固定的补丁Patch而是让模型自己决定哪里该切细、哪里该保持粗糙。本文带你彻底搞懂 Kairos-23M 动态分块的完整原理、MoE 路由与递归划分的实现细节以及它如何高效跑在昇腾 NPU 上。为什么时序模型需要动态分块静态分块的三大痛点传统时序预测模型如 PatchTST会把 2048 个时间点切成若干个长度固定为 128 的补丁每个补丁互不重叠。这种静态分块有三个明显痛点粒度一刀切金融数据中开盘半小时波动剧烈需要更细的粒度而长期趋势段用 128 点的粗粒度就足够固定粒度浪费了计算量。跨序列不通用不同序列的周期、噪声水平差异巨大一套固定分块规则很难通吃所有数据集。信息被稀释关键突变点被淹没在大补丁里注意力机制难以聚焦重要局部模式。Kairos-23M 的答案是用一个 MoE 路由器为每个补丁独立决定粒度等级实现真正的自适应划分。Kairos-23M动态分块整体流程从粗到细的三步走动态分块的完整入口在 modeling_kairos.py 的DynamicPatch类整体流程可以概括为三步粗分块先用Patch模块把序列按input_patch_size128、input_patch_stride128切成均匀的初始补丁实现见 utils.py。MoE 路由打分每个补丁经过 MoE 的 Gate 网络输出它属于哪个粒度专家共levels3级128 / 64 / 32。递归细分凡是被路由到更细粒度的补丁会进行二分拆解直到达到目标粒度。最终同一段上下文里会同时存在 128、64、32 三种粒度的补丁——这正是动态二字的含义。MoE路由器如何决定一个补丁切不切路由决策由 moe.py 中的Gate网络完成对每个补丁计算打分向量经过 softmax 得到概率分布用 top-kn_activated_experts1选出最匹配的粒度专家路由权重会做归一化用于后续多专家加权。有意思的是Gate 还带一个负载均衡偏置routing bias训练时会根据每个专家被选中的频率动态调整偏置避免所有补丁都挤向同一粒度。这个偏置更新被严格限制在self.training阶段moe.py保证推理时模型无状态——这也是它能在 CPU 与 NPU 上得到逐位一致结果的关键修复之一。递归二分法128→64→32的粒度细分是怎么实现的一旦 MoE 判定某个补丁需要更细粒度真正的划分工作由 patch_utils.py 的_divide_patches完成采用递归二分策略每次把待划分的补丁对半切开size.div(2)前半段和后半段各自成为独立补丁同时维护三张账本parent_mapping记录每个新补丁的父补丁是谁、position_mapping记录每个补丁在原始区间内的起止位置、granularity_mask记录每个粒度的激活范围。这样无论怎么切模型都清楚每个补丁在原始序列中的精确位置为后续的实例级 RoPE 位置编码和注意力计算提供依据。整个过程在 modeling_kairos.py 中按levels-1轮迭代执行。多粒度特征编码大小不同的补丁如何进入模型划分完成后128、64、32 三种尺寸的补丁不能直接塞进同一个线性层。Kairos-23M 用 layers.py 中的MultiInSizeLinear优雅解决为每种粒度各准备一份独立权重in_features_ls[128, 64, 32]每个补丁只激活与自身尺寸匹配的那份权重通过掩码mask对齐特征维度x_final会把有效特征重排到前排配合granularity_mask让不同粒度的特征在统一形状下参与计算配合实例级 RoPE 与 MoE tokenizer 一起送入 T5 风格 encoder-decoder。动态分块在昇腾NPU上的工程落地这套动态分块机制已完整迁移到昇腾 910B4 上CANN 8.5.1 torch_npu 2.9.0全程 float32 精度NPU 与 CPU 对比的最大绝对误差仅 2.4e-06。迁移过程中有两个值得记录的工程细节FFT 幅度计算fft_process用sqrt(sum(view_as_real**2))替代torch.abs(complex)规避了 torch_npu 对 complex64 的不支持问题modeling_kairos.py推理无状态化为 MoE 路由偏置加上训练守卫保证同一实例先后在 CPU 和 NPU 上前向时结果不漂移实测 NPU 单次前向中位数耗时约 114ms输出 9 个分位数 × 64 步预测。总结动态分块Dynamic Patching让 Kairos-23M 摆脱了固定粒度的束缚MoE 路由负责决策递归二分负责执行多粒度权重负责编码三者配合实现了对任意时间序列的自适应粒度划分。对于想深入学习时序基础模型的开发者来说这份实现是理解动态 tokenization的绝佳范例——它用仅 23M 的参数撬动了接近更大模型的零样本预测能力。【免费下载链接】kairos_23m-npu项目地址: https://ai.gitcode.com/atlasleong/kairos_23m-npu创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考