资讯动态

Qwen3 MoE 量化实战:ik_llama.cpp 的 IQK 自定义量化配方与 QAT/fp4 之谜

发布时间:2026/9/18 17:51:57 来源:尧图企业网站定制
Qwen3 MoE 量化实战ik_llama.cpp 的 IQK 自定义量化配方与 QAT/fp4 之谜【免费下载链接】ik_llama.cppllama.cpp fork with additional SOTA quants and improved performance项目地址: https://gitcode.com/GitHub_Trending/ik/ik_llama.cpp本篇技术指南围绕 ik_llama.cpp 项目中针对 Qwen3-30B-A3BMoE模型开展的量化实验展开完整收录作者设计并公开验证的六套 IQK 自定义量化配方Recipe IQK-1 ~ IQK-6深入剖析--custom-q正则规则的用法、imatrix重要性矩阵对量化质量的决定性影响以及实验中量化模型 PPL 低于 bf16这一反常现象背后可能存在的 QAT/fp4 训练假设。读完本文你将掌握用llama-quantize为 MoE 模型逐层定制量化类型、用llama-perplexity科学评估量化损失以及如何理解 imatrix、KV cache 类型等变量对评测结果的影响。一、实验背景为什么选择 Qwen3-30B-A3BQwen3 系列包含旗舰级大模型作者ikawrakow不具备运行旗舰模型的硬件条件因此选择Qwen3-30B-A3B这一 MoEMixture-of-Experts模型作为实验对象。该模型激活参数仅 3B总参数 30B128 个专家故 GGUF 文件名为Qwen3-128x1.8B-BF16.gguf单卡即可推理适合做系统的量化对比实验。作者指出实验结果有望推广到同架构的 Qwen3-235B-A22B。实验使用的全部配方几乎都由IQK 量化族构成这是 ik_llama.cpp 仓库独有的一组量化类型在 examples/quantize/quantize.cpp 的QUANT_OPTIONS表中可以查到它们的位宽定义例如量化类型位宽说明来自源码注释IQ2_KS2.1875 bpw非线性量化IQ2_K2.375 bpw非线性量化IQ3_KS3.19 bpw非线性量化IQ3_K3.44 bpw非线性量化IQ4_KS4.25 bpw非线性量化IQ4_K4.5 bpw非线性量化IQ5_KS5.25 bpw非线性量化IQ5_K5.5 bpw非线性量化二、--custom-q逐张量定制量化类型的入口六套配方都依赖llama-quantize的--custom-q参数。它的用法与解析逻辑在 examples/quantize/quantize.cpp 的parse_custom_quants()中实现参数内容为逗号分隔的正则表达式量化类型规则列表每个规则把匹配到该正则的张量名映射到指定的ggml_type多个--custom-q参数会被合并到同一个规则向量中quantize.cpp#L613-L615因此既可以写成一个长逗号串也可以拆成多个参数以提升可读性——六套配方采用的就是拆分写法。以配方 IQK-1 为例三条规则合起来的效果是所有注意力张量用IQ5_Ktoken 嵌入用Q4_K输出张量用Q6_K前 6 层blk.0~blk.5的ffn_down_exps用IQ4_KS其余专家张量一律IQ2_KS。之所以把 token 嵌入固定为Q4_K、输出张量固定为Q6_K是因为嵌入层与输出层参数占比小但敏感度高quantize.cpp#L192 的用法说明也明确建议当 ffn 类型介于 iq3_xxs且 q8_0之间时输出张量推荐使用q6_K。三、六套 IQK 量化配方完整清单以下命令均假设已经获得 bf16 源模型Qwen3-128x1.8B-BF16.gguf与 imatrix 文件变量$imatrix指向该文件。未指定输出文件名时工具会按[输入路径]/ggml-model-[ftype].gguf自动命名quantize.cpp#L626-L641。Recipe IQK-1极致低位宽≈2.2 bpw./bin/llama-quantize --imatrix $imatrix \ --custom-q attniq5_k,token_embd.weightq4_K,output.weightq6_K \ --custom-q blk\.[0-5]\.ffn_down_expsiq4_ks,ffn_down_expsiq2_ks \ --custom-q expsiq2_ks \ Qwen3-128x1.8B-BF16.gguf $model_file_name iq2_ks规则拆解注意力张量IQ5_K前 6 层ffn_down_exps用IQ4_KS其余专家权重exps相关张量一律IQ2_KS。最终模型 8.745 GiB仅比 Unsloth 的UD-IQ1_S8.396 GiB略大。注意正则中\.是对点号的转义blk\.[0-5]\.精确匹配blk.0.到blk.5.前缀的层。Recipe IQK-2专家全 IQ2_K./bin/llama-quantize --imatrix $imatrix \ --custom-q attniq5_k,token_embd.weightq4_K,output.weightq6_K \ --custom-q blk\.[0-5]\.ffn_down_expsiq4_ks,ffn_down_expsiq2_k,expsiq2_k \ Qwen3-128x1.8B-BF16.gguf $model_file_name iq2_k与 IQK-1 的唯一区别前 6 层ffn_down_exps之外的所有专家张量改用IQ2_K比IQ2_KS略高位宽。最终模型 9.314 GiB。Recipe IQK-3专家分层 IQ4_K IQ3_K./bin/llama-quantize --imatrix $imatrix \ --custom-q attniq5_k,token_embd.weightq4_K,output.weightq6_K \ --custom-q blk\.[0-5]\.ffn_down_expsiq4_k,ffn_down_expsiq3_k,expsiq2_k \ Qwen3-128x1.8B-BF16.gguf $model_file_name iq2_k前 6 层ffn_down_exps用IQ4_K其余ffn_down_exps用IQ3_Kexps用IQ2_K。最终模型 10.389 GiB。Recipe IQK-4三层级混合≈3.4 bpw./bin/llama-quantize --imatrix $imatrix \ --custom-q attniq5_k,token_embd.weightq4_K,output.weightq6_K \ --custom-q blk\.[0-5]\.ffn_down_expsiq4_k,ffn_down_expsiq3_k \ --custom-q blk\.[0-9]\.ffniq3_k,blk\.1[0-5]\.ffniq3_k,blk\.4[0-9]\.ffniq3_k \ --custom-q expsiq2_k Qwen3-128x1.8B-BF16.gguf $model_file_name iq3_k在 IQK-3 基础上将前 16 层blk.0~blk.9与blk.10~blk.15以及最后 8 层blk.40~blk.49的ffn_up_exps/ffn_gate_exps提升到IQ3_K——头尾层首层与末层对量化误差更敏感值得给予更多位宽。最终模型 11.584 GiB。Recipe IQK-5专家全 IQ3_K≈3.9 bpw./bin/llama-quantize --imatrix $imatrix \ --custom-q attniq5_k,token_embd.weightq4_K,output.weightq6_K \ --custom-q blk\.[0-5]\.ffn_down_expsiq4_k,ffn_down_expsiq3_k,expsiq3_k \ Qwen3-128x1.8B-BF16.gguf $model_file_name iq3_k所有专家张量统一IQ3_K仅前 6 层ffn_down_exps保留IQ4_K。最终模型 12.779 GiB。Recipe IQK-6全 IQ4_KS≈4.3 bpw./bin/llama-quantize --imatrix $imatrix \ --custom-q attniq5_k,token_embd.weightq4_K,output.weightq6_K \ --custom-q .*iq4_ks Qwen3-128x1.8B-BF16.gguf iq4_ks除注意力、输出、嵌入外所有张量统一IQ4_KS正则.*兜底。最终模型 15.454 GiB量化误差 0.57%处于量化文献中常被称作无损的亚 1% 区间。四、与 Unsloth dynamic quants 的横向对比作者将六套配方的模型体积横轴GiB与量化误差纵轴定义为PPL(Q)/PPL(bf16)-1百分数与 Unsloth 发布的 Qwen3-30B-A3B-128K GGUF 系列dynamic 动态量化黑色数据点画在同一张图上。结论是在相同量化质量下IK 配方模型的体积可再小约 2 GiB在低 bpw 端相当于缩小近 20%。换言之Unsloth 的 dynamic quants 在该模型上的体积/质量权衡并不占优。五、反直觉发现IQ4_K 输给 IQ4_KS以及 QAT/fp4 假设在初步结果发布后作者追加了一轮实验。正常情况下IQ4_K4.5 bpw16 元素块应当优于IQ4_KS4.25 bpw32 元素块但实测相反——IQ4_KS反而取得更低的 perplexity。进一步把所有配方中的IQ5_K/IQ4_K全部替换为IQ4_KS后6 个配方在 Wikitext-2 测试集上的结果如下bf16 基线 PPL 9.0656Recipe模型体积PPLIQK-18.615 GiB9.9517IQK-29.183 GiB9.7154IQK-310.229 GiB9.3908IQK-411.454 GiB9.1057IQK-512.620 GiB9.0147IQK-615.324 GiB8.9873Recipe IQK-5 与 IQK-6 的 PPL 竟然低于 bf16 模型本身。作者随后用主线上游实现复核 bf16 基线得到 9.0665排除实现差异又怀疑是 imatrix 的问题结果反而引出更多反常。为解释这一现象作者提出假设Qwen3 的训练可能采用了针对某种fp4变体的量化感知训练QAT。fp4只有 16 个离散取值且因含指数与尾数取值在最小/最大值之间非均匀分布——这与IQ4_NL、IQ4_XS、IQ4_KS、IQ4_K的非线性网格特性类似。作者对比了nf4、fe1m2与iq4k_valuesIQ4_K/IQ4_KS共用的取值网格的分布并结合块缩放符号与块移位比特的四种组合后推断若 QAT 以 32 元素块配合 fp4 进行则IQ4_KS能很好地适配该分布。这也解释了为何同族的IQ4_KS反而优于位宽更高的IQ4_K。作为对照无 imatrix 时Q4_0的 PPL 为 9.3017说明 Qwen3 并未像 Gemma3 那样针对Q4_0过拟合。六、imatrix 实验量化模型击败bf16 之谜imatrix重要性矩阵通过校准数据统计各权重对输出误差的贡献供量化过程优化。作者围绕同一配方IQK-6做了系统对照条件PPLbf16 模型9.0656无 imatrix权重重要性w x²9.3119无 imatrix权重重要性w 19.1470IK imatrix100% 来自wiki.train.raw更多批次8.9873Bartowski imatrix8.9727Unsloth imatrix8.8787几个关键结论无 imatrix 时默认取w_i x_i²权重越大越重要这是历史上最优的通用策略但如果模型经过针对 fp4 变体的 QAT权重被引导至特定分布该策略反而有害——把重要性改为w 1后4.25 bpw 的量化误差从 2.6% 骤降到 0.9%不同的 imatrix 会导致 PPL 低于 bf16作者认为这是 imatrix 对测试语料类型的过拟合所致若某 imatrix 的校准数据与测试语料更相似量化反而更擅长该类文本作者自产的 imatrix 全部取自wiki.train.raw相比 Unsloth/Bartowski 的校准数据对wiki.test.raw的过拟合更轻。上述结论也与社区其他成员的数据相互印证见第七节并促使作者将三套 imatrix 分别量化的IQ4_KS模型发布供公开评测。七、评估方法论之争PPL 与 KLD 的取舍讨论中社区成员 saood06 引用了某篇论文对 PPL 指标的批评如对称噪声不改变 PPL 却降低生成质量作者从统计学角度逐一反驳该论文 Table 19 未提供不加噪声的对照组且声称 PPL 在加 5 个标准差噪声后完全不变的概率几乎为零噪声是加在概率p还是ln(p)、0.0~5.0指标准差还是宽度均未说明若对 logits 加 σ5 的高斯噪声logits 会溢出允许范围被迫截断后噪声分布不再对称PPL 必然改变论文图 9 显示 8bit→4bit 的 log-likelihood 差异标准差仅约 0.2作者推测若真按 8bit 与 4bit 的实际差异加噪声将测不出任何差异整个论点随之瓦解。作者同时给出实证在一份第三方博客的统计中PPL 与 KLD、PPL 与正确 top-token 概率的线性拟合相关系数分别达到 98% 和 99%——高度相关的指标测一个即可预测另一个。社区成员 ubergarm 的独立评测数据bf16 基线、Q8_0、IQ4_K、IQ4_KS及 Unsloth/Bartowski 的成品量化同样支持上述趋势纯IQ4_KS在wiki.test.raw上 PPL 低于 bf16 基线9.0703而 KLD 与平均 Δp 的绝对值也很小但其自建语料上的 KLD 相对更高提示 imatrix 校准数据的相似性确实会影响不同语料的评测结果。这也解释了作者的观点当 bf16 模型本身可能有损如 QAT 训练残留或后期 bf16 微调引入噪声时以 bf16 为基准的 KLD 类指标反而会误导判断。八、完整复现指南1. 准备源模型与 imatrix获取 Qwen3-30B-A3B 的 BF16 GGUFQwen3-128x1.8B-BF16.ggufimatrix 可自行生成校准数据建议多样化、足够多的批次或复用社区发布的.dat文件如 Unsloth、Bartowski 的版本可参考 scripts/get-wikitext-2.sh 获取评测用 Wikitext-2 测试集。2. 执行量化任选上述一套配方例如./bin/llama-quantize --imatrix $imatrix \ --custom-q attniq5_k,token_embd.weightq4_K,output.weightq6_K \ --custom-q .*iq4_ks \ Qwen3-128x1.8B-BF16.gguf Qwen3-30B-A3B-IQ4_KS.gguf iq4_ks注意事项--custom-q可多次给出规则会合并quantize.cpp#L613-L615且每条规则内逗号分隔、前后分别是正则与ggml_typequantize.cpp#L326-L344低位宽类型IQ1_S、IQ1_M、IQ2_S、IQ2_XXS、IQ2_XS、Q2_K_S强制要求提供 imatrix否则工具直接报错退出quantize.cpp#L674-L686可使用--dry-run预览张量映射结果而不写文件。3. 运行 PPL 评测./bin/llama-perplexity -m Qwen3-30B-A3B-IQ4_KS.gguf \ -ngl 99 -fa -fmoe -f wiki.test.raw参数说明-ngl 99尽可能把层卸载到 GPU-fa启用 Flash Attention-fmoeMoE 模型必需saood06 的复现命令均带此参数-f评测语料文件路径-ctk q8_0 -ctv q8_0KV cache 量化为 Q8_0默认 fp16。关于 KV cache 类型社区复现数据显示同一模型在同一硬件上Q8_0与fp16KV cache 的 PPL 相差约 0.0065fp16 更低而不同硬件之间的差异可达 0.05 以上。因此跨机器对比 PPL 时应固定 KV cache 类型并留意潜在数值不稳定。关于 PPL 评估方法的完整约定如何获取 Wikitext-2、PPL 与 KLD 的计算方式、--kl-divergence-base用法等参见 examples/perplexity/README.md。九、结论与启示--custom-q是 MoE 量化的核心工具通过正则按层、按张量族attn、ffn_down_exps、exps等分配量化类型可在几十 MB 的粒度上调节体积与质量头尾层敏感度更高IQK-4 表明首 16 层与末 8 层值得更高位宽这是设计混合配方时的重要先验imatrix 是一把双刃剑校准数据与目标语料越相似该语料上的 PPL 越好看但也越接近过拟合当怀疑模型经过 QAT 时默认的w x²重要性策略可能需要重新审视实验中w 1反而更好IQ4_KS 对 Qwen3-30B-A3B 异常友好仅 4.25 bpw 即可逼近乃至追平 bf16 的 PPL与Qwen3 可能针对 fp4 变体做过 QAT的假设自洽但这属于基于实验现象的推断尚无官方训练细节佐证评估需谨慎PPL 与 KLD 高度相关但当基线模型本身可能有损时任何单一指标都可能误判最好结合体积、多语料 PPL、生成质量做综合决策。【免费下载链接】ik_llama.cppllama.cpp fork with additional SOTA quants and improved performance项目地址: https://gitcode.com/GitHub_Trending/ik/ik_llama.cpp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价