更新时间:2025-07-14 GMT+08:00
分享

W8A8量化

什么是W8A8量化

W8A8量化是一种将模型权重和激活值都量化为8位数据的技术。该技术把高位浮点数转为8位,通常是将权重和激活值从16位或32位浮点数转换为8位整数(int8)格式。量化后,模型权重体积会减少,同时使用int8格式数据进行矩阵乘法(MatMul)运算时,可减少计算量,进而提升推理性能。

W8A8量化方案能降低模型显存以及需要部署的卡数。也能同时降低首token时延和增量推理时延。

约束限制

  • 支持SmoothQuant(W8A8)量化的模型列表请参见支持的模型列表
  • 激活量化支持动态per-token和静态per-tensor,支持非对称量化。
  • 权重量化支持per-channel,支持非对称量化。
  • Deepseek-v2系列模型的W8A8量化需要使用llm-compressor工具。

SmoothQuant量化模型

本章节介绍如何使用SmoothQuant量化工具实现推理量化。

  1. SmoothQuant量化工具使用到的脚本存放在代码包AscendCloud-LLM-x.x.x.zip的llm_tools目录下。

    代码目录如下:

    AutoSmoothQuant  #量化工具
             ├── ascend_autosmoothquant_adapter  # 昇腾量化使用的算子模块
             ├── autosmoothquant                 # 量化代码
             ├── build.sh                        # 安装量化模块的脚本
              ...
  2. 执行如下命令进行权重转换。
    cd autosmoothquant/examples/
    python smoothquant_model.py --model-path /home/ma-user/llama-2-7b/ --quantize-model --generate-scale --dataset-path /data/nfs/user/val.jsonl --scale-output scales/llama2-7b.pt --model-output quantized_model/llama2-7b --per-token --per-channel

    参数说明:

    • --model-path:原始模型权重路径。
    • --quantize-model:体现此参数表示会生成量化模型权重。不需要生成量化模型权重时,不体现此参数
    • --generate-scale:体现此参数表示会生成量化系数,生成后的系数保存在--scale-output参数指定的路径下。如果有指定的量化系数,则不需此参数,直接读取--scale-input参数指定的量化系数输入路径即可。
    • --dataset-path:数据集路径,推荐使用:https://huggingface.co/datasets/mit-han-lab/pile-val-backup/resolve/main/val.jsonl.zst。
    • --scale-output:量化系数保存路径。
    • --scale-input:量化系数输入路径,如果之前已生成过量化系数,则可指定该参数,跳过生成scale的过程。
    • --model-output:量化模型权重保存路径。
    • --smooth-strength:平滑系数,推荐先指定为0.5,后续可以根据推理效果进行调整。
    • --per-token:激活值量化方法,如果指定则为per-token粒度量化,否则为per-tensor粒度量化。
    • --per-channel:权重量化方法,如果指定则为per-channel粒度量化,否则为per-tensor粒度量化。
  3. 参考启动推理服务,启动推理服务时添加如下命令。
    -q smoothquant 或者 --quantization smoothquant

使用llm-compressor工具量化Deepseek-v2系列模型

本章节介绍如何在GPU的机器上使用开源量化工具llm-compressor量化模型权重,然后在NPU的机器上实现推理量化。

具体操作如下:

  1. 开始之前,请确保安装了以下库:
    git clone https://github.com/vllm-project/llm-compressor.git
    cd llm-compressor
    pip install -e .
  2. 修改examples/quantizing_moe/deepseek_moe_w8a8_int8.py中的代码:

    1)如果本地已有权重,请将MODEL_ID修改为权重路径;

    MODEL_ID = "deepseek-ai/DeepSeek-Coder-V2-Lite-Instruct"
    2)如果量化Deepseek-V2-236B模型,请将num_gpus改为8;
    device_map = calculate_offload_device_map(
        MODEL_ID,
        reserve_for_hessians=True,
        num_gpus=8,
        torch_dtype=torch.bfloat16,
        trust_remote_code=True,
    )
    3)为减少量化时间,建议将以下参数设置为512;
    NUM_CALIBRATION_SAMPLES = 512
  3. 执行权重量化:
    python deepseek_moe_w8a8_int8.py

1、执行权重量化过程中,请保证使用的GPU卡上没有其他进程,否则可能出现OOM;

2、如果量化Deepseek-v2-236b模型,大致需要10+小时。

相关文档