news 2026/5/24 8:16:42

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/24 8:14:06

第七史诗自动化助手E7Helper:解放双手的游戏效率革命

第七史诗自动化助手E7Helper:解放双手的游戏效率革命 【免费下载链接】e7Helper 【Epic Seven Auto Bot】第七史诗多功能覆盖脚本(刷书签🍃,挂讨伐、后记、祭坛✌️,挂JJC等📛,多服务器支持📺&a…

作者头像 李华
网站建设 2026/5/24 8:11:02

3分钟解放你的QQ音乐收藏:qmcdump让加密音频重获自由播放权

3分钟解放你的QQ音乐收藏:qmcdump让加密音频重获自由播放权 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump …

作者头像 李华
网站建设 2026/5/24 8:08:36

使用C#实现隐藏Excel单个和多个工作表的示例详解

许多 Excel 文件中往往包含用于计算、中间处理或内部引用的数据工作表,这些内容并不需要对最终用户展示。如果全部显示出来,不仅会增加操作复杂度,还可能带来误操作风险。 通过 C# 以编程方式隐藏 Excel 工作表,可以在生成或处理…

作者头像 李华
网站建设 2026/5/24 8:08:02

PearSAN框架:基于皮尔逊相关的代理模型加速纳米光子逆向设计

1. 逆向设计:从直觉到算法的范式转变在纳米光子学领域,设计一个能精确操控光波的超表面,传统上依赖于研究人员的物理直觉和“试错”式的参数扫描。比如,你想设计一个能让特定波段的光几乎完全吸收,而其他波段的光完全反…

作者头像 李华
网站建设 2026/5/24 8:07:58

Postman并发测试真相:不是高并发工具,而是缺陷暴露加速器

1. 为什么“并发测试”不是点几下就能出结果的幻觉?很多人第一次打开 Postman 的 Collection Runner,看到“Iterations”和“Delay”两个输入框,心里就默认:“填个100,点Run,不就模拟100个用户同时访问了吗…

作者头像 李华