当前位置: 首页 > 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.gsyq.cn/news/1365005.html

相关文章:

  • C#中TaskFactory实现线程任务
  • E7Helper第七史诗自动化助手:解放双手的完整使用指南
  • 纤维丛与连接:从微分几何到量子控制与最优控制的桥梁
  • 3步突破微信限制:wechat-need-web插件终极使用手册
  • 如何轻松提取和转换Wallpaper Engine资源文件?RePKG工具完全指南
  • 别再为单细胞数据批次效应发愁了!手把手教你用Harmony算法搞定整合分析(附Seurat实战代码)
  • 机器学习因果推断:SSRI与RI方法如何解决异质性效应估计的不确定性
  • 怎样轻松突破微信网页版限制:完整浏览器插件使用指南
  • MultiEgo数据集:多视角第一人称动态场景重建技术解析
  • 机器学习势函数与连续介质模型在二维材料原子重构中的对比研究
  • 浏览器资源嗅探终极指南:用猫抓插件轻松获取网页视频音频
  • 6. 缓冲区对象(Buffer Object)
  • CANN-昇腾NPU-LoRA微调-显存只占5%怎么做到的
  • NHSE终极指南:5步掌握《动物森友会》存档编辑的艺术
  • AutoML与集成学习在多模态医疗AI中的工程化实践
  • 数据缺失处理与PCA降维:构建全球生活便利指数的技术实践
  • 呼伦贝尔通风管道设计安装攻略,选宇鹏不锈钢怎么样 - myqiye
  • 深入Linux内核:PTP硬件时间戳(HW Timestamping)是如何炼成的?
  • AI产业到底包括哪些
  • GMERF与MERF:处理过离散计数数据的小域估计方法对比
  • 基于高斯过程与Vecchia近似的空间数据预处理:让机器学习模型学会处理空间依赖性
  • 2026镍基合金625加工厂家新推荐,哪家技术强? - myqiye
  • 避开这些坑,你的孟德尔随机化分析结果才可靠:以口腔癌研究为例的实操避雷指南
  • 小红书视频下载终极指南:5分钟掌握免费无水印批量下载技巧
  • 视频字幕提取终极指南:3分钟本地搞定87种语言硬字幕识别
  • 3步突破网易云音乐格式封锁:NCMDump解密转换实战指南
  • Windows Cleaner深度解析:4步彻底解决C盘空间不足的完整技术方案
  • 3分钟解放你的QQ音乐收藏:qmcdump让加密音频重获自由播放权
  • 终极Winget安装修复指南:从零到精通解决Windows包管理器问题
  • 3步实现Windows任务栏透明化:从新手到专家的桌面美化全攻略