<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>NPU | Twinkle</title><link>https://modelscope.github.io/twinkle-web/zh/tags/npu/</link><atom:link href="https://modelscope.github.io/twinkle-web/zh/tags/npu/index.xml" rel="self" type="application/rss+xml"/><description>NPU</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>zh-Hans</language><lastBuildDate>Fri, 05 Jun 2026 00:00:00 +0000</lastBuildDate><image><url>https://modelscope.github.io/twinkle-web/media/logo_hu_fedc6a0bfe689b18.png</url><title>NPU</title><link>https://modelscope.github.io/twinkle-web/zh/tags/npu/</link></image><item><title>昇腾 NPU 支持：融合算子与 Flash Linear Attention</title><link>https://modelscope.github.io/twinkle-web/zh/blog/npu-support/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate><guid>https://modelscope.github.io/twinkle-web/zh/blog/npu-support/</guid><description>&lt;p&gt;Twinkle 通过全面的 monkey-patching 系统为&lt;strong&gt;华为昇腾 NPU&lt;/strong&gt; 提供一等公民级别的支持，自动将标准 CUDA 算子替换为 NPU 优化的融合算子。本文介绍 kernel 架构与各项优化细节。&lt;/p&gt;
&lt;h2 id="kernel-架构"&gt;Kernel 架构&lt;/h2&gt;
&lt;p&gt;Twinkle 的 kernel 模块（&lt;code&gt;twinkle.kernel&lt;/code&gt;）提供统一入口 &lt;code&gt;kernelize_model()&lt;/code&gt;，自动检测设备类型并应用对应优化：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;twinkle.kernel&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;kernelize_model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kernelize_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;npu&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 或自动检测&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在 NPU 设备上，以下融合算子会被&lt;strong&gt;无条件应用&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;算子&lt;/th&gt;
&lt;th&gt;NPU 实现&lt;/th&gt;
&lt;th&gt;收益&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RMSNorm&lt;/td&gt;
&lt;td&gt;&lt;code&gt;torch_npu.npu_rms_norm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;融合归一化，~2x 加速&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RoPE&lt;/td&gt;
&lt;td&gt;&lt;code&gt;torch_npu.npu_rotary_mul&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;融合旋转嵌入，支持部分 RoPE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SwiGLU&lt;/td&gt;
&lt;td&gt;&lt;code&gt;torch_npu.npu_swiglu&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;融合 gate+up 激活&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SDPA&lt;/td&gt;
&lt;td&gt;NPU 兼容的 &lt;code&gt;scaled_dot_product_attention&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;NPU 正确的 mask 处理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MoE GMM&lt;/td&gt;
&lt;td&gt;&lt;code&gt;torch_npu.npu_grouped_matmul&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;EP 感知的分组矩阵乘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FLA&lt;/td&gt;
&lt;td&gt;MindSpeed Triton 后端&lt;/td&gt;
&lt;td&gt;Qwen3.5 Flash Linear Attention&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="融合算子详解"&gt;融合算子详解&lt;/h2&gt;
&lt;h3 id="带残差参数化的-rmsnorm"&gt;带残差参数化的 RMSNorm&lt;/h3&gt;
&lt;p&gt;Twinkle 的 &lt;code&gt;NpuRMSNorm&lt;/code&gt; 在初始化时即检测 Qwen3.5 使用的&lt;strong&gt;残差参数化&lt;/strong&gt;模式（&lt;code&gt;scale = 1.0 + weight&lt;/code&gt;），避免在热路径中执行 CPU 同步的 &lt;code&gt;Tensor.item()&lt;/code&gt; 调用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NpuRMSNorm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hidden_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1e-6&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;weight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ones&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hidden_size&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 初始化时一次性检测&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_residual_param&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;weight&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;forward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hidden_states&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;scale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_residual_param&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;weight&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;torch_npu&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;npu_rms_norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hidden_states&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;epsilon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eps&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ep-感知的-moe-优化"&gt;EP 感知的 MoE 优化&lt;/h3&gt;
&lt;p&gt;MoE 分组矩阵乘 patch 是 &lt;strong&gt;EP 感知&lt;/strong&gt;的——仅在开启 Expert Parallelism 时激活（每个 rank 持有部分专家，权重小且连续）。未开启 EP 时，每个 rank 持有&lt;strong&gt;所有&lt;/strong&gt;专家，转置+连续化拷贝会产生约 ~8x 开销：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;TWINKLE_NPU_GMM_PATCH 未设置 → 跳过（默认安全）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;TWINKLE_NPU_GMM_PATCH=1 + EP 开启 → 应用（高效）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;TWINKLE_NPU_GMM_PATCH=1 + EP 未开启 → 跳过（避免 8x 开销）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;GmmFunction&lt;/code&gt; 自定义 autograd function 封装了 &lt;code&gt;torch_npu.npu_grouped_matmul&lt;/code&gt;，支持完整的反向传播。权重通过 &lt;code&gt;_version&lt;/code&gt; 自动缓存失效检测（全参训练时 &lt;code&gt;_version&lt;/code&gt; 递增，LoRA 模式下保持不变）。&lt;/p&gt;
&lt;h3 id="qwen35-flash-linear-attention"&gt;Qwen3.5 Flash Linear Attention&lt;/h3&gt;
&lt;p&gt;Qwen3.5 引入了标准注意力与线性注意力层的混合架构。Twinkle 通过 MindSpeed 的 Triton 实现在 NPU 上启用 &lt;strong&gt;FLA 快速路径&lt;/strong&gt;（&lt;code&gt;chunk_gated_delta_rule&lt;/code&gt;）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;强制设置 &lt;code&gt;is_flash_linear_attention_available = True&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;将 &lt;code&gt;chunk_gated_delta_rule&lt;/code&gt; 替换为 MindSpeed NPU 兼容实现&lt;/li&gt;
&lt;li&gt;遍历已实例化模型，逐层 patch&lt;/li&gt;
&lt;li&gt;禁用在 NPU 上会失败的 CUDA-only &lt;code&gt;FusedRMSNormGated&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;MindSpeed 实现提供分块 forward/backward（WY 表示），支持通过 &lt;code&gt;cu_seqlens&lt;/code&gt; 处理变长序列。&lt;/p&gt;
&lt;h2 id="环境变量控制"&gt;环境变量控制&lt;/h2&gt;
&lt;p&gt;每项优化均可独立控制：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;变量&lt;/th&gt;
&lt;th&gt;默认值&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TWINKLE_NPU_PATCH&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;所有 NPU patch 的主开关&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TWINKLE_NPU_FUSED_OPS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;融合算子（RMSNorm/RoPE/SwiGLU/SDPA）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TWINKLE_NPU_GMM_PATCH&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;未设置&lt;/td&gt;
&lt;td&gt;MoE 分组矩阵乘（EP 感知）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TWINKLE_NPU_FLA&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Flash Linear Attention&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TWINKLE_NPU_GATED_RMSNorm_FP32&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;强制 Gated RMSNorm 使用 FP32&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="支持的模型系列"&gt;支持的模型系列&lt;/h2&gt;
&lt;p&gt;Patching 系统会自动发现并 patch 兼容的模型系列：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Qwen3&lt;/strong&gt; / &lt;strong&gt;Qwen3-MoE&lt;/strong&gt; — 完整算子融合&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qwen3.5&lt;/strong&gt; / &lt;strong&gt;Qwen3.5-MoE&lt;/strong&gt; — 完整融合 + FLA + Gated RMSNorm&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qwen2.5-VL&lt;/strong&gt; — 完整融合 + 多模态 RoPE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动态发现&lt;/strong&gt; — 未知模型会被扫描检测兼容的 RMSNorm/RoPE/SwiGLU 模式&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="快速开始"&gt;快速开始&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装 NPU 依赖&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install torch-npu mindspeed
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 训练时自动启用 NPU 优化&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CUDA_VISIBLE_DEVICES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0,1,2,3 torchrun --nproc_per_node&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt; train.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;更多详情请参阅
。&lt;/p&gt;</description></item></channel></rss>