大模型 MoE,你明白了么?

作者:吴佳浩日期:2025/12/11

大模型 MoE,你明白了么?

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

image.png

作者:吴佳浩

最后更新: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 基础架构流程

1flowchart TD
2    A[输入 Token:<br/>写一段 Python 代码] --> B{Router 路由器<br/>分析 token 特征}
3
4    B -->|权重 0.8| C1[Expert 1<br/>代码专家]
5    B -->|权重 0.2| C2[Expert 5<br/>逻辑专家]
6
7    B -.不激活.-> C3[Expert 2]
8    B -.不激活.-> C4[Expert 3]
9    B -.不激活.-> C5[Expert 4]
10
11    C1 --> D[加权合并输出]
12    C2 --> D
13    D --> E[最终输出]
14
15    style B fill:#FFD700
16    style C1 fill:#90EE90
17    style C2 fill:#90EE90
18    style C3 fill:#E0E0E0
19    style C4 fill:#E0E0E0
20    style C5 fill:#E0E0E0
21

关键要素解释:

  1. Router(路由器) - 根据输入内容选择最适合的专家(Top-1 / Top-2)
  2. Experts(专家) - 每个都是独立的 FFN 网络,拥有专属参数
  3. 选择性激活 - 只激活部分专家,其余专家在当前 token 不参与运算
  4. 加权合并 - 将激活专家的输出按权重求和

2.2 完整 Transformer 层结构

1flowchart TB
2    subgraph "传统 Transformer 层"
3        A1[Input] --> A2[Multi-Head Attention]
4        A2 --> A3[Add & Norm]
5        A3 --> A4[Dense FFN<br/>所有参数激活]
6        A4 --> A5[Add & Norm]
7        A5 --> A6[Output]
8    end
9    
10    subgraph "MoE Transformer 层"
11        B1[Input] --> B2[Multi-Head Attention]
12        B2 --> B3[Add & Norm]
13        B3 --> B4{MoE Layer<br/>路由器选择}
14        B4 --> B5[Expert 1]
15        B4 --> B6[Expert 2]
16        B4 -.-> B7[Expert N]
17        B5 --> B8[Sparse Activation<br/>仅部分专家激活]
18        B6 --> B8
19        B7 -.-> B8
20        B8 --> B9[Add & Norm]
21        B9 --> B10[Output]
22    end
23    
24    style A4 fill:#FFB6C1
25    style B4 fill:#87CEEB
26    style B8 fill:#90EE90
27

对比要点:

  • 传统模型:FFN 层所有参数都参与计算
  • MoE 模型:用多专家 + 路由器替代 Dense FFN

3. Dense 模型 vs MoE 模型:显存与计算对比

3.1 什么是 Dense(稠密模型)

Dense = 所有参数全部参与推理

1graph LR
2    A[输入] --> B[Layer 1<br/>32B 参数]
3    B --> C[Layer 2<br/>32B 参数]
4    C --> D[Layer 3<br/>32B 参数]
5    D --> E[输出]
6    
7    style B fill:#FF6B6B
8    style C fill:#FF6B6B
9    style D fill:#FF6B6B
10

示例:

  • Qwen2.5-32B Dense
    • 推理时 32B 全激活
    • 显存占用 60+ GB(FP16)
    • 性能强但成本高

显存对比表:

模型FP16FP8INT8INT4
Qwen3 Dense 32B(全激活)60+ GB30 GB28 GB15 GB
Qwen3 MoE 30B(激活 ~3B)6 GB3 GB3 GB1.5 GB

👉 MoE 推理显存 ≈ Dense 的 1/10~1/20


3.2 什么是 MoE(混合专家模型)

MoE = 总参数大,但每次只激活少量专家

1graph TB
2    A[Input] --> B[Layer 1<br/>Total Params 30B]
3    B --> C{Router<br/>Select Top-2}
4
5    C -->|Active| D1[Expert 1<br/>1.5B]
6    C -->|Active| D2[Expert 5<br/>1.5B]
7    C -.-> D3[Other Experts<br/>Not Activated<br/>27B]
8
9    D1 --> E[Merge Output]
10    D2 --> E
11    E --> F[Next Layer]
12
13    style D1 fill:#90EE90
14    style D2 fill:#90EE90
15    style D3 fill:#E0E0E0
16
17

示例:

  • Qwen1.5-MoE-33B
    • 总参数:33B
    • 激活专家:Top-1(约 3B)
    • 显存占用:~6GB(FP16)
    • 推理成本 ≈ 3B Dense 模型

3.3 显存占用对比表(重要!)

Qwen3 32B Dense & Qwen3 30B MoE 为例:

模型配置FP16(全精度)FP8INT8INT4
Qwen3 Dense 32B(全参数激活)60+ GB~30 GB~28 GB~15 GB
Qwen3 MoE 30B(激活 3B)~6 GB~3 GB~3 GB~1.5 GB
1gantt
2    title 显存占用对比(GB)
3    dateFormat X
4    axisFormat %s
5    section 30B 模型
6    FP16  :0, 60
7    FP8   :0, 30
8    INT8  :0, 28
9    INT4  :0, 15
10    section 3B 模型
11    FP16  :0, 6
12    FP8   :0, 3
13    INT8  :0, 3
14    INT4  :0, 1.5
15

结论:

MoE 推理显存消耗 ≈ Dense 的 1/10

原因:

  • Dense:所有层、所有参数都要参与计算
  • MoE:每层只用少数专家(如激活 3B)

这就是为什么 30B MoE 可以在消费级显卡运行


4. MoE 的关键概念

4.1 专家数量(Experts)

1mindmap
2  root((MoE 专家池<br/>16 个专家))
3    Expert 1
4      推理能力
5      逻辑分析
6    Expert 2
7      创意写作
8      故事创作
9    Expert 3
10      数学计算
11      公式推导
12    Expert 4
13      代码生成
14      算法实现
15    Expert 5
16      语言翻译
17      多语言理解
18    Expert 6~16
19      其他领域
20      动态分工
21

专家分工示例:

  • Expert 1:推理、逻辑分析
  • Expert 3:数学、计算
  • Expert 5:代码生成
  • Expert 7:语言翻译
  • Expert 10:创意写作

4.2 Top-K(激活专家数量)

1flowchart LR
2    A[输入 Token] --> B{Router 打分}
3    B --> C[专家得分排序]
4    
5    subgraph "Top-1 策略"
6        C --> D1[选择得分最高的 1 个专家]
7        D1 --> E1[速度最快<br/>成本最低]
8    end
9    
10    subgraph "Top-2 策略"
11        C --> D2[选择得分最高的 2 个专家]
12        D2 --> E2[性能更好<br/>成本适中]
13    end
14    
15    style D1 fill:#90EE90
16    style D2 fill:#87CEEB
17

常见配置:

  • Top-1:每次激活 1 个专家(速度快)
  • Top-2:每次激活 2 个专家(性能好)

4.3 参数关系图

1graph TB
2    A[MoE 模型<br/>总参数 30B] --> B[共 16 个专家]
3    B --> C1[Expert 1<br/>1.9B 参数]
4    B --> C2[Expert 2<br/>1.9B 参数]
5    B --> C3[Expert 3<br/>1.9B 参数]
6    B --> C4[...]
7    B --> C5[Expert 16<br/>1.9B 参数]
8    
9    D[推理时 Top-1] --> E[只激活 1 个专家<br/>约 3B 参数]
10    E --> F[其余 15 个专家<br/>不参与计算]
11    
12    style E fill:#90EE90
13    style F fill:#E0E0E0
14

关键公式:

1总参数 = 专家数量 × 单专家参数 + 共享参数
2激活参数 = Top-K × 单专家参数 + 共享参数
3推理成本  激活参数(而非总参数)
4

5. 常见疑问:没激活的专家是不是浪费?

❌ 错误理解

1flowchart LR
2    A[用户提问] --> B[激活 Expert 4<br/>代码专家]
3    B --> C[其他 15 个专家<br/>完全没用?]
4    
5    style C fill:#FFB6C1
6

✅ 正确理解

1flowchart TB
2    A[MoE 专家池] --> B[不同任务触发不同专家]
3    
4    B --> C1[任务 1: 写代码<br/>触发 Expert 4]
5    B --> C2[任务 2: 数学题<br/>触发 Expert 3]
6    B --> C3[任务 3: 翻译<br/>触发 Expert 7]
7    B --> C4[任务 4: 创作<br/>触发 Expert 2]
8    
9    C1 --> D[所有专家都会被使用<br/>只是时机不同]
10    C2 --> D
11    C3 --> D
12    C4 --> D
13    
14    style D fill:#90EE90
15

真相:

  1. 训练时 - 所有专家都会被激活并学习
  2. 推理时 - 根据任务动态选择最合适的专家
  3. 长期使用 - 每个专家都会在各自擅长的领域发光

类比:

🏥 医院有 16 个科室,你看病只挂 1 个科室,但其他科室不是浪费,而是在服务其他患者。


6. Qwen3(Dense / MoE)部署推荐方案

场景分析

1flowchart TD
2    A[你的硬件条件?] --> B{显卡显存}
3    
4    B -->|24GB 消费级| C[推荐方案 1]
5    B -->|48GB 专业卡| D[推荐方案 2]
6    B -->|80GB+ 服务器| E[推荐方案 3]
7    
8    C --> C1["Qwen3-14B Dense FP8 显存: ~14GB 性能: 强"]
9    C --> C2["Qwen1.5-MoE-33B INT4 显存: ~1.5GB 性能: 中上"]
10    
11    D --> D1["Qwen3-32B Dense FP8 显存: ~30GB 性能: 极强"]
12    
13    E --> E1["Qwen3-72B Dense FP8 显存: ~72GB 性能: 顶级"]
14    
15    style C1 fill:#90EE90
16    style C2 fill:#87CEEB
17    style D1 fill:#FFD700
18    style E1 fill:#FF6B6B
19

方案 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 训练流程图

1sequenceDiagram
2    participant D as 训练数据
3    participant R as Router<br/>路由器
4    participant E1 as Expert 1
5    participant E2 as Expert 2
6    participant L as Loss<br/>损失函数
7    
8    D->>R: 输入 Token
9    R->>R: 计算专家得分
10    R->>E1: 激活 (权重 0.7)
11    R->>E2: 激活 (权重 0.3)
12    E1->>L: 输出 O1
13    E2->>L: 输出 O2
14    L->>L: 计算任务损失<br/>+ 负载均衡损失
15    L-->>E1: 反向传播更新
16    L-->>E2: 反向传播更新
17    L-->>R: 更新路由参数
18

7.2 路由器训练机制

1flowchart TB
2    A[输入 Token 表示] --> B[Router 小型网络<br/>Linear + Softmax]
3    B --> C[输出专家概率分布]
4    
5    C --> D{Top-K 选择}
6    D --> E1[专家得分: 0.35]
7    D --> E2[专家得分: 0.28]
8    D --> E3[专家得分: 0.15]
9    D --> E4[其他专家...]
10    
11    E1 --> F[选择 Top-2]
12    E2 --> F
13    
14    F --> G[+ 负载均衡损失<br/>防止专家偏向]
15    
16    style G fill:#FFD700
17

训练优化:

  1. 使用 Softmax + Top-K
  2. 加入 负载均衡(Load Balancing)损失项
  3. 确保专家不会"偏向性过强"

7.3 专家特化过程

1flowchart LR
2    A[训练初期<br/>专家无明显分工] --> B[中期<br/>逐渐形成偏好]
3    B --> C[后期<br/>专家特化完成]
4    
5    subgraph "训练初期"
6        A1[Expert 1<br/>通用能力]
7        A2[Expert 2<br/>通用能力]
8        A3[Expert 3<br/>通用能力]
9    end
10    
11    subgraph "训练后期"
12        C1[Expert 1<br/> 代码专家]
13        C2[Expert 2<br/> 数学专家]
14        C3[Expert 3<br/> 创意专家]
15    end
16    
17    A1 -.演化.-> C1
18    A2 -.演化.-> C2
19    A3 -.演化.-> C3
20    
21    style C1 fill:#90EE90
22    style C2 fill:#87CEEB
23    style C3 fill:#FFB6C1
24

关键训练技术:

  • OBST(One-Batch Selective Training)
  • GShard(Google)
  • Switch Transformer(Google)
  • DeepSpeed-MoE(微软)

7.4 防止专家闲置的机制

1mindmap
2  root((防止专家闲置))
3    负载均衡损失
4      惩罚过度使用某个专家
5      奖励使用冷门专家
6    多任务训练
7      覆盖不同领域数据
8      确保每个专家有用武之地
9    随机噪声
10      路由器添加随机扰动
11      增加专家激活多样性
12    Expert Dropout
13      训练时随机丢弃专家
14      强制其他专家学习
15

结果: 所有专家都有机会参与训练,不会出现"活跃专家"和"僵尸专家"。


8. 完整知识体系总结

1mindmap
2  root((MoE核心知识))
3    基础概念
4      多专家结构
5      稀疏激活
6      路由机制
7    参数关系
8      总参数不等推理成本
9      激活参数定成本
10      显存占用1/10
11    模型对比
12      Dense全激活
13      MoE选激活
14      性能成本权衡
15    训练机制
16      路由器训练
17      专家特化
18      负载均衡
19    部署方案
20      消费级14B
21      专业级32B
22      企业级72B
23    优势
24      大模型能力
25      小模型成本
26      领域特化
27

9. 十句话掌握 MoE

  1. MoE = 多专家结构,每次只激活少数专家
  2. 总参数(如 30B)≠ 推理成本
  3. 推理成本 ≈ 激活参数(如 3B)
  4. Dense = 全部激活,性能强但成本高
  5. MoE = "大模型能力 + 小模型成本"
  6. INT4/FP8 是量化技术,与 MoE 架构无关
  7. INT4 省显存但会略降性能
  8. MoE 不会浪费参数,未激活专家会在其他任务中使用
  9. Qwen3-14B Dense FP8 是最稳健的部署方案
  10. Qwen-MoE 系列适合显存 4GB~24GB 的场景

10. 个人快速决策指南

1flowchart TD
2    Start[开始选择模型] --> Q1{你的显存?}
3    
4    Q1 -->|4-8GB| A1[Qwen1.5-MoE-33B INT4<br/>显存: 1.5GB<br/>性能: 中上]
5    Q1 -->|12-16GB| A2[Qwen3-7B Dense FP8<br/>显存: 7GB<br/>性能: 中]
6    Q1 -->|20-24GB| A3{优先什么?}
7    Q1 -->|40GB+| A4[Qwen3-32B Dense FP8<br/>显存: 30GB<br/>性能: 极强]
8    Q1 -->|80GB+| A5[Qwen3-72B Dense FP8<br/>显存: 72GB<br/>性能: 顶级]
9    
10    A3 -->|性能| B1[Qwen3-14B Dense FP8<br/>显存: 14GB<br/>性能: 强]
11    A3 -->|兼顾| B2[Qwen3-14B Dense INT4<br/>显存: 7GB<br/>性能: 强]
12    
13    style A1 fill:#87CEEB
14    style B1 fill:#90EE90
15    style A4 fill:#FFD700
16    style A5 fill:#FF6B6B
17

附录:参考资源

官方文档:

部署工具:

  • vLLM
  • Ollama
  • llama.cpp


大模型 MoE,你明白了么?》 是转载文章,点击查看原文


相关推荐


使用 useSearchParams 同步 URL 和查询参数
mCell2025/12/2

同步至个人站点:useSearchParams 使用 useSearchParams 同步 URL 和查询参数 在开发 React 应用时,我们经常遇到一种场景:用户在搜索框输入关键词,筛选出一个列表,然后希望把这个结果分享给同事。 如果我们将筛选条件仅仅保存在组件的 useState 中,一旦刷新页面或复制链接,这些状态就会丢失,用户看到的只能是初始页面。 为了解决这个问题,我们需要将状态“提升”到 URL 的查询参数(Query Params)中。在 React Router v6 中,u


Node.js 编程实战:文件读写操作
程序员爱钓鱼2025/12/19

在后端开发中,文件读写是非常常见的需求,例如日志记录、配置文件管理、上传文件处理以及数据导入导出等。Node.js 提供了内置的 fs(File System)模块,使得我们可以高效地与文件系统进行交互。理解并掌握 Node.js 的文件读写方式,是每一个 Node.js 开发者的必备基础。 一、fs 模块简介 fs 模块是 Node.js 的核心模块之一,无需额外安装即可直接使用。它提供了同步和异步两套 API,用于完成文件的创建、读取、写入、删除以及目录操作等功能。 在实际开发中,Nod


前端开发者使用 AI 的能力层级——从表面使用到工程化能力的真正分水岭
月亮有石头2025/12/28

很多前端开发者已经在“使用 AI”: 会问问题、会让 AI 写代码、甚至在 IDE 里和 AI 对话。 但如果这些使用方式 无法稳定地产出可运行、可验证、可回归的工程结果, 那么严格来说——其实还没有真正入门。 这篇文章想系统回答一个问题: 前端开发者“使用 AI”的能力,是有明确层级和分水岭的。 不是工具多不多,也不是模型新不新, 而是:你用 AI 的方式,决定了它在你工程体系里的角色。 把 AI 放进工程链路,用工程约束对抗幻觉,用验证与反馈逼近真实。 AI 工程化的本质,并不是让模型


Rust 的 `PhantomData`:零成本把“语义信息”交给编译器
Pomelo_刘金2026/1/5

在写底层 Rust(尤其是 unsafe / 裸指针 / FFI)时,你会遇到一种常见矛盾: 运行时:你手里可能只有一个 *const T / *mut T / *mut c_void(比如外部库返回的句柄),结构体里并没有真正存放某个引用或某个类型的值。 编译期:你又希望编译器知道“我这个类型和某个生命周期/类型绑定”,从而帮你做借用检查、推导 Send/Sync、避免错误混用等。 std::marker::PhantomData<T> 就是为了解决这个问题而存在的工具。官方文档的核心定义


【计算机网络 | 第三篇】MAC地址与IP地址
YYYing.2026/1/14

目录 MAC地址 一、MAC地址的格式特征 二、MAC地址的获取 三、什么是ARP? 四、ARP缓存 五、RARP IP地址 一、为什么要有IP地址? 二、既然IP地址存在,那它的意义是什么? 三、那又如何表示呢? 1、IP地址的定义 2、IPv4地址的表示方法 2.1、IPv4地址的分类编址方法 2.2、IPv4地址的划分子网编址方法 2.2.1、为什么要划分子网? 2.2.2、怎么划分子网? 2.2.3、总结 2.3、IPv4地址的无分类编址方法 3、构


RPC分布式通信(3)--RPC基础框架接口
陌路202026/1/22

一、MprpcApplication 核心职责 MprpcApplication是 RPC 框架的 “管家”,核心作用: 单例模式:全局唯一实例,避免重复初始化; 配置加载:解析 RPC 框架的配置文件(如服务器 IP、端口、日志路径、注册中心地址等); 框架初始化:启动时初始化日志、网络、注册中心等核心组件; 全局参数访问:提供接口获取配置参数(如获取服务器端口、注册中心地址); 框架销毁:程序退出时释放资源。 二、MprpcApplication 核心接

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客