AMCT 大模型 MinMax 量化实战:基于昇腾 NPU 的 Llama2/Qwen 权重量化与 PPL 评估指南
【免费下载链接】amctAMCT是CANN提供的昇腾AI处理器亲和的模型压缩工具仓。项目地址: https://gitcode.com/cann/amct
本文以 CANN AMCT 工具仓中的 MinMax 量化示例为核心,系统讲解在昇腾 NPU 环境下对 Llama2-7B、Qwen2-7B、Qwen3-8B 等大语言模型执行 MinMax 量化(含仅权重量化与 float8_e4m3fn × float4_e2m1 混合量化)的完整流程,包括环境准备、量化配置构造、算子维度约束规避与 PPL 结果评估。读完本文,你将掌握如何基于 AMCT 的INT8_MINMAX_WEIGHT_QUANT_CFG内置配置或自定义量化配置 dict,在几分钟内完成大模型的量化、校准、转换与精度验证。
1 MinMax 算法在 AMCT 中的定位
MinMax 是量化参数(scale/offset)计算中最基础的校准算法:在校准阶段直接统计激活与权重的最大绝对值,据此确定量化缩放系数,属于无需迭代、计算开销极低的静态量化方案。在 AMCT 中,MinMax 通过量化算法基类QuantAlgorithmBase的机制注册到工具内部(见 amct_pytorch/algorithms/quant/base.py),并支持在配置中通过'algorithm': {'minmax'}显式启用。
MinMax 算法同时支持仅权重量化(weight-only)与全量化(权重 + 激活)两种模式:
- 仅权重量化:权重量化到
int8或float4_e2m1,激活保持原始精度(NOT_QUANTIZE),典型代表为内置配置INT8_MINMAX_WEIGHT_QUANT_CFG; - 全量化:权重与激活同时量化,激活可量化到
int8或float8_e4m3fn,权重可量化到int8或float4_e2m1(注意全量化场景不支持权重类型int4)。
2 量化前提:依赖安装与模型数据集准备
2.1 安装依赖
本示例的 Python 依赖清单见 examples/algorithms/minmax/requirements.txt,核心依赖包括:
torch==2.7.1与torch_npu(NPU 适配层,需与 Python、torch 版本匹配);transformers、accelerate(模型加载与推理);datasets(校准集与测试集在线加载);tqdm、sentencepiece、zstandard(进度显示、分词与数据压缩支持)。
需要特别强调的是:torch_npu包版本必须与 Python 及 torch 版本匹配,并且需要预先安装对应版本的 CANN 软件包,否则 NPU 算子无法正常下发执行。
2.2 模型和数据集准备
本示例以 Llama2-7B、Qwen2-7B、Qwen3-8B 三个模型为例,数据采用在线加载方式(无需本地下载):
| 用途 | 数据集 | 加载方式 |
|---|---|---|
| 校准集 | pileval(mit-han-lab/pile-val-backup) | 在线加载,取 512 个样本,按block_size=256切块 |
| 测试集 | wikitext2(Salesforce/wikitext的wikitext-2-raw-v1split) | 在线加载,用于量化后 PPL 评估 |
模型权重需要用户自行下载,并在执行脚本时通过--model_path参数指定本地路径。从示例代码 examples/algorithms/minmax/src/utils.py 可以看到,模型加载时统一使用torch_dtype=torch.bfloat16(Llama2 通过LlamaForCausalLM.from_pretrained,Qwen 通过AutoModelForCausalLM.from_pretrained并配合device_map="auto")。
数据类型注意点:量化数据类型组合float8_e4m3fn * float4_e2m1只支持量化原始数据类型为torch.bfloat16。示例的 utils.py 中加载模型时已默认设置为torch_dtype=torch.bfloat16;如果你替换为其他模型或自行编写加载逻辑,请务必保持原始模型为 bf16 精度。
3 NPU 算子维度限制与 skip_layers 处理
3.1 维度限制来源
NPU 量化算子aclnnWeightQuantBatchMatmulV2对输入特征维度 k 与输出特征维度 n 的上限均为65535。Qwen2-7B / Qwen3-8B 等大词表模型的词表大小约 152K,远超该上限,会导致lm_head层在 PPL 评估阶段调用该算子时失败。
该约束在工具内部由check_quant_op_constraint实现,见 amct_pytorch/common/config/parser.py:对于仅权重量化场景,当Linear层权重的任一维度超过 65535 时,工具会打印告警日志并返回 False,从而自动跳过该层量化:
layer:xxx cannot be quantized, weight shape [152064, 4096] exceeds NPU weight-quant operator dimension limit (max 65535)此外,float8_e4m3fn * float4_e2m1组合还有额外的形状约束:权重的输入通道数(weight.shape[1])必须是 64 的整数倍(同见 parser.py)。
3.2 规避策略:skip_layers
内置量化配置INT8_MINMAX_WEIGHT_QUANT_CFG已默认将lm_head加入skip_layers,工具也会在check_quant_op_constraint中自动跳过超出维度限制的层。如果用户自定义量化配置,请务必对大词表模型将lm_head加入skip_layers,例如:
cfg = { 'batch_num': 1, 'quant_cfg': { 'weights': {'type': 'int8', 'symmetric': True, 'strategy': 'channel'}, }, 'algorithm': {'minmax'}, 'skip_layers': {'lm_head'}, }skip_layers支持模糊匹配:当配置字符串为层名字串,或与层名完全一致时,跳过该层量化、不生成量化配置;且字符串必须包含数字或字母。对应匹配逻辑在 amct_pytorch/common/config/parser.py 中实现。
4 简易量化配置:内置配置与自定义配置
4.1 内置配置 INT8_MINMAX_WEIGHT_QUANT_CFG
本示例使用的 int8 仅权重量化配置已经内置在工具中,可通过以下方式获取并使用:
from amct_pytorch import INT8_MINMAX_WEIGHT_QUANT_CFG其完整定义位于 amct_pytorch/common/config/config.py:
INT8_MINMAX_WEIGHT_QUANT_CFG = { 'batch_num': 1, 'quant_cfg': { 'weights': { 'type': 'int8', 'symmetric': True, 'strategy': 'channel', }, }, 'algorithm': {'minmax'}, 'skip_layers': {'lm_head'}, }该配置从 amct_pytorch/init.py 对外导出,也作为默认量化配置在 amct_pytorch/common/config/parser.py 中被引用,即用户不显式传入配置时工具会使用该默认配置。
4.2 自定义 float8_e4m3fn * float4_e2m1 配置
如果希望启用float8_e4m3fn * float4_e2m1量化数据类型组合(权重为 float4_e2m1、激活为 float8_e4m3fn),需要构造如下配置 dict:
cfg = { 'batch_num': 1, 'quant_cfg': { 'weights': { 'type': 'float4_e2m1', 'symmetric': True, 'strategy': 'group', 'group_size': 32 }, 'inputs': { 'type': 'float8_e4m3fn', 'symmetric': True, 'strategy': 'tensor', }, }, 'algorithm': {'minmax'}, 'skip_layers': {'lm_head'} }如需修改更详细的配置,请参考资料构造量化配置 dict(可参考 amct_pytorch/common/config/config.py 中其他内置配置的写法)。
4.3 量化配置字段说明
MinMax 算法支持仅权重量化和全量化,支持的量类型及量化配置字段如下表:
| 字段 | 类型 | 说明 | 取值范围 | 注意事项 |
|---|---|---|---|---|
| batch_num | uint32 | 量化使用的 batch 数量 | 1 | / |
| skip_layers | str | 跳过量化的层 | / | 跳过量化层支持模糊匹配,当配置字符串为层名字串,或与层名一致时,跳过该层量化,不生成量化配置。字符串必须包含数字或字母 |
| weights.type | str | 量化后权重类型 | 'int4'/'int8'/'float4_e2m1' | / |
| weights.symmetric | bool | 对称量化 | TRUE/FALSE | 量化数据类型为 float4_e2m1 时,只支持对称量化 |
| weights.strategy | str | 量化粒度 | 'tensor'/'channel'/'group' | 量化策略为 group 时,只支持量化数据类型为 float4_e2m1,且 float4_e2m1 只支持配 group |
| inputs.type | str | 量化后激活类型 | 'int8'/'float8_e4m3fn' | 全量化场景不支持配置权重量化类型 int4 |
| inputs.symmetric | bool | 对称量化 | TRUE/FALSE | 量化数据类型为 float8_e4m3fn 时,只支持对称量化 |
| inputs.strategy | str | 量化粒度 | 'tensor'/'token' | 量化数据类型为 float8_e4m3fn 时,只支持量化策略为 tensor |
| algorithm | dict | 量化使用的算法配置 | {'minmax'} | / |
5 量化示例:接口方式调用
5.1 运行命令
请在examples/algorithms/minmax目录下执行如下命令运行示例程序,用户需根据实际情况修改示例程序中的模型和数据集路径:
python3 src/run_llama2_samples.py --model_path=/data/Llama2_7b_hf/python3 src/run_qwen_samples.py --model_path=/data/Qwen2-7b/python3 src/run_qwen_samples.py --model_path=/data/Qwen3-8b/5.2 示例程序的四阶段流程
以 examples/algorithms/minmax/src/run_llama2_samples.py 为例,脚本按四个阶段组织(run_qwen_samples.py流程与之完全一致,仅模型加载方式不同,见 run_qwen_samples.py):
- Phase 0 模型与数据准备:通过
get_llama2(args.model_path)加载 bf16 模型并eval().npu()迁移到 NPU;从 pileval 校准集构造样本,torch.cat后取[:1, :]作为单条校准输入; - Phase 1 量化:
amct.quantize(quant_model, cfg)将量化配置应用到模型中,完成模型替换与量化参数初始化; - Phase 2 校准推理:
infer_model(quant_model, samples)在torch.no_grad()下前向推理校准样本,统计各层 min/max 并计算出量化因子(scale),随后torch_npu.npu.empty_cache()释放缓存; - Phase 3 转换部署模型:
amct.convert(quant_model)将校准后的模型转换为含量化算子的部署模型; - Phase 4 PPL 评估:加载 wikitext2 测试集,
test_ppl(quant_model, testenc)按model.seqlen(默认 2048)切块评估量化模型的困惑度 PPL。
5.3 量化成功标志
若出现如下信息,则说明量化成功:
Test time taken: 1.0 min 59.24865388870239 s Score: 5.477707其中Score为量化模型的 PPL(Perplexity,困惑度),数值越低代表语言模型预测能力越接近原始模型。同时,推理成功后会在当前目录生成量化日志文件./amct_log/amct_pytorch.log,可用于排查量化过程中的告警与算子约束跳过信息。
6 量化效果参考:PPL 对比
使用 pileval 作为校准集、wikitext2 作为测试集,三个模型量化前后的 PPL 参考值如下表:
| 模型 | 校准集 | 数据集 | 量化前 PPL | int8 量化后 PPL | float8_e4m3fn*float4_e2m1 量化后 PPL |
|---|---|---|---|---|---|
| LLAMA2-7B | pileval | wikitext2 | 5.472 | 5.477 | 5.702 |
| QWEN2-7B | pileval | wikitext2 | 7.137 | 7.139 | 7.602 |
| QWEN3-8B | pileval | wikitext2 | 9.715 | 9.692 | 10.668 |
可以看出,int8 仅权重量化对三个模型的 PPL 影响均极小(LLAMA2-7B 与 QWEN2-7B 偏差约 0.005,QWEN3-8B 甚至略有下降),而float8_e4m3fn * float4_e2m1混合量化在更低比特下 PPL 略有上升,但整体仍保持在可接受范围内。实际结果会因模型版本、校准数据与随机种子略有浮动,上表数值仅作为参考基准。
7 小结
通过本示例可以确认:AMCT 的 MinMax 算法为大模型提供了一条"配置即用"的低成本量化路径——内置的INT8_MINMAX_WEIGHT_QUANT_CFG开箱即用,自定义的float8_e4m3fn * float4_e2m1配置则面向更极致的压缩率。量化前只需重点确认三件事:环境满足 requirements.txt 的依赖且torch_npu与 CANN 版本匹配、原始模型保持 bf16 精度、大词表模型的lm_head已通过skip_layers或算子约束检查规避 65535 维度限制。后续若需将量化模型部署到昇腾推理环境,可进一步参考 examples/algorithms/cast 等示例,或查阅 AMCT 量化接口文档(docs/zh/api/quantize.md)。
【免费下载链接】amctAMCT是CANN提供的昇腾AI处理器亲和的模型压缩工具仓。项目地址: https://gitcode.com/cann/amct
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考