模型量化有两个主流方案:W4A16(权重 4bit,激活 fp16)和 W8A8(权重和激活都 8bit)。在昇腾NPU上,W4A16 显存省最多,W8A8 速度最快。选哪个取决于你的瓶颈在显存还是速度。

W4A16(GPTQ/AWQ)

权重压缩到 4bit,激活保持 fp16。推理时把权重反量化回 fp16 再算 GEMM。

from atb import LLM, QuantConfig

model = LLM(
    "meta-llama/Llama-2-7b-hf",
    device="npu:0",
    quantize="w4a16",       # 权重 4bit,激活 fp16
    quant_config=QuantConfig(
        group_size=128,       # 每 128 个权重共享一个缩放因子
        desc_act=False,       # 不量化激活(保持 fp16)
    )
)

优点:

  • 显存占用最小:Llama2-7B 从 14GB 降到 4GB
  • 精度损失小:group_size=128 时约 0.3-0.8%
  • 激活保持 fp16,Attention 部分无精度损失

缺点:

  • GEMM 前需要反量化:增加 5-10ms 延迟
  • 4bit GEMM 的 Cube 利用率只有 60-70%(不齐整)

W8A8(SmoothQuant)

权重和激活都量化到 int8。GEMM 直接用 int8 计算,不需要反量化。

from atb import LLM, QuantConfig

model = LLM(
    "meta-llama/Llama-2-7b-hf",
    device="npu:0",
    quantize="w8a8",        # 权重和激活都 int8
    quant_config=QuantConfig(
        calib_dataloader=calib_dataloader,  # W8A8 需要校准数据集
        smooth_quant=True,  # 使用 SmoothQuant 算法
    )
)

优点:

  • 推理速度最快:GEMM 吞吐是 fp16 的 1.8-2.0×
  • 不需要反量化:int8 GEMM 直接出结果
  • Cube 利用率高:int8 计算齐整

缺点:

  • 显存节省不如 W4A16:Llama2-7B 约 7GB(vs W4A16 的 4GB)
  • 精度损失较大:约 1.0-2.0%(激活量化引入)
  • 需要校准数据集:多一个步骤

性能对比

Llama2-7B,Atlas 800I A2,单卡:

量化方案显存 (GB)Prefill 延迟 (ms)Decode 速度 (tok/s)精度损失
fp16(基准)14353,2000%
W4A164422,8000.3-0.8%
W8A87225,8001.0-2.0%
W4A16(70B,4 卡)361201,8000.5-1.0%
W8A8(70B,4 卡)52753,2001.5-2.5%

选择建议

场景推荐方案理由
显存受限(单卡跑 13B/70B)W4A16显存省最多,精度损失可接受
速度优先(在线服务)W8A8速度快 80%,延迟低 40%
精度敏感(评测、翻译)W4A16精度损失小 50%
离线批量推理W8A8吞吐高,不关心延迟
多模态模型W4A16激活保持 fp16,图像 token 无精度损失

W4A16 的 Group Size 调优

Group size 越小,精度越高,但显存开销越大:

Group Size额外显存 (7B)精度损失推荐场景
32+1.5GB0.1-0.3%精度极度敏感
64+0.75GB0.2-0.5%通用推荐
128+0.4GB0.3-0.8%平衡选择
256+0.2GB0.5-1.2%显存极度受限

通用场景选 group_size=128,精度损失 <1%,额外显存只有 400MB。


W4A16 和 W8A8 各有优势:要显存省选 W4A16,要速度快选 W8A8。在昇腾NPU上,W8A8 的 int8 GEMM 有硬件加速,速度提升明显。仓库在这里:

https://atomgit.com/cann/ATB

更多推荐