大模型之Dense、MoE与量化
在前面 Embedding 的介绍中,我们对 LLM 的基础原理已经有了一定的了解,如果想自己尝试下本地跑大模型,光靠之前的那些知识还是不够的,这一篇为本地部署做准备,需要了解稠密模型 Dense、混合专家架构 MoE、模型的量化、模型蒸馏等基本概念。
我认为,大模型的基本原理应该纳入基本课程,如果稍微懂一些,也不至于发生那么多的用户和豆包的笑话,甚至都闹上法庭了 (ㆆᴗㆆ)
大模型的一些基本原理推荐参考 B 站的这个系列,本文也是参考了这个视频:BV1CgZABxEcy
推理模型
现在的主流模型,基本都是推理模型,在特定方向例如翻译、总结等主流还是非推理。
“推理模型”里的“推理”,通常不是指像人类哲学家那样真正理解世界,而是指:更擅长把一个复杂问题拆成多步,在中间过程里做更长的计算,再给出答案的模型能力。
这个就是我们常说的深度思考,DeepSeek 把“推理模型”这个概念进一步推到大众视野里,让很多人更明显感受到“模型会先想一会儿再答”。
也就是推理模型更擅长多步问题,在复杂任务上会花更多计算。
但是非推理模型依然很重要,因为很多任务根本不需要“深度思考”,例如翻译、总结、改写、简单问答等等。
像之前的老模型,体感上虽然是直接输出结果,但其实也具备一定的推理能力,只是不明显暴露“思考阶段”;而现在的推理模型,把推理能力当成重点专项强化的模型。
推理模型调用上往往会需要传递一个推理强度参数,不传递未必是不推理,可能是用默认的推理强度而已;并且这个强度含义是给它更多思考额度,对于简单问题,依然是快速返回。
低推理像让一个人先凭经验快速回答;高推理像告诉他“可以多检查几遍再答”;对于简单问题,检查当然是非常快速的。
稠密模型 Dense
简单理解:每次回答问题时,整个大脑都会一起上班的模型。
问它一句话,模型内部几乎所有参数都会参与计算,不会只挑一小部分来用,即使大部分可能和问题无关,所以叫“稠密”。
如果想继续深入了解,可以跟着下面技术方向:
- Linear(线性层)是一个“稠密计算单元”
- FFN(前馈神经网络)是由多个 Linear 组成的“稠密模块”
- 稠密模型则是“整体上大量使用这类稠密模块,而且每次推理都全部启用”
传统的 LLM,训练完后就是个复杂的神经网络,每次询问问题(推理时)输入会经过网络的大部分层和参数进行计算,我们不知道它内部是如何处理的,只知道输出的结果还算不错。
就像世间一切的规则道理、知识等等都蕴含在庞大的线性层参数(即所说的模型使用了多少参数量)之中。
大模型到最后基础还是数字/数学,无数参数共同塑造了一个高维函数,这个函数对输入模式有很强的拟合和泛化能力。
混合专家架构 MoE
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 量化
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 卸载
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
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 能力,普通模型不能直接开启,所以目前还属于逐步普及阶段。