大模型 MoE,你明白了么?
最近被T4卡搞得有点抽风就多些一点关于大模型的讲解的。由浅至深的讲个透,愿天下用老旧显卡的人儿都可以远离傻*问题。

作者:吴佳浩
最后更新:2025-12-11
适用人群:大模型上下游相关从业者
------以 Qwen2/Qwen3 为例,从入门到回家
1. 什么是 MoE(Mixture of Experts)
核心概念
MoE = 混合专家模型,它让模型由多个"专家网络"组成,每次推理只激活少量专家,从而实现:
- ✅ 保留大模型能力 - 总参数量大,能力强
- ✅ 降低推理成本 - 只激活部分参数,计算量小
- ✅ 提升领域能力 - 专家各司其职,术业有专攻
核心理念
💡 不需要每个 token 都用 300 亿参数计算,而是只调用其中最适合解决该问题的专家。
这就像一个医院:
- 你头疼不需要召集所有科室医生
- 只需要神经科专家诊断
- 但医院仍然拥有全科能力
为什么需要 MoE?
Dense 模型的问题:
| 参数量 | 推理需要激活 | 显存需求 |
|---|---|---|
| 70B | 全 70B | 极高(>140GB FP16) |
MoE 的改进:
| 总参数量 | 每次激活 | 实际推理成本 |
|---|---|---|
| 70B(含16个专家) | Top-1=3B | 像跑 3B 模型一样 cheap |
核心思想:选对专家,而不是计算全部专家。
2. MoE 架构全景
2.1 基础架构流程
flowchart TD
A[输入 Token:
写一段 Python 代码] --> B{Router 路由器
分析 token 特征} B -->|权重 0.8| C1[Expert 1
代码专家] B -->|权重 0.2| C2[Expert 5
逻辑专家] B -.不激活.-> C3[Expert 2] B -.不激活.-> C4[Expert 3] B -.不激活.-> C5[Expert 4] C1 --> D[加权合并输出] C2 --> D D --> E[最终输出] style B fill:#FFD700 style C1 fill:#90EE90 style C2 fill:#90EE90 style C3 fill:#E0E0E0 style C4 fill:#E0E0E0 style C5 fill:#E0E0E0
写一段 Python 代码] --> B{Router 路由器
分析 token 特征} B -->|权重 0.8| C1[Expert 1
代码专家] B -->|权重 0.2| C2[Expert 5
逻辑专家] B -.不激活.-> C3[Expert 2] B -.不激活.-> C4[Expert 3] B -.不激活.-> C5[Expert 4] C1 --> D[加权合并输出] C2 --> D D --> E[最终输出] style B fill:#FFD700 style C1 fill:#90EE90 style C2 fill:#90EE90 style C3 fill:#E0E0E0 style C4 fill:#E0E0E0 style C5 fill:#E0E0E0
关键要素解释:
- Router(路由器) - 根据输入内容选择最适合的专家(Top-1 / Top-2)
- Experts(专家) - 每个都是独立的 FFN 网络,拥有专属参数
- 选择性激活 - 只激活部分专家,其余专家在当前 token 不参与运算
- 加权合并 - 将激活专家的输出按权重求和
2.2 完整 Transformer 层结构
flowchart TB
subgraph "传统 Transformer 层"
A1[Input] --> A2[Multi-Head Attention]
A2 --> A3[Add & Norm]
A3 --> A4[Dense FFN
所有参数激活] A4 --> A5[Add & Norm] A5 --> A6[Output] end subgraph "MoE Transformer 层" B1[Input] --> B2[Multi-Head Attention] B2 --> B3[Add & Norm] B3 --> B4{MoE Layer
路由器选择} B4 --> B5[Expert 1] B4 --> B6[Expert 2] B4 -.-> B7[Expert N] B5 --> B8[Sparse Activation
仅部分专家激活] B6 --> B8 B7 -.-> B8 B8 --> B9[Add & Norm] B9 --> B10[Output] end style A4 fill:#FFB6C1 style B4 fill:#87CEEB style B8 fill:#90EE90
所有参数激活] A4 --> A5[Add & Norm] A5 --> A6[Output] end subgraph "MoE Transformer 层" B1[Input] --> B2[Multi-Head Attention] B2 --> B3[Add & Norm] B3 --> B4{MoE Layer
路由器选择} B4 --> B5[Expert 1] B4 --> B6[Expert 2] B4 -.-> B7[Expert N] B5 --> B8[Sparse Activation
仅部分专家激活] B6 --> B8 B7 -.-> B8 B8 --> B9[Add & Norm] B9 --> B10[Output] end style A4 fill:#FFB6C1 style B4 fill:#87CEEB style B8 fill:#90EE90
对比要点:
- 传统模型:FFN 层所有参数都参与计算
- MoE 模型:用多专家 + 路由器替代 Dense FFN
3. Dense 模型 vs MoE 模型:显存与计算对比
3.1 什么是 Dense(稠密模型)
Dense = 所有参数全部参与推理
graph LR
A[输入] --> B[Layer 1
32B 参数] B --> C[Layer 2
32B 参数] C --> D[Layer 3
32B 参数] D --> E[输出] style B fill:#FF6B6B style C fill:#FF6B6B style D fill:#FF6B6B
32B 参数] B --> C[Layer 2
32B 参数] C --> D[Layer 3
32B 参数] D --> E[输出] style B fill:#FF6B6B style C fill:#FF6B6B style D fill:#FF6B6B
示例:
- Qwen2.5-32B Dense
-
推理时 32B 全激活
-
显存占用 60+ GB(FP16)
-
性能强但成本高
-
显存对比表:
| 模型 | FP16 | FP8 | INT8 | INT4 |
|---|---|---|---|---|
| Qwen3 Dense 32B(全激活) | 60+ GB | 30 GB | 28 GB | 15 GB |
| Qwen3 MoE 30B(激活 ~3B) | 6 GB | 3 GB | 3 GB | 1.5 GB |
👉 MoE 推理显存 ≈ Dense 的 1/10~1/20
3.2 什么是 MoE(混合专家模型)
MoE = 总参数大,但每次只激活少量专家
graph TB
A[Input] --> B[Layer 1
Total Params 30B] B --> C{Router
Select Top-2} C -->|Active| D1[Expert 1
1.5B] C -->|Active| D2[Expert 5
1.5B] C -.-> D3[Other Experts
Not Activated
27B] D1 --> E[Merge Output] D2 --> E E --> F[Next Layer] style D1 fill:#90EE90 style D2 fill:#90EE90 style D3 fill:#E0E0E0
Total Params 30B] B --> C{Router
Select Top-2} C -->|Active| D1[Expert 1
1.5B] C -->|Active| D2[Expert 5
1.5B] C -.-> D3[Other Experts
Not Activated
27B] D1 --> E[Merge Output] D2 --> E E --> F[Next Layer] style D1 fill:#90EE90 style D2 fill:#90EE90 style D3 fill:#E0E0E0
示例:
- Qwen1.5-MoE-33B
- 总参数:33B
- 激活专家:Top-1(约 3B)
- 显存占用:~6GB(FP16)
- 推理成本 ≈ 3B Dense 模型
3.3 显存占用对比表(重要!)
以 Qwen3 32B Dense & Qwen3 30B MoE 为例:
| 模型配置 | FP16(全精度) | FP8 | INT8 | INT4 |
|---|---|---|---|---|
| Qwen3 Dense 32B (全参数激活) | 60+ GB | ~30 GB | ~28 GB | ~15 GB |
| Qwen3 MoE 30B (激活 3B) | ~6 GB | ~3 GB | ~3 GB | ~1.5 GB |
gantt
title 显存占用对比(GB)
dateFormat X
axisFormat %s
section 30B 模型
FP16 :0, 60
FP8 :0, 30
INT8 :0, 28
INT4 :0, 15
section 3B 模型
FP16 :0, 6
FP8 :0, 3
INT8 :0, 3
INT4 :0, 1.5
结论:
⚡ MoE 推理显存消耗 ≈ Dense 的 1/10
原因:
- Dense:所有层、所有参数都要参与计算
- MoE:每层只用少数专家(如激活 3B)
这就是为什么 30B MoE 可以在消费级显卡运行。
4. MoE 的关键概念
4.1 专家数量(Experts)
mindmap
root((MoE 专家池
16 个专家)) Expert 1 推理能力 逻辑分析 Expert 2 创意写作 故事创作 Expert 3 数学计算 公式推导 Expert 4 代码生成 算法实现 Expert 5 语言翻译 多语言理解 Expert 6~16 其他领域 动态分工
16 个专家)) Expert 1 推理能力 逻辑分析 Expert 2 创意写作 故事创作 Expert 3 数学计算 公式推导 Expert 4 代码生成 算法实现 Expert 5 语言翻译 多语言理解 Expert 6~16 其他领域 动态分工
专家分工示例:
- Expert 1:推理、逻辑分析
- Expert 3:数学、计算
- Expert 5:代码生成
- Expert 7:语言翻译
- Expert 10:创意写作
- ...
4.2 Top-K(激活专家数量)
flowchart LR
A[输入 Token] --> B{Router 打分}
B --> C[专家得分排序]
subgraph "Top-1 策略"
C --> D1[选择得分最高的 1 个专家]
D1 --> E1[速度最快
成本最低] end subgraph "Top-2 策略" C --> D2[选择得分最高的 2 个专家] D2 --> E2[性能更好
成本适中] end style D1 fill:#90EE90 style D2 fill:#87CEEB
成本最低] end subgraph "Top-2 策略" C --> D2[选择得分最高的 2 个专家] D2 --> E2[性能更好
成本适中] end style D1 fill:#90EE90 style D2 fill:#87CEEB
常见配置:
- Top-1:每次激活 1 个专家(速度快)
- Top-2:每次激活 2 个专家(性能好)
4.3 参数关系图
graph TB
A[MoE 模型
总参数 30B] --> B[共 16 个专家] B --> C1[Expert 1
1.9B 参数] B --> C2[Expert 2
1.9B 参数] B --> C3[Expert 3
1.9B 参数] B --> C4[...] B --> C5[Expert 16
1.9B 参数] D[推理时 Top-1] --> E[只激活 1 个专家
约 3B 参数] E --> F[其余 15 个专家
不参与计算] style E fill:#90EE90 style F fill:#E0E0E0
总参数 30B] --> B[共 16 个专家] B --> C1[Expert 1
1.9B 参数] B --> C2[Expert 2
1.9B 参数] B --> C3[Expert 3
1.9B 参数] B --> C4[...] B --> C5[Expert 16
1.9B 参数] D[推理时 Top-1] --> E[只激活 1 个专家
约 3B 参数] E --> F[其余 15 个专家
不参与计算] style E fill:#90EE90 style F fill:#E0E0E0
关键公式:
css
总参数 = 专家数量 × 单专家参数 + 共享参数
激活参数 = Top-K × 单专家参数 + 共享参数
推理成本 ∝ 激活参数(而非总参数)
5. 常见疑问:没激活的专家是不是浪费?
❌ 错误理解
flowchart LR
A[用户提问] --> B[激活 Expert 4
代码专家] B --> C[其他 15 个专家
完全没用?] style C fill:#FFB6C1
代码专家] B --> C[其他 15 个专家
完全没用?] style C fill:#FFB6C1
✅ 正确理解
flowchart TB
A[MoE 专家池] --> B[不同任务触发不同专家]
B --> C1[任务 1: 写代码
触发 Expert 4] B --> C2[任务 2: 数学题
触发 Expert 3] B --> C3[任务 3: 翻译
触发 Expert 7] B --> C4[任务 4: 创作
触发 Expert 2] C1 --> D[所有专家都会被使用
只是时机不同] C2 --> D C3 --> D C4 --> D style D fill:#90EE90
触发 Expert 4] B --> C2[任务 2: 数学题
触发 Expert 3] B --> C3[任务 3: 翻译
触发 Expert 7] B --> C4[任务 4: 创作
触发 Expert 2] C1 --> D[所有专家都会被使用
只是时机不同] C2 --> D C3 --> D C4 --> D style D fill:#90EE90
真相:
- 训练时 - 所有专家都会被激活并学习
- 推理时 - 根据任务动态选择最合适的专家
- 长期使用 - 每个专家都会在各自擅长的领域发光
类比:
🏥 医院有 16 个科室,你看病只挂 1 个科室,但其他科室不是浪费,而是在服务其他患者。
6. Qwen3(Dense / MoE)部署推荐方案
场景分析
flowchart TD
A[你的硬件条件?] --> B{显卡显存}
B -->|24GB 消费级| C[推荐方案 1]
B -->|48GB 专业卡| D[推荐方案 2]
B -->|80GB+ 服务器| E[推荐方案 3]
C --> C1["Qwen3-14B Dense FP8 显存: ~14GB 性能: 强"]
C --> C2["Qwen1.5-MoE-33B INT4 显存: ~1.5GB 性能: 中上"]
D --> D1["Qwen3-32B Dense FP8 显存: ~30GB 性能: 极强"]
E --> E1["Qwen3-72B Dense FP8 显存: ~72GB 性能: 顶级"]
style C1 fill:#90EE90
style C2 fill:#87CEEB
style D1 fill:#FFD700
style E1 fill:#FF6B6B
方案 1:注重性能(推荐)
Qwen3-14B Dense(INT4 或 FP8)
| 精度 | 显存占用 | 推荐指数 | 说明 |
|---|---|---|---|
| FP16 | ~28GB | ❌ | 超出 24GB 显存 |
| FP8 | ~14GB | ⭐⭐⭐⭐⭐ | 强烈推荐 |
| INT4 | ~7GB | ⭐⭐⭐⭐ | 轻量级最佳 |
优势:
- 性能显著强于 7B
- 性价比 > 70%
- 适合日常对话、代码生成
方案 2:大模型能力 + 小显存
Qwen1.5-MoE-33B(INT4)
| 指标 | 数值 |
|---|---|
| 总参数 | 33B |
| 激活参数 | ~3B |
| 显存占用 | ~1.5GB (INT4) |
优势:
- ✅ 显存占用极低(4GB 显卡可跑)
- ✅ 推理速度快
- ✅ 性能接近 30B Dense(尤其中文、推理)
劣势:
- ⚠️ 特定任务效果可能不如 Dense 精细
方案 3:企业级旗舰
Qwen3-72B Dense(FP8)
硬件要求:
- A100 80GB / H100
- 或多卡 80GB GPU
性能:
- Top 级别
- 适合企业级应用
7. MoE 的训练机制(进阶)
7.1 训练流程图
sequenceDiagram
participant D as 训练数据
participant R as Router
路由器 participant E1 as Expert 1 participant E2 as Expert 2 participant L as Loss
损失函数 D->>R: 输入 Token R->>R: 计算专家得分 R->>E1: 激活 (权重 0.7) R->>E2: 激活 (权重 0.3) E1->>L: 输出 O1 E2->>L: 输出 O2 L->>L: 计算任务损失
+ 负载均衡损失 L-->>E1: 反向传播更新 L-->>E2: 反向传播更新 L-->>R: 更新路由参数
路由器 participant E1 as Expert 1 participant E2 as Expert 2 participant L as Loss
损失函数 D->>R: 输入 Token R->>R: 计算专家得分 R->>E1: 激活 (权重 0.7) R->>E2: 激活 (权重 0.3) E1->>L: 输出 O1 E2->>L: 输出 O2 L->>L: 计算任务损失
+ 负载均衡损失 L-->>E1: 反向传播更新 L-->>E2: 反向传播更新 L-->>R: 更新路由参数
7.2 路由器训练机制
flowchart TB
A[输入 Token 表示] --> B[Router 小型网络
Linear + Softmax] B --> C[输出专家概率分布] C --> D{Top-K 选择} D --> E1[专家得分: 0.35] D --> E2[专家得分: 0.28] D --> E3[专家得分: 0.15] D --> E4[其他专家...] E1 --> F[选择 Top-2] E2 --> F F --> G[+ 负载均衡损失
防止专家偏向] style G fill:#FFD700
Linear + Softmax] B --> C[输出专家概率分布] C --> D{Top-K 选择} D --> E1[专家得分: 0.35] D --> E2[专家得分: 0.28] D --> E3[专家得分: 0.15] D --> E4[其他专家...] E1 --> F[选择 Top-2] E2 --> F F --> G[+ 负载均衡损失
防止专家偏向] style G fill:#FFD700
训练优化:
- 使用 Softmax + Top-K
- 加入 负载均衡(Load Balancing)损失项
- 确保专家不会"偏向性过强"
7.3 专家特化过程
flowchart LR
A[训练初期
专家无明显分工] --> B[中期
逐渐形成偏好] B --> C[后期
专家特化完成] subgraph "训练初期" A1[Expert 1
通用能力] A2[Expert 2
通用能力] A3[Expert 3
通用能力] end subgraph "训练后期" C1[Expert 1
代码专家] C2[Expert 2
数学专家] C3[Expert 3
创意专家] end A1 -.演化.-> C1 A2 -.演化.-> C2 A3 -.演化.-> C3 style C1 fill:#90EE90 style C2 fill:#87CEEB style C3 fill:#FFB6C1
专家无明显分工] --> B[中期
逐渐形成偏好] B --> C[后期
专家特化完成] subgraph "训练初期" A1[Expert 1
通用能力] A2[Expert 2
通用能力] A3[Expert 3
通用能力] end subgraph "训练后期" C1[Expert 1
代码专家] C2[Expert 2
数学专家] C3[Expert 3
创意专家] end A1 -.演化.-> C1 A2 -.演化.-> C2 A3 -.演化.-> C3 style C1 fill:#90EE90 style C2 fill:#87CEEB style C3 fill:#FFB6C1
关键训练技术:
- OBST(One-Batch Selective Training)
- GShard(Google)
- Switch Transformer(Google)
- DeepSpeed-MoE(微软)
7.4 防止专家闲置的机制
mindmap
root((防止专家闲置))
负载均衡损失
惩罚过度使用某个专家
奖励使用冷门专家
多任务训练
覆盖不同领域数据
确保每个专家有用武之地
随机噪声
路由器添加随机扰动
增加专家激活多样性
Expert Dropout
训练时随机丢弃专家
强制其他专家学习
结果: 所有专家都有机会参与训练,不会出现"活跃专家"和"僵尸专家"。
8. 完整知识体系总结
mindmap
root((MoE核心知识))
基础概念
多专家结构
稀疏激活
路由机制
参数关系
总参数不等推理成本
激活参数定成本
显存占用1/10
模型对比
Dense全激活
MoE选激活
性能成本权衡
训练机制
路由器训练
专家特化
负载均衡
部署方案
消费级14B
专业级32B
企业级72B
优势
大模型能力
小模型成本
领域特化
9. 十句话掌握 MoE
- MoE = 多专家结构,每次只激活少数专家
- 总参数(如 30B)≠ 推理成本
- 推理成本 ≈ 激活参数(如 3B)
- Dense = 全部激活,性能强但成本高
- MoE = "大模型能力 + 小模型成本"
- INT4/FP8 是量化技术,与 MoE 架构无关
- INT4 省显存但会略降性能
- MoE 不会浪费参数,未激活专家会在其他任务中使用
- Qwen3-14B Dense FP8 是最稳健的部署方案
- Qwen-MoE 系列适合显存 4GB~24GB 的场景
10. 个人快速决策指南
flowchart TD
Start[开始选择模型] --> Q1{你的显存?}
Q1 -->|4-8GB| A1[Qwen1.5-MoE-33B INT4
显存: 1.5GB
性能: 中上] Q1 -->|12-16GB| A2[Qwen3-7B Dense FP8
显存: 7GB
性能: 中] Q1 -->|20-24GB| A3{优先什么?} Q1 -->|40GB+| A4[Qwen3-32B Dense FP8
显存: 30GB
性能: 极强] Q1 -->|80GB+| A5[Qwen3-72B Dense FP8
显存: 72GB
性能: 顶级] A3 -->|性能| B1[Qwen3-14B Dense FP8
显存: 14GB
性能: 强] A3 -->|兼顾| B2[Qwen3-14B Dense INT4
显存: 7GB
性能: 强] style A1 fill:#87CEEB style B1 fill:#90EE90 style A4 fill:#FFD700 style A5 fill:#FF6B6B
显存: 1.5GB
性能: 中上] Q1 -->|12-16GB| A2[Qwen3-7B Dense FP8
显存: 7GB
性能: 中] Q1 -->|20-24GB| A3{优先什么?} Q1 -->|40GB+| A4[Qwen3-32B Dense FP8
显存: 30GB
性能: 极强] Q1 -->|80GB+| A5[Qwen3-72B Dense FP8
显存: 72GB
性能: 顶级] A3 -->|性能| B1[Qwen3-14B Dense FP8
显存: 14GB
性能: 强] A3 -->|兼顾| B2[Qwen3-14B Dense INT4
显存: 7GB
性能: 强] style A1 fill:#87CEEB style B1 fill:#90EE90 style A4 fill:#FFD700 style A5 fill:#FF6B6B
附录:参考资源
官方文档:
部署工具:
- vLLM
- Ollama
- llama.cpp