---
tags: [CANN]
doc_type: knowledge-note
返回目录: "[[计算机系/昇腾与CANN/大模型与算子专题学习导航|大模型与算子专题学习导航]]"
上一篇: "[[计算机系/昇腾与CANN/大模型量化原理与部署|大模型量化原理与部署]]"
下一篇: "[[计算机系/昇腾与CANN/NPU推理并行策略设计|NPU推理并行策略设计]]"
后续学习: ["[[计算机系/昇腾与CANN/NPU推理并行策略设计|NPU推理并行策略设计]]"]
---

# 大模型结构解析与 NPU 迁移诊断

模型迁移需要同时对齐数学计算、权重组织和执行方式。能够加载权重只解决了第一道工程问题；输出正确、显存可控、性能达到目标，需要分别验证。Transformer 的通用基础见[大语言模型与推理系统](大语言模型与推理系统.md)。

## 1. 沿一次前向计算理解模型

Token ID 通过 Embedding 转成隐藏向量，经过多个 Decoder 层，再由 LM Head 投影为词表上的 logits。每个 Decoder 层通常包含归一化、注意力、残差连接和前馈网络。归一化与残差的先后顺序也是模型定义的一部分，不能为了匹配已有实现而随意调整。

![模型结构与计算模块](.assets/CANN推理专题/deploy-6.png)

注意力解决不同位置之间的信息交换；FFN 在每个位置内部变换特征。SwiGLU 类 FFN 可以写成：

$$
\operatorname{FFN}(x)=\bigl(\operatorname{SiLU}(xW_g)\odot xW_u\bigr)W_d.
$$

Gate 和 Up 投影共同决定中间特征，Down 投影恢复隐藏维度。融合两次输入投影可以减少调度或搬运，但必须保持权重拼接方向和输出切分顺序一致。

MoE 把一个稠密 FFN 替换为多个专家，由 Router 为每个 Token 选择部分专家。激活参数量决定一次计算使用多少权重，总参数量则影响模型存储和分布式部署。共享专家通常处理所有 Token，路由专家只处理分派给自己的 Token，因此二者有重叠执行的机会。

## 2. 模型结构决定计算与缓存组织

### Dense 与 MoE：把参数容量和每次计算分开看

可以把 Attention 理解为“先从上下文收集信息”，把 MLP 理解为“再对当前位置的特征做加工”。每个专家通常也是一个 FFN，但“专家”是可学习子网络的名字，不代表天然有一个负责数学、一个负责代码。是否形成领域偏好取决于训练和路由，不能预先指定其语义。

设路由分数为 $r_i(x)$，选出的专家集合为 $S(x)=\operatorname{TopK}(r(x))$。一种在选中集合内归一化的形式为：

$$
g_i(x)=\frac{e^{r_i(x)}}{\sum_{j\in S(x)}e^{r_j(x)}},\quad
y=\sum_{i\in S(x)}g_i(x)E_i(x).
$$

实际模型还可能使用 Sigmoid 打分、不同归一化规则或共享专家，需按模型实现判断。MoE 用稀疏激活控制每 Token 的计算量，但全部专家仍需存储或调度，额外路由与通信也有成本。

Dense 本身不意味着计算量随序列长度呈二次增长：固定宽度下，逐位置 FFN 的计算量通常随 Token 数线性增长；标准全注意力在 Prefill 中的成对交互才具有二次项。Decode 的单步注意力随历史长度增长，生成整个序列的累计成本又是另一种口径。

### GQA：查询头与 KV 头可以不同

GQA 让多个查询头共享一组 K/V，减少缓存与读取量。在各层配置相同、不考虑分页余量和额外元数据时，KV Cache 的字节数约为：

$$
M_{KV}=2LBSH_{KV}d_hb.
$$

其中，$L$ 是层数，$B$ 是批大小，$S$ 是缓存长度，$H_{KV}$ 是 KV 头数，$d_h$ 是头维度，$b$ 是每个元素的字节数。系数 2 对应 K 和 V。变长请求应按各请求实际缓存长度求和，不能直接把最大长度当作所有请求的真实长度。

TP 切分之后，每卡缓存是否正好缩小到原来的 $1/p$，还取决于 KV 头的分配方式。KV 头数较少时，部分实现会复制 KV 头。

### MLA：缓存压缩表示

MLA 通过低秩表示压缩 K/V 的历史信息，在注意力计算时利用投影关系恢复或吸收相关变换。缓存可能同时包含潜在向量与独立的 RoPE 分量，因此容量估算需要按实际缓存字段相加，不能只数一个潜在维度。

### 稀疏注意力：选择哪些历史位置参与计算

稀疏注意力可以使用索引器为查询选择 Top-K 历史位置，从而缩小后续注意力计算范围。若每个查询最终只访问 $k$ 个位置，所选位置上的注意力计算量可以从全量的二次增长降为与 $Sk$ 相关。但索引、打分、Top-K、离散访问和数据布局转换仍有成本。

![注意力结构与模型适配](.assets/CANN推理专题/deploy-8.png)

稀疏率高并不自动意味着执行快：访问不连续、小块过多或索引开销大，都可能抵消节省的乘加计算。Top-K 的具体值应由模型配置与实现确定。

## 3. 架构路线与框架适配

### 压缩、稀疏与递推是三条不同路线

MLA 主要改变历史信息的表示与缓存；DSA 通过 Lightning Indexer 选择参与注意力的历史位置；GatedDeltaNet 则通过门控和 Delta 更新维护递推状态。前两者仍涉及访问历史表示，后一类方法把历史信息压进有限大小的状态，不能简单理解为“把全部 KV 换个存法”。

在固定状态维度下，递推更新可以避免每步扫描不断增长的完整历史；但状态压缩也改变了记忆方式，其效果需要任务验证。训练或 Prefill 可采用分块并行算法，不必照搬逐 Token 的串行实现。GatedDeltaNet 与 RNN、线性注意力有联系，但这些名称并不是同义词。

Hybrid Model 是组合架构的统称，例如在不同层混用全注意力与递推模块，再结合 MoE。DiT 则通常指用 Transformer 作为扩散模型的去噪网络；它并不是把语言模型直接改名为图像模型。

| 设计 | 主要改变什么 | 没有自动解决什么 |
| --- | --- | --- |
| MoE | 每个 Token 激活哪些 FFN 参数 | 专家存储与通信 |
| MLA | 历史 K/V 的压缩表示 | 所有长序列计算开销 |
| DSA | 哪些历史位置参与注意力 | 索引成本与稀疏误差 |
| GatedDeltaNet | 历史状态的更新方式 | 任意任务的长程记忆质量 |
| DiT | 扩散去噪的网络骨干 | 多步去噪的累计成本 |

这些路线应按具体模型版本组合理解。DeepSeek-V3.1 不能直接视为同时包含 DSA、GatedDeltaNet 与 DiT 的统一实现，分析网络时要先读配置和模块定义，再做算子拆分。负载均衡辅助损失属于训练设计，也不能直接放进普通推理前向的必经链路。

Hugging Face 模型实现适合表达模型结构和建立参考结果；vLLM、SGLang 等服务框架还需要适配分页缓存、批调度、并行分组和注意力后端。迁移时应沿以下链路核对：

| 环节 | 关键核对项 | 常见错误后果 |
| --- | --- | --- |
| 输入 | Tokenizer、特殊 Token、对话模板 | 输入语义已经不同 |
| 模型配置 | 层数、隐藏维度、头数、RoPE、激活函数 | 形状或数值不匹配 |
| 权重 | 名称映射、转置、QKV 拼接、专家编号 | 加载成功但计算错误 |
| 注意力 | Q/K 归一化、掩码、位置编码、KV 布局 | 长序列或多轮场景异常 |
| 并行 | 分片轴、复制参数、通信组 | 单卡正确而多卡错误 |
| 输出 | logits、采样参数、停止条件 | 无法进行可比评测 |

先比较单层或关键中间张量，再比较完整前向结果；接着验证增量 Decode 与完整序列前向的一致性，最后扩展到变长批次和多卡。只看最终文本是否“像样”，可能掩盖持续累积的数值错误。浮点误差容限应与精度、算子和任务要求一起确定。

## 4. 用时间线区分 Host 与 Device 瓶颈

![Host 与 Device 时间线](.assets/CANN推理专题/deploy-16.png)

如果 NPU 时间线上频繁出现空隙，而 CPU 持续进行 Python 调度、参数准备或同步等待，问题可能在 Host。典型原因包括大量小算子、CPU 资源争用、循环中的 `.item()` / `.cpu()`，以及不必要的阻塞式调用。

图捕获与重放可以减少重复调度，但输入形状、地址和状态管理必须符合相应图机制的约束。Prefill 同样可以使用合适的图模式，例如形状分桶、静态子图或受支持的动态方案；不能把“Prefill 长度可变”直接等同于“不能入图”。

![推理瓶颈与优化方向](.assets/CANN推理专题/deploy-17.png)

当 Device 已持续工作，需要继续区分：

- **计算受限**：矩阵规模、计算精度与核利用率决定吞吐，可考虑高效矩阵算子、融合和适当并行。
- **内存受限**：权重或 KV 读取占主导，可考虑量化、缓存布局、批处理和减少中间结果。
- **通信受限**：跨卡传输或同步占主导，需要调整并行策略、消息规模与通信计算重叠。

Prefill 往往具有较高计算强度，Decode 往往受权重或 KV 读取影响，但长上下文、批大小、MoE 与硬件配置会改变瓶颈。量化可以减少字节数或使用更高吞吐的低精度计算单元，并不必然减少数学上的乘加次数。

## 5. 建立可比较的优化闭环

固定模型版本、输入分布、并发、输入输出长度、硬件和精度，再记录首 Token 时延、后续 Token 时延、吞吐和峰值显存。平均值之外还需要关注尾部时延。

一次只改变一个主要因素，检查数值质量后再比较性能。如果某个算子更快而端到端没有改善，应检查它是否位于关键路径，或是否增加了通信、同步、格式转换与调度成本。

后续分别见[并行策略设计](NPU推理并行策略设计.md)、[推理框架与 KV 缓存调度](推理框架与KV缓存调度.md)和[低比特量化实践](低比特量化优化与AMCT实践.md)。
