19. MoE 混合专家模型是什么?DeepSeek V3、Qwen 为什么用 MoE?

我理解 MoE(Mixture of Experts,混合专家模型)的核心思想是把传统 Transformer 中的 FFN(前馈网络)层替换成 N 个并行的「专家网络」,再加一个 Router 来决定每个 token 进哪个专家。

核心设计哲学是「总参数大,但激活参数小」。比如 DeepSeek V3 总参数 671B,但每个 token 推理时只激活 37B(约 1/18)。这样能用「总参数 671B 的知识量」+「激活参数 37B 的推理成本」,达到 Dense 模型做不到的「学得多 + 跑得快」。

具体看 MoE 三个核心组件。

1. 多个专家(Experts):把 Transformer 每层的 FFN 复制 N 份(典型 N=8、64、256),每份就是一个独立的「专家」,在训练中各自学到不同的「擅长方向」(语言、代码、数学、知识等)

2. Router(路由器):每个 token 进到 MoE 层时,Router 算一个「专家偏好分数」,决定这个 token 该去哪个专家。最常见的是 Top-K 路由(K=1 或 K=2),DeepSeek V3 是 Top-8 + 1 个共享专家

3. 负载均衡:训练时要加辅助损失防止「专家不平衡」(Router 偏爱某几个专家,其他专家没被训过),保证所有专家都在学

为什么 DeepSeek V3、Mixtral、部分 Qwen 模型都在用 MoE?

  • 训练性价比高:同样算力下训出来的 MoE 模型,效果接近一个大 Dense 模型,但参数总量是 Dense 的 5-20 倍
  • 推理成本可控:每个 token 只用一小部分参数,推理速度和小 Dense 模型相当
  • 可扩展性强:要增加模型容量,加专家数比加层数容易

但 MoE 也有挑战:训练难度高(专家不平衡、Router 训不稳、并行化复杂);显存占用高(虽然激活只用 37B,但所有专家的参数都要加载到显存,671B 全量);推理时通信开销(分布式部署时专家分散在多张 GPU,token 路由有跨卡通信)。

MoE 是 2024-2026 年大模型最重要的架构方向之一,DeepSeek V3、DeepSeek R1、Mixtral、Grok、部分 Qwen MoE 模型都用了这条路线。但它不是唯一答案,很多主力 Dense 模型依然在生产里很常见,尤其是中小规模和部署稳定性优先的场景。

MoE 是什么?为什么 Dense 模型不够用了

要理解 MoE,得先看清楚传统 Dense 模型的瓶颈。

Dense 模型(标准 Transformer)的特点是:每个 token 推理时,都要走一遍模型的全部参数。一个 175B 的 GPT-3,每生成一个 token 都要让 175B 个参数全部参与计算。

这就带来一个棘手的权衡:

直观的类比:Dense 像一本厚厚的百科全书,你查一个词要把整本书过一遍;MoE 像一个图书馆,前台咨询员(Router)听到你的问题,告诉你去 3 楼的「数学专家区」就好,不用整个图书馆都搜索。

  • 想提升模型能力,得加参数(更多知识、更强推理)
  • 但参数加倍,推理成本(计算量 + 显存 + 延迟)也加倍
  • 一台 8 卡 H100 服务器,能跑动 70B Dense 模型,但跑不动 175B

    MoE 的核心创新是打破「知识量」和「推理成本」的绑定。它的思路是:

  • 模型有 N 个专家,每个专家是一份独立的 FFN
  • 每个 token 进来时,Router 只挑 K 个专家来处理(K 远小于 N)
  • 总参数量 = N × 单专家参数量,知识量很大
  • 激活参数量 = K × 单专家参数量,推理成本只有总参数的 K/N

这个设计让 MoE 在「同样推理成本下,参数量可以做到 Dense 的几倍甚至几十倍」。这就是 MoE 现在大火的根本原因。

MoE 的三个核心组件

理解了核心思想,下面拆解 MoE 的三个具体组件。

1. 多个专家(Experts)

MoE 把 Transformer 每一层的 FFN 替换成 N 个并行的 FFN。每个 FFN 结构完全一样,但参数独立,在训练中各自学会不同的「擅长方向」。

具体专家数 N 的选择是个工程权衡:

N 太小(比如 N=4):专家不够细分,效果接近 Dense N 太大(比如 N=512):每个专家太小、太专门,难以学到通用能力 业界主流:N=8(Mixtral)、N=64(早期 GShard)、N=256(DeepSeek V3)

2. Router(路由器)

Router 是 MoE 最关键的组件,决定每个 token 该去哪个专家。结构通常是一个简单的线性层:

每个专家学到的「擅长方向」不是预先指定的,而是在训练中自然涌现的。研究者发现训练后的专家会自发分化:有的专家偏向数学符号、有的偏向代码语法、有的偏向常用语言、有的偏向稀有词汇等等。

Qwen 系列

Grok 1(314B / 78.5B)

Mixtral 8x7B(早期主流配置)

  • K=1(Switch Transformer 风格):每个 token 只去 1 个专家,最稀疏,效率最高
  • K=2(Mixtral 风格):每个 token 去 2 个专家,效果和效率折中
  • K=8(DeepSeek V3):用更多专家,配合 256 个细粒度专家

    3. 负载均衡损失

    朴素的 Router 训练有个著名问题:专家不平衡(Expert Imbalance)

    什么意思?训练初期 Router 是随机的,可能偶然几个专家分数高、被选中、得到训练;其他专家分数低、不被选中、不更新参数;下一轮还是那几个高分专家被选中、继续被训;恶性循环之后,整个模型只用 1-2 个专家在工作,其他专家躺平。

    为了解决这个问题,MoE 训练时要加一个负载均衡损失(Load Balancing Loss)

    这个损失项把「专家使用率不均」的方差作为惩罚加进总损失,迫使 Router 把任务均匀分配给所有专家。α 是个超参,平衡主任务和均衡性。

    DeepSeek V3 在这个基础上还提出了 Auxiliary-Loss-Free Load Balancing 策略,不用额外的辅助损失,而是动态调整每个专家的「偏置项」让负载自然均衡,进一步降低了对主任务的干扰。

    总参数 vs 激活参数:MoE 的设计哲学

    MoE 最反直觉、也最容易在面试踩坑的概念,是「总参数 vs 激活参数」的区别。

    注意三个反差:

    第一,总参数 671B vs 激活参数 37B。模型「学过的东西」按 671B 算(专家分化、覆盖各种领域),但「每个 token 实际算的」只有 37B。

    第二,显存占用按总参数走(1.3TB FP16,量化后约 350GB INT4)。所有专家都要常驻显存,不然 Router 路到没加载的专家就没法算。

    第三,推理速度按激活参数走。每个 token 只算 37B,所以 latency 接近 37B Dense 模型,而不是 671B

    这种「学得多 + 跑得快」的甜蜜组合,是 MoE 在 LLM 时代爆发的根本原因。Dense 模型走到 70B 量级已经是推理成本的极限,再往上 175B、500B、1T,推理几乎跑不起来;MoE 通过把激活参数控制在 37B-100B 这个区间,可以把总参数推到 600B、1T、甚至更多。

    主流 MoE 模型对比:DeepSeek V3、Mixtral、Qwen 各自的设计

    不同家公司的 MoE 设计哲学差别挺大。来看几个代表:

    DeepSeek V3 / R1(256 专家细粒度路由)

  • 总参数 671B / 激活 37B(5.5% 激活率)
  • 每层 256 个 routed experts + 1 个 shared expert
  • 每个 token 选 Top-8 routed + 1 shared = 9 个专家激活
  • 设计哲学:专家越多越细分,激活更细粒度
  • 创新点:MLA(Multi-head Latent Attention)+ Auxiliary-Loss-Free 负载均衡
  • 总参数约 47B / 激活约 13B(28% 激活率)
  • 每层 8 个 experts,每个 token 选 Top-2 激活
  • 设计哲学:专家少而精,激活率较高保证质量
  • 是 2023 年开源 MoE 的标杆
  • Qwen MoE 30B-A3B:30B 总参数 / 3B 激活(10% 激活率)
  • 类似 DeepSeek 的细粒度专家路线
  • 注重小激活参数下的性能
  • xAI 早期开源的 MoE,激活率较高(25%)
  • 设计相对保守,没有 DeepSeek 那么激进

观察这些模型,能看出 MoE 设计的几个趋势:

专家数越来越多:8 -> 64 -> 256 激活率越来越低:28% -> 10% -> 5.5% 共享专家越来越普及:DeepSeek V3 引入 1 个 shared expert,避免常见知识被反复学

这个趋势的内在逻辑是「更细粒度的稀疏化 = 更高的算力性价比」。256 个专家、激活 5%,相当于一个总参数极大但每次只用一小撮的智能图书馆。

MoE 的三大训练挑战

MoE 看起来很美,但训练起来比 Dense 难得多。三个最大的坑:

挑战 1:专家不平衡

前面讲过,Router 容易陷入「只用几个专家」的恶性循环。除了负载均衡损失,业界还发展出几种应对:

Router 是个分类网络(要选 Top-K 专家),梯度通过 softmax + topk 这两个不可微操作传播,本身就不稳定。常见的稳定化技巧:

挑战 3:分布式并行复杂

MoE 模型的并行方式比 Dense 复杂得多。Dense 只用 Tensor Parallel + Pipeline Parallel 就够了,MoE 还要考虑:

挑战 2:Router 训练不稳定

  • Expert Choice Routing:反过来让专家挑 token,每个专家固定吃 N 个 token,自然平衡
  • Auxiliary-Loss-Free:DeepSeek V3 用,动态调整专家偏置项,不引入额外损失
  • 温度退火:训练初期 Router 用高温采样(更随机),让所有专家都有机会被探索
  • Noisy Top-K Gating:训练时给 Router 输出加噪声,鼓励探索
  • Z-loss:限制 Router logits 的范数,防止极端化
  • Soft 路由 + Hard 路由切换:训练时用 soft(加权所有专家),推理时用 hard(只激活 Top-K)
  • Expert Parallel:不同专家分配到不同 GPU,token 在 GPU 之间路由
  • All-to-All 通信:每个 token 选了几个专家后,要把 token 发送到对应专家所在的 GPU,处理完再发回来。这是 MoE 训练通信开销最大的环节

通信开销让 MoE 在多机训练时效率打折扣。DeepSeek V3 的工程优化里有大量篇幅讲怎么把 All-to-All 通信和计算重叠(DualPipe 算法),是工程实力的体现。

MoE 的部署挑战

训练完之后,部署 MoE 还有自己的挑战。

挑战 1:显存占用按总参数走

虽然每个 token 只激活 37B,但所有 671B 参数都要加载到显存里(不然 Router 路由到没加载的专家就没法算)。这意味着 DeepSeek V3 部署需要至少 1.3TB FP16 显存(量化后约 350GB INT4),最少 8 卡 H100。这对很多企业来说是不小的硬件投入。

挑战 2:批量推理时通信开销大

单 token 推理 MoE 还行,但批量推理(一次处理几十个用户请求)时,不同 token 选不同专家,导致大量跨卡通信。这就是为什么 MoE 模型的「吞吐量」往往不如同等激活参数的 Dense 模型。

挑战 3:专家不均衡导致负载不均

部署时,如果某个专家热门(被很多 token 路由到),它所在的 GPU 就会过载,其他 GPU 空闲。需要动态负载均衡机制(专家迁移、复制热门专家等),这又是一个工程坑。

应对这些挑战,业界有一系列工具和优化(vLLM 的 MoE 并行支持、SGLang 的专家亲和性调度、TensorRT-LLM 的 MoE 优化),但整体来说,MoE 部署的技术成熟度还在快速演进。这也是为什么很多公司虽然喜欢 MoE 的训练性价比,但部署时还是选 Dense 模型的原因。

为什么 2024 年后 MoE 才在 LLM 领域火起来

最后一个值得讨论的问题:MoE 不是新东西,1991 年就有人提出,2017 Google 的 GShard 就用过 MoE 训过 600B 模型。为什么直到 2024 年 DeepSeek V3 才让整个圈子开始用 MoE?

三个原因:

1. 训练经验积累到位了

早期 MoE 训练极其不稳定(专家不平衡、Router 崩溃、loss 震荡),需要大量工程经验才能调好。2017-2023 年这几年里,Google、Meta、DeepSeek 等团队累积了一整套 MoE 训练 know-how(负载均衡、噪声路由、专家容量等),这些技术在 2024 年成熟到「开源社区也能复现」的程度。

2. 推理框架支持完善了

2023 年之前,主流推理框架对 MoE 的支持很差,部署困难。2024 年 vLLM、SGLang、TensorRT-LLM 都加入了 MoE 优化(专家并行、All-to-All 通信优化),让 MoE 模型能在生产环境跑起来。

3. DeepSeek V3 把成本打下来了

最关键的一击是 DeepSeek V3 在 2024 年底公开了一个 671B 总参数、37B 激活参数的 MoE 模型,并报告了非常低的训练成本和很强的效果。这让大家看到:MoE 不只是论文里的好方法,是真的能用更高的训练和推理性价比做出顶级模型。整个开源社区被点燃,2025 年之后越来越多大模型开始认真评估 MoE 路线。

到 2026 年,MoE 已经成为大模型架构的主流方向之一,但还不能说「几乎所有新模型都用 MoE」。Dense 模型依然有很强生命力,尤其在 1B-70B 这类部署稳定、延迟敏感、工程复杂度要低的场景。更稳的说法是:MoE 适合把总容量做大、把激活成本压低;Dense 适合部署简单、负载稳定、延迟可控

🎯 面试总结

回到开头那段对话,问到 MoE,最重要的是先把核心思想讲清楚。MoE 把 Transformer 中的 FFN 复制成 N 份「专家」,加一个 Router 选 Top-K 个来处理每个 token。最关键的设计哲学是总参数 vs 激活参数解耦:训练时学 N 倍知识,推理时只用 K/N 的算力。这一句先点出来,就抓到了 MoE 的本质。

接下来把三个核心组件讲清。多个专家(学到不同擅长方向,比如代码、数学、中文等)、Router(一个简单的线性层算分 + Top-K 选取)、负载均衡损失(防止 Router 偏爱某几个专家让其他专家躺平)。其中专家不平衡是 MoE 训练最著名的难题,DeepSeek V3 用 Auxiliary-Loss-Free 策略(动态调专家偏置项不引入额外损失)进一步优化,是 2024 年的工程亮点。

然后举具体的主流模型对比。DeepSeek V3 用 256 个专家、激活 9 个(Top-8 routed + 1 shared),671B / 37B、激活率 5.5%;Mixtral 8x7B 用 8 专家激活 2 个,47B / 13B、激活率 28%。趋势是「专家越来越多、激活率越来越低」,更细粒度的稀疏化带来更好的算力性价比。能背出 DeepSeek V3 的具体配置数字,会让面试官知道你真的看过论文。

最关键的一句话是讲清 MoE 的训练 + 部署挑战。训练上有专家不平衡、Router 不稳、All-to-All 通信复杂这些坑;部署上显存按总参数走、批量推理通信开销大、热门专家负载不均。能讲出「显存按总参数走,但推理速度按激活参数走」这一句反直觉但精确的话,面试官就知道你真的理解 MoE 在工程上的取舍。

如果还想再加分,可以指出 MoE 是 1991 年就有的老想法,2024 年之后因为「训练经验成熟 + 推理框架完善 + DeepSeek 把成本打下来」才在 LLM 领域真正爆发。它是主流方向,但不是唯一方向,这种「知道趋势,也知道边界」的表达会更像真实工程师。

20. 大模型部署有哪些主流方案?vLLM、TGI、llama.cpp、SGLang 实际项目里怎么选?

我理解大模型部署框架的本质问题是:怎么在固定的硬件上跑得更快、更省显存、支持更多并发用户?

主流框架按定位分四类。

1. vLLM:当前生产部署里很常见的框架,UC Berkeley 出品。核心创新是 PagedAttention,把 KV Cache 像操作系统虚拟内存一样分页管理,大幅减少碎片,显存利用率能明显提高。配合 Continuous Batching 实现很高的吞吐量,是很多团队部署 LLM API 时会优先评估的方案。

2. SGLang:vLLM 之后的新一代推理框架,LMSYS 出品。核心创新是 RadixAttention,把多请求的共享前缀(如 System Prompt、Few-shot 示例、对话历史)组织成树结构,相同前缀只存一份 KV Cache。在 Agent、多轮对话、批量 Prompt 场景下比 vLLM 显存更省、首 token 延迟更低。

3. TGI(Text Generation Inference):HuggingFace 出品,与整个 HF 生态深度集成。优点是开箱即用、支持各种 HF Hub 上的模型、企业级 API 接口(鉴权、metrics、健康检查)。但要注意它近两年的增长势头不如 vLLM / SGLang,选它更多是看中 HF 生态和既有系统集成,而不是追求极致性能。

4. llama.cppCPU / 边缘设备部署的事实标准。用 C++ 重写整个推理栈,配合 GGUF 量化文件格式,可以让 7B 模型在 MacBook Pro 上跑、在树莓派上跑、在手机上跑。是个人开发者和边缘部署的首选。

怎么选

  • 生产高吞吐 LLM API:vLLM 默认
  • Agent / 多轮对话 / Few-shot:SGLang 更省
  • 拥抱 HuggingFace 生态、企业级:TGI
  • 本地 / Mac / 边缘 / 无 GPU:llama.cpp
  • 极致性能、自家定制:TensorRT-LLM(NVIDIA 官方)

    部署框架解决的核心问题

    要理解为什么需要 vLLM、SGLang 这些专门的部署框架,得先看看「直接用 transformers 库跑模型」会有什么问题。

    最朴素的部署方式是写个 Python 脚本,加载 HF transformers 的 AutoModelForCausalLM,调 model.generate()。能跑起来,但效率会很糟糕,三个核心痛点:

    1. KV Cache 显存碎片严重

    每来一个请求,朴素实现会预分配「最大可能长度」(比如 4096 tokens)的 KV Cache 显存。但实际上大多数请求只用 200-500 tokens,剩下的 3500+ tokens 显存就空着浪费了。一台 80GB H100 理论能跑 100 个并发请求,实际只能跑 30 个,显存白白浪费 60-70%。

    2. 批量推理调度低效

    朴素批量处理(static batching)是「凑齐 N 个请求一起跑、所有请求一起结束」。但每个请求生成长度不同(有的 50 tokens 就完了、有的要 1000 tokens),短的请求等长的请求,GPU 大量时间在「跑了一半在等」。吞吐率上不去。

    3. 重复计算

    如果每个用户都用同一段 System Prompt(比如 1000 tokens 的产品知识库),朴素实现每次都要重新算这 1000 tokens 的 KV Cache,浪费极大。

     

    部署框架就是为了解决这三个痛点。三大优化方向:内存高效(显存碎片)+ 批量调度(吞吐率)+ 缓存复用(重复计算)。每个主流框架在这三个方向上都有自己的创新。

    vLLM 与 PagedAttention:操作系统虚拟内存的灵感

    vLLM 是 UC Berkeley 在 2023 年开源的推理框架,一出来就把行业标准提了一个量级。核心创新是 PagedAttention

    PagedAttention 的灵感来自操作系统的虚拟内存(Virtual Memory)

    操作系统怎么管理内存?不是给每个进程预分配大块连续物理内存(这样会有大量碎片),而是把物理内存切成固定大小的「页(Page)」,每个进程拿到的是「逻辑地址」,通过页表(Page Table)映射到真实的物理页。这样物理内存可以充分利用,不浪费。

    PagedAttention 把这个思路搬到 KV Cache 上:

  • 把 GPU 显存切成固定大小的「Block」(典型大小 16 个 token 的 KV)
  • 每个请求拿到的是「逻辑 KV 序列」,由一张 Block Table 映射到具体的物理 Block
  • 一个请求实际用了 200 tokens 就只占 13 个 Block(200/16),用完即释放
  • 没有「预分配 4096 但只用 200」的浪费

    实战中常见的几个误用陷阱

    误用 1:用 vLLM 跑 Agent 多轮对话

    Agent 场景前缀重复率高,vLLM 没有 RadixAttention 优化,每次重新算 KV Cache 浪费大量算力。改用 SGLang 后首 token 延迟降 2-3 倍。

    误用 2:用 llama.cpp 做高并发服务

    llama.cpp 的批量调度比 vLLM 弱很多,并发上去后吞吐率瓶颈。生产 API 服务还是要用 GPU + vLLM。

    误用 3:用 TGI 追求绝对性能

    如果你的瓶颈是 GPU 吞吐量,TGI 通常不是第一选择,应该优先评估 vLLM、SGLang 或 TensorRT-LLM。具体差距会随模型、硬件、量化方式和 batch 策略变化,不要死记一个固定百分比。

    误用 4:用 TensorRT-LLM 做快速 POC

    TensorRT-LLM 部署需要先编译 engine(每个模型 / GPU 组合都要编译),不适合「快速试验、模型经常换」的场景。

    部署的三大隐藏陷阱

    最后讲三个具体上线时容易踩的坑,作为面试加分项。

    陷阱 1:显存碎片在长上下文场景下还是会出现

    PagedAttention 大幅缓解了显存碎片,但不是完全消除。当请求长度极不均匀(有的 100 tokens、有的 100K tokens),仍然会有 5-10% 的碎片。应对:监控 GPU 显存利用率,如果跌破 70% 考虑加 swap 或调整 max-model-len。

    陷阱 2:KV Cache 量化的支持差异大

    权重量化(FP16 -> INT4)很多框架都支持,但 KV Cache 量化(FP16 -> INT8 / FP8 / INT4)的支持差异很大,而且版本迭代很快。vLLM、SGLang、TensorRT-LLM 都在持续增强这块能力,TGI 和 llama.cpp 的支持方式也要看具体版本。如果你的瓶颈是长上下文 KV Cache 显存,选型前一定要查当前版本文档,别只听别人说「支持」。

    陷阱 3:MoE 模型的部署支持差异

    MoE 模型(DeepSeek V3、Mixtral)部署比 Dense 复杂得多(需要专家并行、All-to-All 通信优化)。vLLM 和 SGLang 都支持但配置复杂;llama.cpp 通过 GGUF 支持但性能一般;TensorRT-LLM 支持最好但工程门槛高。如果要部署 MoE 模型,建议先在测试环境跑通再上生产。

    回到开头那段对话,问到部署方案,最重要的是先讲清楚部署框架解决什么问题。直接用 transformers 库部署有三大痛点:显存碎片严重、批量调度低效、共享前缀重复计算。每个主流框架的核心创新都是攻击这些痛点的某个维度。这一层铺垫先讲到,面试官就知道你不是在背工具,是真的理解部署框架的设计动机。

    接下来把四个主流框架的核心创新讲明白。vLLM 的杀手锏是 PagedAttention(模仿操作系统虚拟内存的分页 KV Cache,把显存利用率从 30% 拉到 90%+),加上 Continuous Batching 让请求动态进出,是当前生产 API 的常见选择。SGLang 走的是另一条路,核心创新是 RadixAttention(共享前缀的 KV Cache 树),在 Agent 和多轮对话场景下经常能降低首 token 延迟。TGI 的特点是和 HuggingFace 生态深度集成,适合已有 HF 流程的团队。llama.cpp 是另一种风格,纯 C++ 重写 + GGUF 量化,是 CPU / Mac / 边缘部署的事实标准。

    然后给清晰的选型决策。生产 API 高吞吐选 vLLM;Agent / 多轮对话场景选 SGLang;HuggingFace 生态深用户选 TGI;本地 / Mac / 边缘部署选 llama.cpp;NVIDIA 集群追求极致性能选 TensorRT-LLM。能把「SGLang 在前缀共享场景比 vLLM 强」这一点说清楚,是面试加分项,因为这是 2024 年之后才出现的工程认知。

    最关键的是讲清部署陷阱:显存碎片在长上下文场景还会出现、KV Cache 量化各框架支持差异大、MoE 模型部署比 Dense 复杂得多。能讲到这一层,面试官就知道你真的踩过部署的坑。

    如果还想再加分,可以提一句 vLLM 和 SGLang 是「互补不替代」的关系,业内已经有公司开始混用(高吞吐路由用 vLLM,Agent 路由用 SGLang)。这种「一线工程视角」会让面试官印象深刻。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐