☰
AngelSlim QAT量化感知训练实战指南:DeepSpeed Zero3让INT4/FP8模型精度反超PTQ的完整流程
2026/10/10 15:11:30 网站建设 项目流程
  • 人工智能
  • 大模型
  • 模型压缩
  • 模型量化
  • 模型蒸馏
  • 模型优化

【免费下载链接】AngelSlim

Model compression toolkit engineered for enhanced usability, comprehensiveness, and efficiency.

项目地址:https://gitcode.com/gh_mirrors/an/AngelSlim
点击查看免费下载

简介: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_quant

round_ste前向执行真实的取整,反向则把梯度原样透传(STE),这是 QAT 能收敛的关键技巧。

Learnable Scale:把量化误差变成可优化目标

通过plugin_config.quant_config.learnable可以精确控制"哪些参数参与训练"(模型权重始终冻结):

配置项默认值含义
act_scalefalse激活动态 scale / zero_point
weight_scaletrue权重量化 scale(默认只学它)
kv_scalefalseKV Cache 量化 scale(K/V 投影输出)
normfalseRMSNorm/LayerNorm 权重
lwcfalseLWC 可学习裁剪因子

默认配置下,只有极小规模的 scale 参数组进入优化器(每层几个 float),训练成本远低于微调,却能显著压缩量化损失——这正是 QAT 精度反超 PTQ 的主要来源。

核心机制二:DeepSpeed Zero3 多卡显存方案

大模型 QAT 的第一个拦路虎是显存。AngelSlim 的 ZeRO-3 支持 做了四个关键设计:

  1. 每卡独立构造空模型:不读磁盘权重,deepspeed.zero.Init立即切片参数,峰值显存仅model_size / world_size(普通from_pretrained峰值是world_size × model_size,大模型必 OOM)
  2. MoE 专家在空模型阶段拆解:fused MoE 直接切成 per-expert 的nn.Linear并立即分片,避免在 sharded 参数上替换层结构
  3. 权重与 scale 流式加载:rank0 按 safetensors 顺序读盘,其余 rank 经GatheredParameters接收;所有 helper 收敛在 zero3_io.py
  4. 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.yamlper-group(group=128)对称 INT4,体积收益最大
W4A8-FP8 混合精度qwen3-4b_w4a8_fp8_end2end_learn_scale.yaml权重 INT4 + 激活 FP8,显存与速度兼顾
W4A8 + FP8 Attentionqwen3-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 QATQwen3-4B2×H20PTQ→QAT→save 全链路打通,产物可被 transformers 加载
MoE ZeRO-3 QATQwen3-30B-A3B(48 层 × 128 experts)8×H20stream_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.pyQAT 主入口:插件初始化、训练调度、ZeRO-3 分支的 convert/save
angelslim/compressor/qat/modules/quantizer.pyQuantizer + QuantLinear:STE 伪量化核心
angelslim/compressor/qat/plugins/learnable_scale.py可学习 Scale 插件:Linear 替换、scale 流式加载
angelslim/compressor/qat/trainers/end2end_trainer.pyHF 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.

项目地址:https://gitcode.com/gh_mirrors/an/AngelSlim
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询