目录

大模型之Dense、MoE与量化

系列 - AIGC 必知必会

在前面 Embedding 的介绍中,我们对 LLM 的基础原理已经有了一定的了解,如果想自己尝试下本地跑大模型,光靠之前的那些知识还是不够的,这一篇为本地部署做准备,需要了解稠密模型 Dense、混合专家架构 MoE、模型的量化、模型蒸馏等基本概念。

我认为,大模型的基本原理应该纳入基本课程,如果稍微懂一些,也不至于发生那么多的用户和豆包的笑话,甚至都闹上法庭了 (ㆆᴗㆆ)

大模型的一些基本原理推荐参考 B 站的这个系列,本文也是参考了这个视频:BV1CgZABxEcy

现在的主流模型,基本都是推理模型,在特定方向例如翻译、总结等主流还是非推理。

“推理模型”里的“推理”,通常不是指像人类哲学家那样真正理解世界,而是指:更擅长把一个复杂问题拆成多步,在中间过程里做更长的计算,再给出答案的模型能力。

这个就是我们常说的深度思考,DeepSeek 把“推理模型”这个概念进一步推到大众视野里,让很多人更明显感受到“模型会先想一会儿再答”。

也就是推理模型更擅长多步问题,在复杂任务上会花更多计算。


但是非推理模型依然很重要,因为很多任务根本不需要“深度思考”,例如翻译、总结、改写、简单问答等等。

像之前的老模型,体感上虽然是直接输出结果,但其实也具备一定的推理能力,只是不明显暴露“思考阶段”;而现在的推理模型,把推理能力当成重点专项强化的模型。

推理模型调用上往往会需要传递一个推理强度参数,不传递未必是不推理,可能是用默认的推理强度而已;并且这个强度含义是给它更多思考额度,对于简单问题,依然是快速返回。

低推理像让一个人先凭经验快速回答;高推理像告诉他“可以多检查几遍再答”;对于简单问题,检查当然是非常快速的。

简单理解:每次回答问题时,整个大脑都会一起上班的模型。

问它一句话,模型内部几乎所有参数都会参与计算,不会只挑一小部分来用,即使大部分可能和问题无关,所以叫“稠密”。

如果想继续深入了解,可以跟着下面技术方向:

  • Linear(线性层)是一个“稠密计算单元”
  • FFN(前馈神经网络)是由多个 Linear 组成的“稠密模块”
  • 稠密模型则是“整体上大量使用这类稠密模块,而且每次推理都全部启用”

传统的 LLM,训练完后就是个复杂的神经网络,每次询问问题(推理时)输入会经过网络的大部分层和参数进行计算,我们不知道它内部是如何处理的,只知道输出的结果还算不错。

就像世间一切的规则道理、知识等等都蕴含在庞大的线性层参数(即所说的模型使用了多少参数量)之中。

大模型到最后基础还是数字/数学,无数参数共同塑造了一个高维函数,这个函数对输入模式有很强的拟合和泛化能力。

MoE 即 Mixture of Experts,谷歌早在 17 年就发表过相关论文,手握一大半的 AI 技术论文却无法好好利用 (ㆆᴗㆆ)

它做的事情很简单,就是拆!每次来一个输入,不是所有专家都一起干活;而是先有一个“路由器”挑出最合适的少数几个专家来处理(一次只激活其中一小部分)。

例如 DeepSeek V3 中,拆成了 256 个 FFN,当然拆不是乱拆的,每一个 FFN 都会擅长处理一类问题,像某个领域里的专家(Experts)。

每个专家对哪一类问题敏感并不是人们主动设计的,是在训练阶段形成的,这么说只是好理解,并且可以设置共享专家,即每个问题都会使用;

既然不是我们设计的,那么对于一个问题我们也就不知道要分给哪些专家,这个路由功能也是由一个 Linear 来负责,由它来判断需要哪些专家出场解决问题,它同样是在训练阶段就产生了。

例如一个问题经过路由层打分后按照比例分给 N 个专家,经过 N 个专家计算后的结果再按照对应比例组合,最终就是问题的输出,这个过程就是 Mixture;

这里不要纠结问题的拆分组合问题,因为 Embedding 后实际都是一些数字,我们无法理解,只是这样确实有效!

MoE 的特点就是总参数量做得非常大,但单次推理成本不一定跟总参数同比增长。

MoE 模型一般都会醒目的标注总参数量和激活参数量(active parameters),例如 Qwen3.6-MoE-35B-A3B,总参数 35B,但是每次只激活 3B。

优点:

  • 更省算力,相比同等总参数的稠密模型更高效
  • 更容易把总参数规模做大
  • 不同专家可能学到不同风格或能力分工
  • 在大规模训练里,性价比常常很好

缺点:

  • 路由不均衡:有些专家特别忙,有些专家几乎没活干
  • 训练不稳定:需要额外设计让专家负载更均匀
  • 通信开销大:多机训练/推理时,token 要被分发到不同专家
  • 专家塌缩:模型老是依赖少数几个专家
  • 部署更复杂:系统工程难度比稠密模型高

从原理上就可以看出,MoE 模型的训练和微调不是一般的小工作室可以完成的,所以不是技术特别强的个人或机构做的 MoE 很难超过同等甚至低参数量的稠密模型。

通常来说,2 倍参数量的 MoE 才能达到稠密模型的效果,但是 MoE 参与计算的参数量要远低于稠密模型,例如 67B 的 Dense 效果和 145B 的 MoE 效果相当,但是 MoE 下每次只需要激活 22B,而 Dense 下需要全量的 67B。

按照上述的规则,可以说是 MoE 用两倍的空间换了三倍的性能(速度);

所以会有人说 Qwen3.6-MoE-35B-A3B 实际上不如 27B 的 Dense 版本;当然这个还要看具体在什么场景下使用,有的人使用 MoE 版反而更好。

量化就是把模型里的数字,换成更省空间、更省算力的低精度表示。

例如我们常见的 FP16(16 位浮点数)、FP32(32 位浮点数),因为模型参数本质就是一大堆的数字,根据 Embedding 的原理,1.000001 换成 1 理论上也不会出太大的问题,所以就有了量化。

原始模型一般是 FP16、FP32 这一类,例如量化后的模型可能是 INT8、INT4 这种八位整数、四位整数,甚至更低;现在所说的量化一般是用 bit 位宽存储单位来表示,不是具体的 INT4 这种数字本身。

量化后的模型体积会大幅减小,意味着需要的显存也变少,推理速度变快,但同时质量也会下降(复杂任务可能更容易出错;数学、代码、长上下文任务有时更敏感)。

量化后的模型喜欢使用 Q 前缀(Quantization)表示,常见的有 Q4 / Q6 / Q8,表示的是大致用了多少 bit 来存参数,有时还会带上不同的量化方案后缀;

  • K:K-Quant,一种较新的量化分组方案,比老的 Q4_0 / Q4_1 更好,成熟的压缩格式
  • M:通常表示这个版本在一些张量上用了相对更“中等偏稳”的配置
  • I / IQ:代表另一套量化思路,I-Quant 系列更新、更聪明、压得更狠的一类压缩格式,分具体任务,不一定总是稳赢
  • NL:通常指某种非线性/特殊映射方式
  • XS:extra small 这一类更激进压缩倾向的变体名,类似的还要 XXS、XL
  • UD:一般表示 ultra dynamic,动态分配/更灵活保真,可以理解为重要区域少压一点,不重要区域多压一点

比较公认的是:Q4_K_M 往上,才算“比较不降智”的舒适区

但是以现在大模型的参数量(27B),Q4 量化也至少需要 20G 的显存,一般的消费级显卡不进行卸载很难跑的动。

量化体感质量适合场景降智感
Q2 / IQ2明显缩水尝鲜、速度优先、显存紧张明显
Q3 / IQ3可用,但会露怯日常聊天、简单问答、轻代码中等
Q4 / IQ4主流甜点位日常主力、中文、代码、推理较轻
Q5 / Q6接近原模型重度代码、复杂推理、长文很轻
Q8基本接近 FP16对质量敏感、评测、研究极轻

Q3 到 Q4 体感差距最大,Q4 会明显稳一档;后续的例如 Q4 到 Q5 有提升,但没那么夸张;Q6、Q8 更像“我就要尽量接近原模型”。

上面都是对传统稠密模型来说,MoE 就比较微妙,激活的专家如果非常符合你的使用场景,那么 Q3_S / Q3_K_M 有时表现会比你想象中好。

APEX(Adaptive Precision for EXpert Models,专家模型自适应精度),不是给整个模型统一用同一种量化精度,而是根据不同专家的重要性、敏感性,给不同部分分配不同精度。

因为 MoE 天生就有“模块化专家”结构,在稠密模型里,参数是大块混在一起的,所以 APEX 可以说是针对 MoE 的特化;尽量保住 MoE 模型效果,减少关键 expert 的损伤。

APEX 的优势在于 MoE 模型专属优化、极致显存效率、长上下文稳定性与推理速度,APEX 专为 MoE 混合专家模型设计,它的核心是“按模型组件敏感度分配精度”,而非单纯追求全局性能。

APEX 对 MoE 的门控网络用高精度(8/16位),对专家网络用低精度(2-4位),对投影层做动态精度调整。

这种“非均匀”分配精度会拉高全局量化损失,但能保住 MoE 的核心能力。这使得该策略在在 MoE 模型会显著优于普通量化。

MoE 模型的痛点是门控网络 + 多专家并行,普通量化会导致:门控决策错误(选到错误专家)、专家网络能力大幅下降、推理速度变慢(并行效率降低),APEX 门控网络用 8 位甚至 16 位量化,确保专家选择的准确性,对不同专家按任务敏感度分配精度,常用专家用 4 位,冷门专家用 2 位;

在 Carnice-MoE-35B 上,APEX 量化后 MMLU 分数比普通 Q4_K_M 高 3-5 分,接近 FP16 全精度水平。

通过这种选择性精度分配+专家激活优化,显存利用率提升 40-60%。推理速度比普通 K-quant 快 20-50%

对于 MoE 模型,尤其是 Q4 以下的,强烈使用 APEX。

CPU/GPU offload,这是 MoE 模型下的概念,把模型的一部分层放到 CPU 或 GPU 上算/存。

GPU offload layers = 卸载到 GPU 的层数,原本模型可能主要在 CPU 内存里跑,现在把前 N 层或若干层放到 GPU 显存里,让 GPU 来算。

比如 llama.cpp 里常见参数 --n-gpu-layers 35,意思大致就是:把 35 层 transformer block 放到 GPU 上执行。

如果模型太大,GPU 显存放不下完整模型,就可以一部分层放 GPU,速度快;剩下层留 CPU(实际是放内存),速度慢但能跑;层数越多放 GPU,通常越快,但越吃显存。

Transformer 中,一个模型通常由很多层组成,具体是哪几层、embedding 和 output head 怎么处理,取决于框架实现。

很多本地推理软件会给你一个选项:

  • GPU layers = 0:基本 CPU 跑
  • GPU layers = 一部分:CPU + GPU 混合跑
  • GPU layers = 最大值:尽量全放 GPU
  • GPU layers = -1:有些工具里表示自动或全部 offload 到 GPU

通常越多 GPU 层越快,但有上限,显存不够会报错或回退;除了模型本身,上下文越多也越占用显存,所以量力而行。

既然都是 Transformer,那就是稠密模型当然也可以卸载;因为每一层的参数每次都要参与计算。

所以如果某些层在 CPU 上,每个 token 都必须经过 CPU 部分,速度会被 CPU 层拖住。它没有 MoE 那种“只激活一部分专家”的天然稀疏性。

但是 MoE 也不一定效果就一定好,要看框架支持的卸载粒度,如果框架支持按专家/按热度卸载,那肯定是有提升的,要不然可能因为 MoE 参数更大路由复杂等问题速度更慢。

让一个小模型向一个大模型学习,蒸馏的目标是:让小模型尽量学到大模型的能力,但体积更小、推理更快、部署更便宜。

普通训练:输入 -> 标准答案;模型学习“给这个输入时,应该输出这个答案”。

蒸馏训练:输入 -> 大模型输出/概率分布/推理过程/偏好,小模型学习“大模型会怎么答”。

即:用大模型批量生成高质量训练数据,再拿这些数据训练小模型;蒸馏后的模型一般不会在整体能力上超过老师;但在某个特定任务上,有可能接近甚至超过老师的普通表现。

MTP 通常指 Multi-Token Prediction,也就是:多 token 预测;最新的 llama.cpp 已经支持。

它和普通 LLM 最大的区别是:普通模型每次主要预测“下一个 token”,而带 MTP 的模型会尝试同时预测未来多个 token。

MTP 会让模型在训练时不仅预测下一个 token,还预测更后面的 token;

  • 训练层面

    给模型更密集的学习信号,让它更好地建模未来 token 的连续结构。

  • 推理层面

    可以配合 speculative decoding、draft tokens 等技术,加速生成。

所以它通常需要模型在训练/架构上主动支持,MTP 只适用于 vLLM 支持的 MTP 模型家族;

MTP 效果是有的,尤其在可预测文本、小 batch 解码、框架优化好的情况下能明显提速;但它需要模型训练时或后训练时带有专门的 MTP 能力,普通模型不能直接开启,所以目前还属于逐步普及阶段。