recipe.yaml配方解析:gemma-4-26B-A4B-it-w8a8-llmcompressor如何决定哪些层量化、而哪些层必须跳过
recipe.yaml配方解析:gemma-4-26B-A4B-it-w8a8-llmcompressor如何决定哪些层量化、而哪些层必须跳过
【免费下载链接】gemma-4-26B-A4B-it-w8a8-llmcompressor项目地址: https://ai.gitcode.com/hf_mirrors/amd/gemma-4-26B-A4B-it-w8a8-llmcompressor
gemma-4-26B-A4B-it-w8a8-llmcompressor是 AMD 使用 LLM Compressor 制作的 Gemma4 26B-A4B 多模态 MoE 模型(25.8B 参数)的 W8A8 8-bit 量化版本。仓库中的 recipe.yaml 就是这份「量化配方」:仅 9 行内容,就决定了哪些层量化成 8-bit、哪些层必须保留 BF16,以及按什么精度量化。
📄 9 行量化配方:逐字段解析
recipe.yaml 全文只有 9 行,是一个单阶段配方:default_stage→default_modifiers→QuantizationModifier(量化修正器)。
default_stage: default_modifiers: QuantizationModifier: targets: [Linear] ignore: [lm_head, 're:.*lm_head', 're:.*router\.proj$', 're:.*vision_tower.*', 're:.*embed_vision.*', 're:.*embed_audio.*'] scheme: W8A8 bypass_divisibility_checks: false requires_calibration_data: false下面逐字段拆解它的「圈层」逻辑。
targets: [Linear] — 默认把全部线性层标记为量化目标
targets(见 recipe.yaml)声明量化目标:模型里所有Linear(全连接)层默认都参与量化,包括 30 个语言层的注意力 q/k/v/o 投影、共享 MLP,以及每层 128 个路由专家的每一个投影层。
scheme: W8A8 — 权重 8-bit、激活 8-bit
scheme(recipe.yaml)指定量化方案:W8A8即Weights 8-bit +Activations 8-bit。具体细节记录在 config.json 的quantization_config中:
| 对象 | 位数 | 对称性 | 量化粒度 | 时机 |
|---|---|---|---|---|
| 权重 weights | INT8 | 对称 | per-channel(每输出通道一个 scale) | 静态(保存前完成) |
| 输入激活 activations | INT8 | 对称 | per-token(每个输入 token 一个 scale) | 动态(推理时实时计算) |
权重使用memoryless_minmaxobserver 在保存时算好 scale;激活则不预存,推理时按 token 动态量化,精度损失更小。
requires_calibration_data: false — 零校准数据量化
false(recipe.yaml)表示不需要校准数据集:权重直接按 RTN(Round-to-Nearest,四舍五入)算法舍入到 INT8,全程不用跑样例数据,量化一次完成(oneshot)。README.md 也确认了本模型就是用 RTN 算法量化的。
bypass_divisibility_checks: false — 保留维度合法性检查
false(recipe.yaml)表示不跳过「维度整除性检查」。若量化按分组进行,张量维度必须能被组大小整除,该检查确保 scale 与张量形状对齐,保存出的权重索引不会错位。
ignore: 5 条「禁入」模式
ignore(recipe.yaml)是白名单——匹配以下模式的模块一律跳过,保留 BF16:
| 配方模式 | 匹配对象 | 为什么跳过 |
|---|---|---|
lm_head、re:.*lm_head | 输出投影层 | 最终 logits 投影,与输入嵌入共享权重,量化易拖累输出质量 |
re:.*router\.proj$ | 每层 MoE 路由器 | 决定激活哪些专家,精度极其敏感 |
re:.*vision_tower.* | 27 层视觉塔 | 多模态视觉编码器 |
re:.*embed_vision.* | 视觉嵌入投影层 | 图像到文本的对齐 |
re:.*embed_audio.* | 音频嵌入投影层(预留) | 本模型无音频模块(audio_config: null),属防御性规则 |
💡 注意
re:前缀表示正则匹配:re:.*router\.proj$会精确命中所有以router.proj结尾的模块名,无需逐层手写。
⚠️ 为什么跳过 MoE router:最小的层,却最敏感
router 是这个模型最「值得保」的模块:
- 小:
router.proj只是 2816 → 128 的小矩阵,跳过它省下的磁盘空间几乎可以忽略 - 敏感:router 的输出决定每个 token 激活 128 个专家中的哪8 个(
top_k_experts: 8)。路由一旦出错,整个 token 的计算就跑偏,影响远大于普通权重的舍入误差 - 有专门参数:从 model.safetensors.index.json 可以看到每层
router有proj.weight、scale、per_expert_scale三个参数,全部保持 BF16,没有任何weight_scale量化字段
🎯 为什么跳过视觉塔与 lm_head
- 视觉塔:27 层视觉编码器 + patch 嵌入(
patch_embedder.input_proj)+ 视觉投影(embed_vision.embedding_projection)全部保留 BF16。语言模型是 30 层 × 128 专家,视觉塔参数量小得多,量化收益有限,而视觉特征退化会直接拖累多模态任务 - lm_head:本模型
tie_word_embeddings: true(输入/输出嵌入共享),输出投影与词嵌入表是同一份权重,INT8 化容易损伤生成质量 - embed_tokens 与 LayerNorm:输入嵌入表和归一化层不是
Linear模块,天然不在targets范围内
🔍 对照 config.json:从 5 条正则到 252 个具体层名
recipe.yaml 是「处方」,config.json 的quantization_config.ignore则是「执行记录」——llm-compressor 已把 5 条正则展开成252 个具体层名写入配置,推理框架(vLLM)加载时可直接按名跳过,无需再跑正则:
| 模块 | 数量 |
|---|---|
| 视觉塔(patch_embedder + 27 个 encoder 层 × 7 个投影) | 190 |
MoE router(30 层 ×router/router.proj) | 60 |
embed_vision.embedding_projection | 1 |
lm_head | 1 |
| 合计 | 252 |
同时quant_method: "compressed-tensors"、quantization_status: "compressed"表明模型已按compressed-tensors量化格式保存,vLLM 等引擎可直接加载。
✅ 权重索引验证:11,725 个被量化的投影层
统计 model.safetensors.index.json 中的weight_scale(每通道量化 scale)字段,每个对应一个 INT8 化的线性层:
| 模块 | 计算方式 | 数量 |
|---|---|---|
| 路由专家 | 30 层 × 128 专家 × 3 投影(gate/up/down) | 11,520 |
| 共享稠密 MLP | 30 层 × 3 投影 | 90 |
| 注意力投影 | 25 个滑动注意力层 × 4 + 5 个全注意力层 × 3 | 115 |
| 合计 | 11,725 |
有个有趣的细节:5 个 full-attention 层(第 5/11/17/23/29 层)的注意力k与v投影共享权重(attention_k_eq_v: true),因此这 5 层各只量化了 3 个投影。而 router、视觉塔、lm_head 则完全没有weight_scale字段——它们仍是 BF16,与配方 ignore 名单完全吻合。
📊 量化效果:省 47% 磁盘,精度恢复 98.95%
- 磁盘:48.1 GiB(BF16)→ 25.3 GiB(W8A8),减少约 47%(索引元数据 total_size 为 27,161,975,452 字节)
- 精度:GSM8K(5-shot)BF16 基线 0.9462 → W8A8 0.9363,精度恢复 98.95%
该模型面向 AMD EPYC CPU 推理(ZenDNN + vLLM 技术栈),部署与评测步骤见 README.md。
📁 关键文件速查
| 文件 | 作用 |
|---|---|
| recipe.yaml | 量化配方:targets / ignore / scheme |
| config.json | quantization_config:实际量化参数与展开后的 ignore 名单 |
| model.safetensors.index.json | 权重索引:验证真实被量化的层 |
| README.md | 量化过程、部署方式与评测结果 |
一句话总结:targets: [Linear]先圈定全部线性层,ignore用 5 条正则精准排除 MoE router、视觉塔、lm_head 等敏感模块;W8A8 + RTN 零数据量化让 11,725 个投影层从 BF16 降到 INT8,磁盘减 47%,基准精度恢复 98.95%。
【免费下载链接】gemma-4-26B-A4B-it-w8a8-llmcompressor项目地址: https://ai.gitcode.com/hf_mirrors/amd/gemma-4-26B-A4B-it-w8a8-llmcompressor
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考