Qwen3-0.6B w4a8 `lwc` + `lac` 量化实战:AMCT 在昇腾 NPU 上的 int4/int8 与 mxfp4/mxfp8 双格式 PTQ 完整流程

Qwen3-0.6B w4a8 `lwc` + `lac` 量化实战:AMCT 在昇腾 NPU 上的 int4/int8 与 mxfp4/mxfp8 双格式 PTQ 完整流程 Qwen3-0.6B w4a8lwclac量化实战AMCT 在昇腾 NPU 上的 int4/int8 与 mxfp4/mxfp8 双格式 PTQ 完整流程【免费下载链接】amctAMCT是CANN提供的昇腾AI处理器亲和的模型压缩工具仓。项目地址: https://gitcode.com/cann/amct本指南以 CANN AMCT 开源仓库中的 Qwen3 量化示例 为蓝本完整讲解如何在昇腾 NPU 单卡npu:0上对 Qwen3-0.6B 模型执行 w4a84 bit 权重 / 8 bit 激活量化并以lwc可学习权重裁剪lac可学习激活裁剪两种算法组合完成离线数据提取、PTQ 参数训练与量化评估。读完本文后你将掌握python3 -m amct_pytorch.eval / extract_ptq_data / ptq三个 CLI 入口的完整调用链能够在int4/int8与mxfp4/mxfp8两种数据格式间一键切换并理解仓库中 LWC/LAC 算法在源码层面的实现原理。示例背景与适用场景本示例对应仓库 Issue [#182] 任务 1在int4/int8 与 mxfp4/mxfp8两种格式下对 Qwen3-0.6B 执行w4a8lwc/lac量化。示例目录位于 examples/models/qwen3与qwen3.6、deepseekv4等模型示例平级目录下的 README.md 与 README_en.md 为该实践的权威说明。该示例的 CLI 用法与 Qwen3.6-MoE 量化实践 保持一致统一走python3 -m模块入口int 与 mxfp 两种格式共用仓库内的同一份量化策略文件 amct_pytorch/configs/w4a8.yaml仅通过--quant_dtype参数切换数据格式无需复制或修改策略文件。适用前提以仓库文档为准硬件昇腾 NPU 单卡设备号npu:0软件已 source CANN 环境如一站式平台路径/home/developer/Ascend/cann/set_env.sh并安装amct_pytorch或将仓库根目录加入PYTHONPATH模型本地 Qwen3-0.6B 权重目录运行参数--model_name qwen3、--trust_remote_code数据校准集使用 Pilevalmit-han-lab/pile-val-backup默认nsamples128评估集使用 WikiText2wikitext-2-raw-v1test 集。理解 w4a8 量化策略仓库内共享的 bit_configint 与 mxfp 两种格式共享同一份策略文件 amct_pytorch/configs/w4a8.yaml其内容如下# Uniform W4A8 across all linears. w_bits: 4 a_bits: 8 moe: routed: w_bits: 4 # group-level: bump all shared-expert a_bits: 8 shared: w_bits: 8 # group-level: bump all shared-expert a_bits: 8关键信息解读顶层w_bits: 4/a_bits: 8对所有线性层统一施加 w4a8 约束moe.routed与moe.shared是 MoE 路由专家与共享专家分组级的位宽覆盖routed 专家保持 4 bit 权重而 shared 专家提升到 8 bit 权重注释中 bump all shared-expert 即指把共享专家位宽上调以保护共享路径精度从 CLI 参数解析源码看amct_pytorch/cli/llm/args.py--bit_config接收的是“描述各角色位宽的 yaml 文件路径”即该文件由 PTQ 训练与量化评估两个阶段共同消费。BF16 基线的策略文件 amct_pytorch/configs/bf16.yaml 则是一个空配置全部保持 16 bit用于 BF16 原始精度评估保证量化前后使用同一评估口径。环境准备与前置检查仓库文档明确给出了以下环境要求与注意事项动手前请逐项确认CANN 环境按你的安装路径 source 环境例如一站式平台执行source /home/developer/Ascend/cann/set_env.sh如需数据集镜像自行设置HF_ENDPOINT。amct_pytorch 安装安装amct_pytorch或将仓库根目录加入PYTHONPATH后直接使用python3 -m入口。本地依赖修复部分镜像自带的torchaudio存在缺陷会在transformers导入阶段崩溃需要先修复该本地依赖再使用官方python3 -m入口。本示例不附带环境包装脚本env wrapper。模型与产物目录MODEL指向本地 Qwen3-0.6B 权重目录产物目录examples/models/qwen3/outputs/...为相对占位目录不要提交数据或权重到仓库。标准流程四步走完双格式量化整个流程在仓库根目录执行按序分为四个阶段。两个格式共用步骤 1BF16 基线与步骤 2离线数据提取步骤 3、4 分别对 int 与 mxfp 各跑一遍。步骤 1BF16 基线评估两种格式共享source /path/to/cann/set_env.sh export MODEL/path/to/Qwen3-0.6B # placeholder; point to local weights python3 -m amct_pytorch.eval \ --trust_remote_code \ --model ${MODEL} \ --model_name qwen3 \ --seq_len 4096 \ --granularity block \ --device npu:0 \ --eval_mode bf16 \ --bit_config amct_pytorch/configs/bf16.yaml从 amct_pytorch/cli/llm/args.py 的源码可知--eval_mode仅接受bf16与quant两个取值bf16直接使用原始模型路径做评估quant则重建量化模块并按位宽切换量化器。BF16 与量化评估必须使用同一权重目录、同一评估配置seq_len4096、granularityblock这样计算出的 PPL 差值PPL delta才具备可比性。步骤 2离线提取 PTQ 校准数据attn mlp每个目标各执行一次extract_ptq_data校准数据分别落盘# Attention 线性层 python3 -m amct_pytorch.extract_ptq_data \ --trust_remote_code \ --model ${MODEL} \ --model_name qwen3 \ --seq_len 4096 \ --granularity block \ --device npu:0 \ --quant_target attn-linear \ --nsamples 128 \ --data_dir examples/models/qwen3/outputs/qwen3_0_6b/ptq_data/attn-linear # MLP python3 -m amct_pytorch.extract_ptq_data \ --trust_remote_code \ --model ${MODEL} \ --model_name qwen3 \ --seq_len 4096 \ --granularity block \ --device npu:0 \ --quant_target mlp \ --nsamples 128 \ --data_dir examples/models/qwen3/outputs/qwen3_0_6b/ptq_data/mlp--quant_target一次只针对一个目标attn-linear或mlp这是后续 PTQ 分目标训练的前提。--nsamples默认 128来自 Pileval 校准集。步骤 3int4/int8 格式的 PTQ 训练与量化评估对 Attention 与 MLP 分别执行ptq训练然后统一做量化评估# 3a) Attention 线性层 PTQ python3 -m amct_pytorch.ptq \ --trust_remote_code \ --model ${MODEL} \ --model_name qwen3 \ --seq_len 4096 \ --granularity block \ --device npu:0 \ --data_dir examples/models/qwen3/outputs/qwen3_0_6b/ptq_data/attn-linear \ --quant_dtype int \ --algos lwc lac \ --bit_config amct_pytorch/configs/w4a8.yaml \ --quant_target attn-linear \ --start_block_idx 0 \ --end_block_idx 28 \ --epochs 15 \ --base_lr 1e-5 \ --output_dir examples/models/qwen3/outputs/qwen3_0_6b_w4a8_int # 3b) MLP PTQ python3 -m amct_pytorch.ptq \ --trust_remote_code \ --model ${MODEL} \ --model_name qwen3 \ --seq_len 4096 \ --granularity block \ --device npu:0 \ --data_dir examples/models/qwen3/outputs/qwen3_0_6b/ptq_data/mlp \ --quant_dtype int \ --algos lwc lac \ --bit_config amct_pytorch/configs/w4a8.yaml \ --quant_target mlp \ --start_block_idx 0 \ --end_block_idx 28 \ --epochs 15 \ --base_lr 1e-5 \ --output_dir examples/models/qwen3/outputs/qwen3_0_6b_w4a8_int # 3c) int 格式量化评估同时加载 attn mlp 的 PTQ 参数 python3 -m amct_pytorch.eval \ --trust_remote_code \ --model ${MODEL} \ --model_name qwen3 \ --seq_len 4096 \ --granularity block \ --device npu:0 \ --eval_mode quant \ --quant_target attn-linear mlp \ --quant_dtype int \ --algos lwc lac \ --bit_config amct_pytorch/configs/w4a8.yaml \ --attn_linear_param_dir examples/models/qwen3/outputs/qwen3_0_6b_w4a8_int/ptq_params/qwen3/attn-linear \ --moe_mlp_param_dir examples/models/qwen3/outputs/qwen3_0_6b_w4a8_int/ptq_params/qwen3/mlp注意评估阶段的差异--quant_target attn-linear mlp一次加载两个目标PTQ 参数分别通过--attn_linear_param_dir与--moe_mlp_param_dir指定。步骤 4mxfp4/mxfp8 格式mxfp 格式不改变任何流程结构将步骤 3 中的所有--quant_dtype int换成--quant_dtype mxfp并把--output_dir与两个 param dir 统一切换到outputs/qwen3_0_6b_w4a8_mxfp下即可。从 amct_pytorch/cli/llm/args.py 的源码可以看到--quant_dtype支持int、mxfp、hifp、fp四种取值int与mxfp即本示例用到的两种格式。命令行参数速查表以下是本示例核心参数的含义依据 README_en.md 与 common.sh 整理Arg / env含义MODEL本地权重目录占位符须替换为实际路径--model_name qwen3Dense Qwen3 路径分支--seq_len 4096校准与评估的序列长度--granularity block块级block粒度--quant_dtype int\|mxfpint4/int8 或 mxfp4/mxfp8--algos lwc lac量化算法组合--bit_config仓库内 amct_pytorch/configs/w4a8.yaml--quant_targetextract/PTQ 阶段一次一个目标attn-linear或mlp量化评估一次加载两者--nsamplesPileval 校准样本数默认 128--end_block_idxQwen3-0.6B 默认 28 层其余训练超参--start_block_idx 0、--end_block_idx 28、--epochs 15、--base_lr 1e-5在 amct_pytorch/cli/llm/args.py 中都有默认值--base_lr默认 1e-5可学习变换的学习率--epochs默认 15--end_block_idx默认 61本示例按 Qwen3-0.6B 实际层数收敛到 28。脚本化运行一行命令跑完整流程除逐条执行 CLI 外示例还提供了一组 shell 脚本统一由 scripts/common.sh 提供共享默认值与运行时参数打印scripts/extract_ptq_data.sh依次执行 attn-linear 与 mlp 两次离线数据提取scripts/ptq_attn.shAttention 线性层 PTQ 训练scripts/ptq_mlp.shMLP PTQ 训练scripts/eval_bf16.shBF16 基线评估scripts/eval_quant.sh量化评估同时加载 attn 与 mlp 参数。脚本中的所有可调变量均可在调用前通过环境变量覆盖例如MODEL/path/to/Qwen3-0.6B、QUANT_DTYPEmxfp。以common.sh为例其默认值完全对齐上文的 CLI 参数MODEL_NAMEqwen3、DEVICEnpu:0、SEQ_LEN4096、GRANULARITYblock、NSAMPLES128、QUANT_DTYPEint、ALGOSlwc lac、START_BLOCK_IDX0、END_BLOCK_IDX28、EPOCHS15、BASE_LR1e-5。int 与 mxfp 的产物根目录由QUANT_DTYPE自动分流到outputs/qwen3_0_6b_w4a8_int或outputs/qwen3_0_6b_w4a8_mxfp两个bit_config分别指向仓库内的 w4a8.yaml 与 bf16.yaml。每个脚本运行前都会调用print_runtime_args打印完整的运行时参数便于复现与排查。算法原理源码视角下的 LWC 与 LAClwc与lac是仓库内置的可学习裁剪算法实现在 amct_pytorch/algorithms/quant/auto_clip.py通过 amct_pytorch/algorithms/registry_factory.py 的ALGO_REGISTRY注册LWCLearnable Weight Clipping注册名lwctargets(weight,)对权重做可学习裁剪。从源码看它对每个裁剪维度维护一对可学习参数clip_factor_max/clip_factor_min初值 4.0经 sigmoid 映射后乘到当前 min/max 上再执行torch.clamp当quant_dtype mxfp时权重会被 reshape 为(-1, 32)按 mxfp 的 32 元素分块维度计算裁剪因子见_update_clip_dim与apply_clip。LACLearnable Activation Clipping注册名lactargets(activation,)对激活做可学习裁剪采用 per-tensor 的标量裁剪因子--is_per_tensor控制激活裁剪的统计口径。其export_ptq_params/load_ptq_params方法将clip_factor_min、clip_factor_max、maxval、minval四个张量导出/加载为 PTQ 参数——这正是ptq训练产物目录中ptq_params的来源也是量化评估阶段--attn_linear_param_dir/--moe_mlp_param_dir加载的内容。两者组合--algos lwc lac即权重可学习裁剪 激活可学习裁剪的完整 PTQ 训练目标在 amct_pytorch/algorithms/quant/let.py 的文档字符串中还说明若要还原完整的 OmniQuant 方法可使用--algos let lwc。--algos参数在源码中声明为nargs*args.py框架会按注册目标weight/activation路由到对应算法。产物目录与规模参考示例默认在examples/models/qwen3/outputs/下按相对占位目录组织产物数据与权重不提交仓库ArtifactPathSizePTQ 离线数据Attention./outputs/qwen3_0_6b/ptq_data/attn-linear28.002 GiBPTQ 离线数据MLP./outputs/qwen3_0_6b/ptq_data/mlp28.002 GiB离线数据合计attnmlp两个目录之和56.004 GiBint PTQ 参数Attention./outputs/qwen3_0_6b_w4a8_int/ptq_params/qwen3/attn-linear1.30 MiBint PTQ 参数MLP./outputs/qwen3_0_6b_w4a8_int/ptq_params/qwen3/mlp1.67 MiBmxfp PTQ 参数Attention./outputs/qwen3_0_6b_w4a8_mxfp/ptq_params/qwen3/attn-linear42.20 MiBmxfp PTQ 参数MLP./outputs/qwen3_0_6b_w4a8_mxfp/ptq_params/qwen3/mlp63.14 MiB统计口径说明沿用仓库文档量化时间从该格式第一次ptq开始到 attn 与 mlp 两组参数全部写出为止不含模型下载与环境搭建离线数据大小为 extract 输出合计单位为 GiB。结果对照int4/int8 与 mxfp4/mxfp8 的精度与耗时仓库文档给出的实测结果为BF16 与量化评估均使用同一MODEL、同一seq_len4096/granularityblock配置ModelData typeAlgorithmFormatBF16 PPLQuant PPLPPL deltaPTQ minutesOffline data (GiB)Qwen3-0.6Bw4a8lwclacint4/int819.15754947.48648828.32893937.3556.004Qwen3-0.6Bw4a8lwclacmxfp4/mxfp819.15754923.8981594.74061048.8856.004该表是仓库文档记录的本示例实测结果可复现性取决于硬件型号、CANN 版本、模型权重与数据镜像等环境因素在自己的环境中运行时应以实际输出为准。两个值得留意的现象同一算法组合下mxfp4/mxfp8的 PPL 掉点4.74显著小于int4/int828.33而 mxfp 的 PTQ 训练耗时48.88 分钟略高于 int37.35 分钟且 mxfp 的 PTQ 参数体积明显更大——这与 mxfp 格式按 32 元素分块组织缩放因子的实现见上文 LWC 对 mxfp 的 reshape 逻辑相吻合。常见问题与注意事项评估口径一致性BF16 与量化评估必须使用同一权重目录、同一seq_len/granularity否则 PPL delta 失去意义目标分解执行--quant_target在 extract/PTQ 阶段一次只能指定一个目标attn-linear或mlp只有量化评估阶段才同时加载两个目标的参数环境变量覆盖使用scripts/*.sh时所有默认值均可通过同名环境变量在调用前覆盖如MODEL、QUANT_DTYPE、NSAMPLES、END_BLOCK_IDX脚本会先打印完整运行时参数格式切换int 与 mxfp 共用同一份 w4a8.yaml只改--quant_dtype与产物目录即可无需复制策略文件不提交产物outputs/下的离线数据与 PTQ 参数均为相对占位目录不应提交到仓库。按上述流程在昇腾 NPU 上完整跑通后即可获得 Qwen3-0.6B 在 int4/int8 与 mxfp4/mxfp8 两种格式下的 w4a8 量化参数与 PPL 评估结果并可直接复用同一套流程与 w4a8.yaml 策略扩展到其他稠密模型或 MoE 模型的 Attention/MLP 目标量化。【免费下载链接】amctAMCT是CANN提供的昇腾AI处理器亲和的模型压缩工具仓。项目地址: https://gitcode.com/cann/amct创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考