- 人工智能
- 大模型
- 模型压缩
- 模型量化
- 模型蒸馏
- 模型优化
【免费下载链接】AngelSlim
Model compression toolkit engineered for enhanced usability, comprehensiveness, and efficiency.
简介:AngelSlim QAT 量化感知训练能解决什么问题
AngelSlim 是腾讯开源的大模型压缩工具包,QAT(Quantization Aware Training,量化感知训练)是其中的核心压缩能力之一:在训练中插入伪量化,让模型"提前适应"低比特部署的精度损失,再配合DeepSpeed Zero3 分布式训练,即可让 30B 级别模型的 INT4/FP8 量化精度稳定反超 PTQ(训练后量化)。本文带你从零跑通整个流程。
📦 仓库获取(如需源码阅读):
git clone https://gitcode.com/gh_mirrors/an/AngelSlim
为什么低比特量化需要 QAT 而不是 PTQ?
| 对比维度 | PTQ 训练后量化 | QAT 量化感知训练 |
|---|---|---|
| 精度来源 | 靠校准数据统计 scale | 靠训练"学会"补偿量化误差 |
| 典型适用 | FP8、INT8 等高比特 | INT4、W4A8 等低比特 |
| 硬件门槛 | 单卡可跑 | 需要多卡(Zero3) |
| 精度天花板 | 受离群值影响大 | 可反超 PTQ,甚至接近 FP16 |
INT4 权重量化时,4 bit 只能表示 16 个离散值,单靠校准数据选出的 scale 很难覆盖权重分布的长尾(离群值会把 scale 拉大,导致大部分权重挤在零点附近、有效位宽被浪费)。QAT 的解法是:在前向中插入 Fake Quant(伪量化)模拟部署时的真实误差,再用 STE(直通估计器)让梯度穿过 round/clamp 反向传播,同时把 scale 本身变成可学习参数,训练目标直接优化"量化后"的模型行为。
AngelSlim QAT 的核心特性(详见 qat.md):
- 多种量化格式:INT 任意位宽、FP8(E4M3)、W4A8-FP8 混合精度
- 灵活粒度:per-tensor / per-channel / per-group / per-token
- 两种训练模式:end2end(端到端,HF Trainer)与 blockwise(逐块,显存更省)
- 插件化架构:可学习 Scale、LWC 裁剪、可学习旋转等以插件形式挂载
- 内置评测:PPL(wikitext2、c4)与 ACC(piqa、arc 等)
核心机制一:Fake Quant 与可学习 Scale
QuantLinear:量化线性层
QAT 初始化时,LearnableScalePlugin 会遍历模型,把普通nn.Linear替换为 QuantLinear。前向过程对权重和激活分别做伪量化:
x → x / scale → round_ste → clamp(qmin, qmax) → × scale → x_quantround_ste前向执行真实的取整,反向则把梯度原样透传(STE),这是 QAT 能收敛的关键技巧。
Learnable Scale:把量化误差变成可优化目标
通过plugin_config.quant_config.learnable可以精确控制"哪些参数参与训练"(模型权重始终冻结):
| 配置项 | 默认值 | 含义 |
|---|---|---|
act_scale | false | 激活动态 scale / zero_point |
weight_scale | true | 权重量化 scale(默认只学它) |
kv_scale | false | KV Cache 量化 scale(K/V 投影输出) |
norm | false | RMSNorm/LayerNorm 权重 |
lwc | false | LWC 可学习裁剪因子 |
默认配置下,只有极小规模的 scale 参数组进入优化器(每层几个 float),训练成本远低于微调,却能显著压缩量化损失——这正是 QAT 精度反超 PTQ 的主要来源。
核心机制二:DeepSpeed Zero3 多卡显存方案
大模型 QAT 的第一个拦路虎是显存。AngelSlim 的 ZeRO-3 支持 做了四个关键设计:
- 每卡独立构造空模型:不读磁盘权重,
deepspeed.zero.Init立即切片参数,峰值显存仅model_size / world_size(普通from_pretrained峰值是world_size × model_size,大模型必 OOM) - MoE 专家在空模型阶段拆解:fused MoE 直接切成 per-expert 的
nn.Linear并立即分片,避免在 sharded 参数上替换层结构 - 权重与 scale 流式加载:rank0 按 safetensors 顺序读盘,其余 rank 经
GatheredParameters接收;所有 helper 收敛在 zero3_io.py - scale 从 PTQ checkpoint 热启动:ZeRO-3 下无法跑 forward 校准,因此配置中
from_ptq_ckpt为必填项——先用单卡 PTQ 产出一份带 scale 的 checkpoint,QAT 直接继承这些 scale 并继续优化
实战两阶段流程:先 PTQ 校准,再 Zero3 QAT
阶段 1:单卡 PTQ 产出初始 scale
以 Qwen3-30B-A3B 为例(单卡即可完成):
python tools/run.py \ -c configs/qwen3/ptq/fp8_static/qwen3-a3b_fp8_static.yaml \ --model-path /path/to/Qwen3-30B-A3B \ --save-path ./output_ptq_30b产出目录中每个 safetensors 都会带上<layer>.weight_scale/<layer>.input_scale,供下一阶段使用。
阶段 2:Zero3 多卡启动 QAT
# 8 卡 Qwen3-30B-A3B bash scripts/qat/run_qat_for_qwen_30b_a3b_zero3.sh # 2 卡 Qwen3-4B 烟囱测试(快速验证流程) bash scripts/qat/run_qat_for_qwen_4b_zero3.sh脚本本质就是torchrun --nproc_per_node=N tools/run.py -c <配置>,训练结束压缩权重保存到./output/<任务名>/final_quant_checkpoint/。
关键 YAML 配置速览
完整 30B 配置见 qwen3-30b-a3b_fp8_static_end2end_learn_scale_zero3.yaml,关键字段如下:
model: device_map: None # ZeRO-3 下必须为 None,交给分布式切分 compression: name: QAT quantization: name: fp8_static # 或 w4a8_fp8 / int4(见文末配置清单) QAT: from_ptq_ckpt: ./output_ptq_30b/qwen3-a3b_fp8_static # 必填!scale 热启动 training_mode: end2end dist_mode: hf save_format: real # 导出可部署的真实量化权重 loss_type: cakld # 置信度感知 KD,教师-学生对齐 lm_loss_weight: 1.0 kd_loss_weight: 1.0 plugin_config: enable_scale: true quant_config: weight_scale_init_value: 0.1 # PTQ 未命中时的保底 scale learnable: weight_scale: true hf_args: bf16: true # 必须显式开启,避免 dtype 失配 learning_rate: 1.0e-6 gradient_checkpointing: true deepspeed: configs/qwen3/qat/fp8_static/learn_scale/ds_config_zero3.json💡 三个容易踩的坑:
device_map写None(字符串也可,Engine 会规范化),不要让 HF 自己排卡bf16: true必须显式设置,否则 DeepSpeed 默认 fp16 autocast 与 bf16 权重失配- DeepSpeed 配置参考 ds_config_zero3.json:stage 3 +
overlap_comm+stage3_gather_16bit_weights_on_model_save
INT4 / W4A8 / FP8:一份配置模板换三种格式
AngelSlim 为 QAT 内置了多套现成配置,切换格式只需换 yaml:
| 量化格式 | 示例配置 | 特点 |
|---|---|---|
| INT4 仅权重 | qwen3-4b_int4_weight_only_end2end_learn_scale.yaml | per-group(group=128)对称 INT4,体积收益最大 |
| W4A8-FP8 混合精度 | qwen3-4b_w4a8_fp8_end2end_learn_scale.yaml | 权重 INT4 + 激活 FP8,显存与速度兼顾 |
| W4A8 + FP8 Attention | qwen3-4b_w4a8_fp8_end2end_learn_scale_qkv_fp8attn.yaml | 额外模拟 KV Cache / Attention FP8 量化 |
| FP8 静态(Zero3) | qwen3-4b_fp8_static_end2end_learn_scale_zero3.yaml | 权重+激活均 FP8 per-tensor |
W4A8-FP8 配置中的量化段示例(权重 per-group INT4、激活 per-tensor FP8):
quantization: name: w4a8_fp8 quant_method: weight: per-group activation: per-tensor group_size: 128训练时还可选 KD 变体(loss_type):kl/rkl/mse/cakld(置信度感知混合 KL)/kl_top_K等,lm_loss_weight与kd_loss_weight控制组合权重。日志中会自动输出lm_loss、kd/cakld、kd/forward_kl、kd/backward_kl、total_loss,方便判断收敛。
训练效果验证:30B MoE 实测与内置评测
项目已验证场景(摘自 qat_zero3.md):
| 场景 | 模型 | 硬件 | 结果 |
|---|---|---|---|
| Dense ZeRO-3 QAT | Qwen3-4B | 2×H20 | PTQ→QAT→save 全链路打通,产物可被 transformers 加载 |
| MoE ZeRO-3 QAT | Qwen3-30B-A3B(48 层 × 128 experts) | 8×H20 | stream_load_scales命中 37248 个 scale,loss 稳定,输出 31 GB FP8 checkpoint |
| KD + LM loss 组合 | 同上 | 同上 | 各分项 loss 按权重正确打印 |
| 非 ZeRO-3 回归 | Qwen3-4B 单卡 | 1×H20 | 行为与主线一致,无回归 |
训练完成后,用内置评测对比 QAT 与 PTQ 模型的 PPL / ACC 是最直接的验证方式:
python3 tools/run.py -c <你的QAT配置> --lm-eval --ppl-eval典型经验值:FP8 静态量化 QAT 与 PTQ 的 PPL 差距通常在 1% 以内;INT4 场景下 QAT 相对 PTQ 的收益最明显,wikitext2 PPL 差距常能拉开 5% 以上。
核心文件导读
| 文件 | 职责 |
|---|---|
| angelslim/compressor/qat/qat.py | QAT 主入口:插件初始化、训练调度、ZeRO-3 分支的 convert/save |
| angelslim/compressor/qat/modules/quantizer.py | Quantizer + QuantLinear:STE 伪量化核心 |
| angelslim/compressor/qat/plugins/learnable_scale.py | 可学习 Scale 插件:Linear 替换、scale 流式加载 |
| angelslim/compressor/qat/trainers/end2end_trainer.py | HF Trainer 封装,lm_loss + KD loss 组合 |
| angelslim/utils/zero3_io.py | 全部 ZeRO-3 helper:空模型构建、流式灌权、rank0 合并保存 |
| tools/run.py | 统一命令行入口 |
总结:QAT + Zero3 的组合拳
- QAT 解决精度:伪量化 + STE + 可学习 Scale,让 INT4/FP8 模型在训练阶段就把量化误差"学"进参数,低比特下稳定反超 PTQ
- Zero3 解决显存:空模型分片 + 流式加载 + rank0 合并导出,让 30B 级 MoE 的 QAT 在多卡上跑得起来
- PTQ 仍是必要前置:单卡校准产出 scale 热启动,跳过分布式 forward 校准,两阶段流程简单可靠
- 官方文档可继续参考:QAT 总览、QAT + DeepSpeed ZeRO-3
🚀 建议路线:先用 2 卡 Qwen3-4B 烟囱测试跑通全流程,再切换到 8 卡目标模型,最后用--lm-eval --ppl-eval量化对比 QAT vs PTQ 的收益。
- 人工智能
- 大模型
- 模型压缩
- 模型量化
- 模型蒸馏
- 模型优化
【免费下载链接】AngelSlim
Model compression toolkit engineered for enhanced usability, comprehensiveness, and efficiency.
相关推荐
如何给RPCS3设置中文界面:PS3模拟器汉化完整指南
如何给RPCS3设置中文界面:PS3模拟器汉化完整指南 RPCS3(PS3模拟器)里的游戏菜单全是英文,装完补丁中文又变成一排方框?这篇教程帮你在10分钟内完成
虚拟化图形学调试器突破精度瓶颈:PaddleSlim训练感知量化(QAT)实战指南
突破精度瓶颈:PaddleSlim训练感知量化 QAT 实战指南 引言:量化技术的困境与解决方案 你是否面临这样的困境:模型部署时受限于硬件资源,需要压缩模型大
人工智能深度学习模型量化模型优化模型蒸馏AutoMLModel-Optimizer 量化感知训练与蒸馏(QAT/QAD)实战指南:从 NVFP4 PTQ 到精度恢复与部署
Model Optimizer 量化感知训练与蒸馏(QAT/QAD)实战指南:从 NVFP4 PTQ 到精度恢复与部署 量化感知训练(QAT)与量化感知蒸馏(Q
人工智能大模型模型优化模型量化模型压缩
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考