AMCT 大模型 MinMax 量化实战:基于昇腾 NPU 的 Llama2/Qwen 权重量化与 PPL 评估指南
2026/9/18 13:22:21 网站建设 项目流程

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)与全量化(权重 + 激活)两种模式:

  • 仅权重量化:权重量化到int8float4_e2m1,激活保持原始精度(NOT_QUANTIZE),典型代表为内置配置INT8_MINMAX_WEIGHT_QUANT_CFG
  • 全量化:权重与激活同时量化,激活可量化到int8float8_e4m3fn,权重可量化到int8float4_e2m1(注意全量化场景不支持权重类型int4)。

2 量化前提:依赖安装与模型数据集准备

2.1 安装依赖

本示例的 Python 依赖清单见 examples/algorithms/minmax/requirements.txt,核心依赖包括:

  • torch==2.7.1torch_npu(NPU 适配层,需与 Python、torch 版本匹配);
  • transformersaccelerate(模型加载与推理);
  • datasets(校准集与测试集在线加载);
  • tqdmsentencepiecezstandard(进度显示、分词与数据压缩支持)。

需要特别强调的是: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/wikitextwikitext-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_numuint32量化使用的 batch 数量1/
skip_layersstr跳过量化的层/跳过量化层支持模糊匹配,当配置字符串为层名字串,或与层名一致时,跳过该层量化,不生成量化配置。字符串必须包含数字或字母
weights.typestr量化后权重类型'int4'/'int8'/'float4_e2m1'/
weights.symmetricbool对称量化TRUE/FALSE量化数据类型为 float4_e2m1 时,只支持对称量化
weights.strategystr量化粒度'tensor'/'channel'/'group'量化策略为 group 时,只支持量化数据类型为 float4_e2m1,且 float4_e2m1 只支持配 group
inputs.typestr量化后激活类型'int8'/'float8_e4m3fn'全量化场景不支持配置权重量化类型 int4
inputs.symmetricbool对称量化TRUE/FALSE量化数据类型为 float8_e4m3fn 时,只支持对称量化
inputs.strategystr量化粒度'tensor'/'token'量化数据类型为 float8_e4m3fn 时,只支持量化策略为 tensor
algorithmdict量化使用的算法配置{'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):

  1. Phase 0 模型与数据准备:通过get_llama2(args.model_path)加载 bf16 模型并eval().npu()迁移到 NPU;从 pileval 校准集构造样本,torch.cat后取[:1, :]作为单条校准输入;
  2. Phase 1 量化amct.quantize(quant_model, cfg)将量化配置应用到模型中,完成模型替换与量化参数初始化;
  3. Phase 2 校准推理infer_model(quant_model, samples)torch.no_grad()下前向推理校准样本,统计各层 min/max 并计算出量化因子(scale),随后torch_npu.npu.empty_cache()释放缓存;
  4. Phase 3 转换部署模型amct.convert(quant_model)将校准后的模型转换为含量化算子的部署模型;
  5. 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 参考值如下表:

模型校准集数据集量化前 PPLint8 量化后 PPLfloat8_e4m3fn*float4_e2m1 量化后 PPL
LLAMA2-7Bpilevalwikitext25.4725.4775.702
QWEN2-7Bpilevalwikitext27.1377.1397.602
QWEN3-8Bpilevalwikitext29.7159.69210.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),仅供参考

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

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

立即咨询