大模型推理部署这件事真正做过一轮完整落地的人都知道最贵的从来不是显卡本身而是显存带宽和算力利用率之间的那笔账。Kimi 2.7 这类 MoE 架构的模型一出来参数总量动辄千亿级别但每个 token 实际激活的专家只占一小部分这就给量化留出了非常大的操作空间。W4A8 这个组合——权重 4 bit 存储、激活 INT8 计算——正是当下在显存占用和推理速度之间找平衡的一个热门方案。这篇内容适合两类人看一类是正在做模型部署、被显存卡住脖子的工程同学另一类是想搞清楚 4 bit 权重到底怎么和 INT8 激活配合、为什么不能全都压到 4 bit 的算法同学。我会从 MoE 的结构特点讲起把 W4A8 的拆解逻辑、量化粒度选择、反量化开销、实测中的坑一层层拆开说清楚。1. 为什么 MoE 架构特别适合做 W4A81.1 MoE 的稀疏激活到底省在哪里先把这个前提说透不然量化方案的选择就是空中楼阁。MoEMixture of Experts的核心机制是模型里有很多个专家网络FFN 层但每个 token 经过路由Router之后只会被分配到 top-k 个专家去计算。Kimi 2.7 这类模型专家总数可能上百但每个 token 实际激活的参数量可能只有总参数的十分之一甚至更少。这意味着什么意味着显存里必须装下全部专家权重但计算时只用到一小部分。这就产生了一个非常尴尬的矛盾显存占用由总参数量决定而计算量由激活参数量决定。你花大价钱买的显存大部分时间在待命但你又不能把它们删掉因为下一个 token 可能就路由到别的专家去了。所以 MoE 的量化诉求和 Dense 模型完全不同。Dense 模型量化主要是为了提速减少计算量而 MoE 量化首先是为了把全部专家塞进显存。这就是为什么权重压到 4 bit 对 MoE 来说收益极其明显——它直接决定了你能不能在一张卡上跑起来。1.2 权重 4 bit、激活 INT8 的分工逻辑很多人第一次听到 W4A8 会疑惑既然权重都能压到 4 bit为什么激活不也压到 4 bit搞个 W4A4 不是更省这里的关键在于权重和激活的分布特性完全不同。权重是训练完之后固定下来的分布相对稳定离群值outlier虽然存在但可以通过各种分组量化手段处理。而激活是随着输入动态变化的不同 token、不同层的激活分布差异极大而且激活里存在非常顽固的离群通道outlier channels这些通道的数值可能是其他通道的几十上百倍。如果你硬把激活也压到 4 bit那些离群值要么被截断导致精度崩盘要么把量化范围拉得特别大导致正常值全部被压成 0。实测下来激活量化到 4 bit 在多数模型上精度损失是灾难性的而 INT8 激活基本能做到无损或接近无损。所以 W4A8 的分工是权重用 4 bit 换显存激活用 INT8 保精度。这是一个经过大量实践验证的甜点组合。1.3 显存账本4 bit 权重到底省了多少我们来算一笔具体的账。假设一个 MoE 模型总参数量是 100B这里只是举例方便计算存储格式每参数字节总显存占用相对 FP16 节省FP162 字节200 GB基准INT81 字节100 GB50%W44 bit0.5 字节50 GB75%从 200 GB 降到 50 GB这个差距直接决定了你需要 4 张卡还是 1 张卡。对于 MoE 这种显存吃满、算力闲置的架构省下来的显存就是实打实的成本。但要注意4 bit 存储不是简单地把数值除以 16 就完事。它涉及到**量化分组、缩放因子scale、零点zero point**这些元数据的存储。如果分组太细元数据本身的开销就会吃掉一部分节省。这个后面会详细讲。2. W4A8 的量化拆解从浮点到 4 bit 的完整链路2.1 对称量化与非对称量化的选择量化的本质是把一个连续的浮点区间映射到有限的整数格点上。最基础的公式是q round(x / scale) zero_point x_dequant (q - zero_point) * scale对称量化里 zero_point 固定为 0量化范围是 [-127, 127]INT8或 [-7, 7]4 bit。非对称量化则允许 zero_point 偏移范围可以是 [0, 255] 或 [0, 15]。对于权重通常用对称量化。原因是权重的分布一般以 0 为中心对称量化能更充分地利用整数格点而且计算时省掉 zero_point 的加减操作反量化更快。对于激活因为 ReLU 之后的激活全是非负的非对称量化更合适能把 [0, max] 这段区间映射得更均匀。在 W4A8 里权重走对称 4 bit范围 [-7, 7]共 15 个有效格点激活走非对称或对称 INT8具体看实现。2.2 分组量化4 bit 精度的救命稻草4 bit 只有 16 个格点如果整个权重矩阵共用一个 scale那精度基本没法看。所以实际实现里必须用分组量化group-wise quantization也就是把权重按某个维度切成小组每组单独算一个 scale。常见的分组方式有两种按输出通道分组per-channel每个输出通道一个 scale。这是 INT8 时代的标配但对 4 bit 来说粒度还是太粗。按组分组group-wise把 K 维度切成大小为 group_size 的组每组一个 scale。group_size 通常取 32、64、128。group_size 的选择是个权衡group_size精度scale 元数据开销反量化速度32最好较大较慢64好中等中等128一般小快256较差很小最快以 group_size128 为例每 128 个 4 bit 权重共 64 字节需要额外存一个 FP16 的 scale2 字节元数据开销约 3%。如果 group_size32开销就上升到约 12%。这个开销在算显存账的时候必须算进去不然你以为省了 75%实际可能只省了 65%。2.3 反量化W4A8 里最容易被低估的开销权重存成 4 bit 之后计算前必须先反量化回 INT8 或 FP16 才能和激活做矩阵乘。这一步的开销很多人一开始会忽略。反量化的流程是读 4 bit 权重 → 读对应组的 scale → 做乘加还原。在 GPU 上这个过程如果实现得不好会成为瓶颈。因为 4 bit 数据的读取本身就不是对齐的一个字节装两个权重需要额外的位操作来拆分。实测中反量化的开销主要来自三块位操作拆包把 packed 的 4 bit 数据拆成独立的数值。scale 加载每个组都要加载对应的 scale访存模式如果不连续会很慢。乘加运算还原成高精度数值。好的实现会把反量化和矩阵乘融合在一起fused dequant GEMM在 shared memory 里完成拆包和还原避免中间结果写回显存。这一点在选推理框架的时候要特别关注不同框架在这块的优化差距很大。2.4 激活 INT8 的校准不是拍脑袋定 scale激活的 scale 需要通过**校准calibration**来确定。常见做法是跑一批代表性数据统计每层激活的最大值或百分位数然后据此定 scale。这里有个坑如果你用最大值max来定 scale个别离群值会把 scale 拉得很大导致正常值精度损失。所以实践中更常用百分位校准percentile calibration比如取 99.9% 分位数把极端离群值截断。校准数据的选取也很关键。用训练集的一小部分、用真实业务数据、用合成数据效果差别很大。我的经验是校准数据一定要贴近真实推理场景的输入分布否则校准出来的 scale 在实际使用时会偏。如果业务输入比较多样建议用多种类型的数据混合校准。3. Kimi 2.7 MoE 场景下的量化实操要点3.1 专家权重的分组策略共享还是独立MoE 里每个专家都是独立的 FFN量化的时候有个选择所有专家共用一套量化参数还是每个专家独立量化答案很明确每个专家必须独立量化。因为不同专家学到的特征分布差异很大共用 scale 会导致某些专家精度严重下降。而且专家之间本来就是独立的权重矩阵独立量化不增加额外复杂度。但这里有个工程细节专家数量多的时候scale 的数量也会成倍增加。如果每个专家、每个组都有一个 scale元数据的管理和加载会成为问题。好的做法是把所有专家的 scale 组织成连续的张量保证访存连续。3.2 路由层和共享层的处理差异MoE 模型里不是所有层都适合量化到 4 bit。路由层Router/Gate通常参数量很小但对精度极其敏感——路由错了整个 token 的计算就跑到错误的专家去了。所以路由层一般保持高精度FP16 或至少 INT8不参与 4 bit 量化。共享专家Shared Expert如果模型有的话因为每个 token 都会经过其重要性高于普通专家量化时也要更保守可以考虑用更大的 group_size 或者干脆保持 INT8。这个分层对待的思路很重要量化不是一刀切而是要根据每层的重要性和敏感度区别处理。3.3 量化感知训练还是训练后量化这是绕不开的问题。W4A8 这种激进配置纯训练后量化PTQ能不能扛住实测结论是权重 4 bit 激活 INT8PTQ 在多数 MoE 模型上可以做到精度损失可控1-2 个点以内但需要配合好的分组策略和校准。如果对精度要求极高或者模型本身对量化敏感那就需要量化感知训练QAT在训练过程中模拟量化误差让模型自己去适应。QAT 的成本高很多需要重新训练或微调。所以一般的落地路径是先试 PTQ精度不达标再考虑 QAT 或者局部回退到 W8A8。3.4 一个容易踩的坑专家负载不均导致的量化偏差MoE 有个特性专家负载往往不均衡热门专家被路由到的次数远多于冷门专家。这会导致一个问题——校准数据里热门专家的激活样本多冷门专家样本少。如果按样本量来统计 scale冷门专家的校准就不充分量化后精度可能崩。解决办法是对每个专家单独做校准保证每个专家都有足够的校准样本而不是全局混在一起统计。这一点在实现校准流程时要特别注意。4. 实测对比W4A8 到底带来了什么4.1 显存与吞吐的实测数据下面是一组典型的实测对比具体数值因模型和硬件而异这里给的是量级参考配置显存占用单 token 延迟吞吐tokens/s精度损失FP16100%基准基准0W8A850%0.7x1.3x0.5%W4A828%0.85x1.1x1-2%W4A425%0.9x1.05x严重注意看 W4A8 这一行显存省了 72%但吞吐只提升了 10% 左右延迟甚至比 W8A8 还高。为什么因为反量化的开销吃掉了部分收益。这就是前面强调的——W4A8 的主要价值在显存不在速度。如果你的场景是显存受限比如要单卡部署大 MoEW4A8 是刚需。如果显存充足、只追求速度W8A8 甚至 FP8 可能更划算。4.2 精度验证不能只看困惑度量化之后验证精度很多人只看 perplexity困惑度。但困惑度对量化的敏感度不够有时候困惑度没怎么变下游任务却崩了。我的建议是至少验证三类指标困惑度快速筛查看有没有明显异常。下游任务准确率选几个和业务相关的任务比如问答、分类、生成质量。长文本和边界 case量化误差在长序列上会累积要专门测长文本场景。特别是 MoE 模型路由的稳定性要单独验证——量化后如果路由分布发生明显偏移说明量化影响了路由决策这是危险信号。4.3 不同推理框架的 W4A8 支持情况W4A8 不是所有框架都支持得好。选框架的时候重点看几个能力是否支持 group-wise 4 bit 权重量化反量化是否和 GEMM 融合是否支持 MoE 的专家并行和量化组合校准工具链是否完整有些框架号称支持 4 bit但只支持 per-channel不支持 group-wise那精度根本没法用。还有些框架的反量化是单独一个 kernel没融合速度上不去。这些细节在选型阶段一定要实测验证不能只看文档。5. 落地时的经验与避坑清单5.1 量化粒度不要一步到位我见过太多人一上来就追求极致压缩直接上 W4A4 或者超小 group_size结果精度崩了回头返工。正确的做法是渐进式压缩先 W8A8 跑通确认精度和性能基线再试 W4A8观察精度损失如果 W4A8 不达标再考虑混合精度敏感层保持高精度。每一步都要有完整的评测不要跳步。量化是个系统工程不是调一个参数就完事。5.2 混合精度是常态不是妥协实际落地中纯 W4A8 很少见混合精度才是常态。通常的做法是大部分 FFN 层W4A8注意力层W8A8 或 FP16路由层、LayerNorm、EmbeddingFP16敏感专家单独回退到 W8A8这种混合策略能在显存和精度之间找到最佳平衡点。不要觉得混合精度是没做到位它恰恰是工程成熟的表现。5.3 校准集的质量决定量化上限前面提过校准的重要性这里再强调一次校准集的质量直接决定量化模型的上限。校准集要满足几个条件覆盖真实业务的主要输入类型每个专家都有足够样本序列长度分布贴近实际使用不要用训练集的开头几千条敷衍了事如果业务输入有很强的领域特性比如专业术语多、格式特殊校准集必须包含这些特性否则量化后的模型在这些输入上会明显退化。5.4 监控量化后的路由分布MoE 量化后一定要监控路由分布的变化。具体做法是在量化前后分别跑一批数据统计每个专家的被路由次数和路由概率分布。如果分布发生明显偏移说明量化影响了路由决策需要针对性处理比如把路由层和相关敏感层回退到高精度。这个监控在线上部署后也要持续做因为输入分布会漂移量化模型的鲁棒性需要长期观察。5.5 别忘了端到端的延迟分解优化的时候不要只盯着 GEMM。W4A8 的端到端延迟里反量化、scale 加载、专家调度、KV Cache 读写都占相当比例。做性能分析时要把延迟拆开看找到真正的瓶颈再优化不然容易在错误的地方使劲。我一般会用 profiler 把每个 kernel 的耗时打出来重点看反量化相关 kernel 和专家调度 kernel 的占比。如果反量化占了 20% 以上说明融合做得不好值得优化。6. 关于 INT8、FP8、BF16 的选型补充既然热词里提到了这些格式的区别这里顺带说清楚方便做选型决策。BF16/FP16训练和推理的通用格式精度最高显存占用最大。适合对精度要求极高、显存充足的场景。FP8新一代硬件如 Hopper 及之后的架构原生支持精度介于 FP16 和 INT8 之间动态范围比 INT8 好因为是指数表示。适合新硬件上的高吞吐推理但老硬件不支持。INT8成熟、通用、硬件支持广泛。激活量化到 INT8 基本无损是 W4A8 里的标准配置。4 bit极致压缩主要用于权重。单独用 4 bit 做激活风险很大。选型的核心逻辑是权重看显存压力激活看精度容忍度硬件看原生支持。三者结合才能选出最合适的组合。W4A8 之所以流行就是因为它在这三个维度上找到了一个被广泛验证的平衡点。最后分享一个我在实际项目里的体会量化方案的选型永远不要脱离具体的硬件和业务场景去谈最优。同一个 W4A8 配置在不同 GPU、不同 batch size、不同序列长度下表现可能完全不同。所以任何方案都要在自己的真实环境里实测别人的 benchmark 只能作为参考起点不能直接照搬。把评测流程搭好把监控做扎实比追求某个最强配置重要得多。