当前位置: 首页 > news >正文

CANN-昇腾NPU-量化训练-QAT和PTQ怎么选

模型量化有两种时机:训练时做(QAT,Quantization-Aware Training)和训练后做(PTQ,Post-Training Quantization)。在昇腾NPU上,QAT 用 torch_npu 的量化感知训练,PTQ 用 CANN 的 AMCT 工具。这篇讲清楚两者的适用场景和操作步骤。

PTQ:训练后量化

PTQ 不需要重新训练,直接把 fp16 模型量化成 int8/w8a8。适合快速上线、不想重新训练的场景。

fromamct_npuimportcreate_quant_config,quantize_model# 1. 准备校准数据集(100-1000 条代表性数据)calib_dataloader=get_calib_dataloader(num_samples=500)# 2. 创建量化配置config=create_quant_config(model_file="model.onnx",config_file="./quant_config.json",dst_json_path="./quant_ready.json",)# 3. 校准(跑一遍校准数据,统计激活分布)quant_model=quantize_model(model_file="model.onnx",quant_config_file="./quant_config.json",calib_dataloader=calib_dataloader,)# 4. 导出量化模型quant_model.export_quant_onnx("model_quant.onnx")

PTQ 的关键:校准数据集要跟真实推理数据分布一致。用训练集做校准,推理时分布不同,精度损失会放大。

QAT:量化感知训练

QAT 在训练时模拟量化误差,让模型"适应"量化。精度损失比 PTQ 小 30-50%,但需要重新训练。

importtorchfromtorch_npu.contribimportQATWrapper model=AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf",torch_dtype=torch.bfloat16,device_map="npu:0",)# 包装成 QAT 模型qat_model=QATWrapper(model,qconfig={"weight":"int8","activation":"int8","quantize_per_tensor":True,})# 正常训练(QAT 在 forward 时插入伪量化节点)optimizer=torch.optim.AdamW(qat_model.parameters(),lr=1e-5)fordataindataloader:loss=qat_model(data)loss.backward()optimizer.step()# 训练完成后转成真正量化模型quant_model=torch.ao.quantization.convert(qat_model)torch.save(quant_model.state_dict(),"model_qat.pt")

精度损失对比

Llama2-7B,CANN 8.5,Atlas 800I A2:

量化方案WNLI (准确率)GSM8K (准确率)推理速度
fp16 (基准)78.5%56.2%1.0×
PTQ int876.1% (-2.4%)53.8% (-2.4%)1.8×
QAT int877.9% (-0.6%)55.6% (-0.6%)1.8×
PTQ int468.2% (-10.3%)44.1% (-12.1%)2.5×
QAT int474.8% (-3.7%)51.3% (-4.9%)2.5×

QAT 的精度损失只有 PTQ 的 1/4。如果精度敏感(评测集、生产环境),优先 QAT。

选择建议

场景推荐方案理由
快速原型验证PTQ不需要训练,10 分钟完成
生产环境,精度敏感QAT精度损失小,训练成本可接受
显存严重不足PTQ int4权重 4bit,显存减半
已有训练流水线QAT插入 QAT wrapper 即可,改动小

跟 ATB 的配合

ATB 的 LLM 接口直接支持量化模型:

fromatbimportLLM# PTQ 量化模型model_ptq=LLM("model_quant.onnx",device="npu:0",quantize="w8a8",# 对应 PTQ 的配置)# QAT 量化模型model_qat=LLM("model_qat.pt",device="npu:0",quantize="w8a8_qat",)

ATB 内部会自动调用对应的量化 GEMM kernel。w8a8 的 GEMM 吞吐是 fp16 的 1.8-2.0×。


PTQ 快但精度损失大,QAT 慢但精度高。如果你的模型要上生产,多花 1-2 天做 QAT 是值得的。PTQ 适合快速验证和显存极度受限的场景。仓库在这里:

https://atomgit.com/cann/AMCT

http://www.jsqmd.com/news/876096/

相关文章:

  • C#中TaskFactory实现线程任务
  • Ubuntu 20.04 上为 RTX 3060 编译 OpenCV 4.2.0 + CUDA 时,我踩过的那些坑(附完整解决方案)
  • LLM应用开发之模型微调技术详解
  • 3步轻松解密网易云音乐NCM文件:免费实现音乐跨平台播放
  • NHSE终极指南:动物森友会存档编辑器的5个核心应用场景
  • SketchUp STL插件终极指南:5分钟掌握3D打印模型转换的完整方案
  • GMERF与MERF:处理过离散计数数据的小域估计方法对比
  • JMeter接口测试工业化实践:从脚本编写到CI/CD全链路
  • 茉莉花插件终极指南:如何在3分钟内彻底解决Zotero中文文献管理难题
  • 接口测试三层防御体系:契约校验、逻辑穿透与系统压测
  • Godot 4.3本地AI编程助手:GDScript智能协作者实战指南
  • Edge和Chrome同时罢工?可能是这个Windows服务在搞鬼!附一键排查脚本
  • 3分钟掌握SketchUp STL插件:3D打印模型转换的完整解决方案
  • 终极猫抓浏览器扩展:5个简单步骤轻松捕获在线视频资源的完整指南
  • 高斯随机定时器原理与JMeter压测行为建模
  • JMeter+InfluxDB+Grafana压测监控实时可视化实战
  • TranslucentTB:Windows任务栏透明美化终极指南,轻松打造个性化桌面
  • 第七史诗自动化助手E7Helper:解放双手的游戏效率革命
  • E7Helper:第七史诗自动化助手终极指南,告别重复刷图烦恼
  • 解锁音乐自由:qmcdump如何让被加密的音乐重获新生?
  • 机器学习势函数与连续介质模型在二维材料原子重构中的对比研究
  • 龙蜥8.8系统下,手把手教你安全升级OpenSSH到9.7p1(附防失联指南)
  • 湍流建模不确定性量化:从物理扰动到贝叶斯推断的融合实践
  • 告别Windows文件搜索慢!Listary Pro 6保姆级配置教程,效率翻倍不是梦
  • RTX51任务调度中K_IVL与K_TMO事件详解
  • Zotero文献去重终极指南:一键清理重复条目,专注高效科研
  • Unity找不到ffmpeg.dll的四大根因与实战解决方案
  • 煎饼果仔 夏天妹妹 90 天 AI 变现落地计划
  • KOSS模型:卡尔曼滤波与深度学习的融合创新
  • AutoML与集成学习在多模态医疗AI中的工程化实践