QLean模型量化工具 (v0.1.0)
概述
本量化工具提供易用、高效的模型量化与反量化能力。用户只需通过指定不同的配置文件(Recipe),即可一键切换功能模式。当前支持的功能包括:
FP8 → BF16 反量化:将 FP8 格式的模型权重恢复为 BF16 精度,便于调试或后续处理。
W8A8-INT8 量化:对模型进行权重量化(W8)与激活量化(A8),输出标准 INT8 量化模型。
混合量化:根据模型结构对 W8A8 模型部分层保留高精度,在精度与性能间取得更优平衡。
支持一键量化的模型 | 原始 | 反量化(FP8->BF16) | 量化(->W8A8 int8) | |
DeepSeek | DeepSeek-V3.1 | FP8 | Y | Y |
DeepSeek-V3.1-Terminus | FP8 | Y | Y | |
DeepSeek-V3.2-Exp | FP8 | Y | Y | |
DeepSeek-R1 | FP8 | Y | Y | |
DeepSeek-R1-0528 | FP8 | Y | Y | |
Qwen3-MOE | Qwen3-235B-A22B | BF16 | NA | Y(混合量化) |
Qwen3-235B-A22B-Instruct-2507 | BF16 | NA | Y(混合量化) | |
Qwen3-Coder-480B-A35B-Instruct | BF16 | NA | Y(混合量化) | |
Qwen3-Next | Qwen3-Next-80B-A3B-Instruct | BF16 | NA | Y |
Qwen3-VL | Qwen3-VL-235B-A22B-Instruct | BF16 | NA | Y |
Qwen3-VL-30B-A3B-Instruct | BF16 | NA | Y | |
Qwen3-VL-32B/8B/4B/2B-Instruct | BF16 | NA | Y | |
工具使用
已发布whl包,可在PIP源List中查看并通过pip install方式使用。
安装
# 安装依赖
pip install triton_kernel==1.0.0+ppu2.0.0.oe
# 安装qlean
pip install qlean==0.1.0+ppu2.0.0.oe参数介绍
--model_name:模型名称。必须,要求格式与HuggingFace上的model_stub一致,例如“deepseek-ai/DeepSeek-V3.2-Exp”。--model_path:原始模型路径。必须,要求输入本地路径,例如HuggingFace模型本地缓存路径。--save_path:反量化/量化后得到的模型路径。必须。--mix_path:混合量化模型路径。非必须。--recipe:量化配置文件路径。非必须,要求是yaml文件路径。对于“支持一键量化的模型”表中的模型,用户可省略 recipe 参数,系统将自动加载。
对于其他模型,用户需手动编写并提供 recipe 参数(关于 recipe 的编写方法,见“Recipe编写”部分)。
功能
用户通过输入不同的recipe切换功能,下面对于不同功能给出操作样例:
W8A8-INT8 量化
原始模型可为FP8或BF16格式,系统会根据原始模型的精度类型自动选择适配策略:若模型为FP8格式,自动切换至更精确的量化模式;若模型为BF16格式,使用通用量化模式。
# /path/to/.../ 请根据实际进行修改 # 原始模型为FP8 qlean --model_name deepseek-ai/DeepSeek-R1-0528 --model_path /path/to/DeepSeek-R1-0528/ --save_path /path/to/DeepSeek-R1-0528-INT8/ # 原始模型为BF16 qlean --model_name Qwen/Qwen3-VL-30B-A3B-Instruct --model_path /path/to/Qwen3-VL-30B-A3B-Instruct/ --save_path /path/to/Qwen3-VL-30B-A3B-Instruct-INT8/FP8 → BF16 反量化
# /path/to/.../ 请根据实际进行修改 qlean --model_name deepseek-ai/DeepSeek-V3.2 --model_path /path/to/DeepSeek-V3.2/ --save_path /path/to/DeepSeek-V3.2-BF16/ --recipe /path/to/dequant.yaml# dequant.yaml 内容 --- dequant_stage: dequant_modifiers: dequantModifier: {} ...混合量化
在 W8A8-INT8 量化后,部分模型在特定用例上出现精度下降问题,原因可能为模型某些 layer 对精度敏感,可用混合量化功能将 W8A8 量化模型中的指定layer替换回 BF16 版本。此时,save_path 对应 W8A8 模型,mix_path 保存混合量化模型。
# /path/to/.../ 请根据实际进行修改 qlean --model_name Qwen/Qwen3-235B-A22B-Instruct-2507 --model_path /path/to/Qwen3-235B-A22B-Instruct-2507/ --save_path /path/to/Qwen3-235B-A22B-Instruct-2507-INT8/ --mix_path /path/to/Qwen3-235B-A22B-Instruct-2507-MIX/
Recipe编写
若需对“支持一键量化的模型”表外的模型进行W8A8-INT8 量化,用户可参考以下 recipe 编写 YAML 文件,仅需改动ignore部分。
---
quant_stage:
quant_modifiers:
generalDay0Modifier:
ignore: ["module_to_ignore"] # 请根据实际进行修改
scheme: W8A8
...在编写量化配置中的ignore列表时,应加入所有对于量化敏感的模块。通常不应量化的模块包括:re:.*lm_head、re:.*embed_tokens、re:.*mlp.gate$。注意,不同架构的模型需要 ignore 的模块不同,应当按需添加。
若需对“支持一键量化的模型”表外的模型进行 混合量化,用户需在上述 recipe 基础上额外增加 mixedPrecisionModifier 部分。layers 给出需要替换为 BF16 的layer id,num_layers 给出模型的总层数。
---
quant_stage:
quant_modifiers:
generalDay0Modifier:
ignore: ["re:.*lm_head", "re:.*embed_tokens", "re:.*mlp.gate$"] # 请根据实际进行修改
scheme: W8A8
mixedPrecisionModifier:
layers: ['88', '89', '92-93'] # 请根据实际进行修改
num_layers: 94 # 请根据实际进行修改
...编写完 YAML 文件后使用 --recipe 参数传入该文件地址。
# /name/of/.../和/path/to/.../ 请根据实际进行修改
qlean --model_name /name/of/model/ --model_path /path/to/original_model/ --save_path /path/to/result_model/ --recipe /path/to/your/recipe/使用样例:DeepSeek-V3.2 进行 W8A8-INT8 量化
step1 编写 deepseek-v3.2-recipe.yaml。
---
quant_stage:
quant_modifiers:
generalDay0Modifier:
ignore: ["re:.*lm_head", "re:.*embed_tokens", "re:.*mlp.gate$"]
scheme: W8A8
...step2 输入模型名称、原始模型路径和量化模型路径,进行W8A8-INT8 量化。
qlean --model_name deepseek-ai/DeepSeek-V3.2 --model_path /path/to/DeepSeek-V3.2/ --save_path /path/to/DeepSeek-V3.2-INT8/ --recipe /path/to/deepseek-v3.2-recipe.yaml 测试数据
测试结果表明,经 QLean 工具转化的模型在推理精度和性能方面均正常,符合预期。具体数据如下所示:
Sglang推理精度
测试镜像信息:pytorch2.8.0-ubuntu24.04-cuda12.9-sglang0.5.5-py312
Model | DataSet | 真武810E上原始权重精度 | QLean量化工具转化后权重精度 | Compare Ratio | ||
data_type | Eval | data_type | Eval | |||
deepseek-ai/DeepSeek-V3.2 | ifeval | W8A8-INT8 | 88.5 | W8A8-INT8 | 88.1 | 99.55% |
gsm8k | W8A8-INT8 | 95.3 | W8A8-INT8 | 96.3 | 101.05% | |
ceval | W8A8-INT8 | 92.1 | W8A8-INT8 | 91.0 | 98.81% | |
deepseek-ai/DeepSeek-R1-0528 | ifeval | BF16 | 80.2 | BF16 | 81.8 | 102.00% |
gsm8k | BF16 | 96.1 | BF16 | 96.7 | 100.62% | |
ceval | BF16 | 89.6 | BF16 | 90.1 | 100.56% | |
deepseek-ai/DeepSeek-R1-0528 | ifeval | W8A8-INT8 | 81.7 | W8A8-INT8 | 81.5 | 99.76% |
gsm8k | W8A8-INT8 | 96.3 | W8A8-INT8 | 96.4 | 100.10% | |
ceval | W8A8-INT8 | 89.8 | W8A8-INT8 | 90.2 | 100.45% | |
Qwen/Qwen3-235B-A22B-Instruct-2507 | ifeval | BF16 | 87.2 | W8A8-INT8 混合量化 | 88.1 | 101.03% |
gsm8k | BF16 | 96.6 | W8A8-INT8 混合量化 | 96.4 | 99.79% | |
ceval | BF16 | 91.8 | W8A8-INT8 混合量化 | 91.0 | 99.13% | |
注:由于真武810E不支持FP8,所以对于原始权重为FP8的情况,使用当前测试的W8A8权重作为对比。
vLLM推理精度
测试镜像信息:pytorch2.9.0-ubuntu24.04-cuda12.9-vllm0.12.0-py312
Model | DataSet | 真武810E上原始权重精度 | QLean量化工具转化后权重精度 | Compare Ratio | ||
data_type | Eval | data_type | Eval | |||
deepseek-ai/DeepSeek-V3.2 | ifeval | W8A8-INT8 | 86.5 | W8A8-INT8 | 88.5 | 102.3% |
gsm8k | W8A8-INT8 | 95.6 | W8A8-INT8 | 96.0 | 100.4% | |
ceval | W8A8-INT8 | 91.4 | W8A8-INT8 | 91.3 | 99.9% | |
deepseek-ai/DeepSeek-R1-0528 | ifeval | BF16 | 79.1 | BF16 | 80.5 | 101.8% |
gsm8k | BF16 | 96.2 | BF16 | 96.7 | 100.5% | |
ceval | BF16 | 89.6 | BF16 | 91.3 | 101.9% | |
deepseek-ai/DeepSeek-R1-0528 | ifeval | W8A8-INT8 | 79.8 | W8A8-INT8 | 79.6 | 99.7% |
gsm8k | W8A8-INT8 | 96.2 | W8A8-INT8 | 96.7 | 100.5% | |
ceval | W8A8-INT8 | 90.1 | W8A8-INT8 | 90.0 | 99.9% | |
Qwen/Qwen3-235B-A22B-Instruct-2507 | ifeval | BF16 | 88.5 | W8A8-INT8 混合量化 | 87.2 | 98.5% |
gsm8k | BF16 | 96.8 | W8A8-INT8 混合量化 | 96.5 | 99.7% | |
ceval | BF16 | 90.6 | W8A8-INT8 混合量化 | 91.2 | 100.7% | |
mmlu_pro | BF16 | 79.5 | W8A8-INT8 混合量化 | 79.2 | 99.6% | |
Qwen/Qwen3-Next-80B-A3B-Instruct | ifeval | BF16 | 87.2 | W8A8-INT8 | 87.4 | 100.2% |
gsm8k | BF16 | 96.5 | W8A8-INT8 | 96.2 | 99.7% | |
ceval | BF16 | 90.6 | W8A8-INT8 | 90.2 | 99.6% | |
mmlu_pro | BF16 | 81.2 | W8A8-INT8 | 81.3 | 100.1% | |
Qwen/Qwen3-VL-30B-A3B-Instruct | mvbench | BF16 | 66.1 | W8A8-INT8 | 65.8 | 99.5% |
ifeval | BF16 | 84.8 | W8A8-INT8 | 85.2 | 100.5% | |
gsm8k | BF16 | 96.0 | W8A8-INT8 | 96.0 | 100.0% | |
ceval | BF16 | 84.9 | W8A8-INT8 | 84.4 | 99.4% | |
注:由于真武810E不支持FP8,所以对于原始权重为FP8的情况,使用当前测试的W8A8权重作为对比。
Sglang性能
测试镜像信息:pytorch2.8.0-ubuntu24.04-cuda12.9-sglang0.5.5-py312
Model | input_len | output_len | 原始权重性能数据 | QLean所转权重的性能数据 | Compare Ratio | ||||||||||||||
datatype | TP | 并发数 | 操作数 | Total Throughput /s/card | Output Throughput /s/card | ttft (ms) | tpot (ms) | datatype | TP | 并发数 | 操作数 | Total Throughput /s/card | Output Throughput /s/card | ttft (ms) | tpot (ms) | ||||
deepseek-ai/DeepSeek-V3.2 | 800-1000 | 300-500 | W8A8-INT8 | 8 | 32 | 320 | 56.286 | 17.762 | 1479.319 | 100.041 | W8A8-INT8 | 8 | 30 | 300 | 55.364 | 17.444 | 1364.088 | 100.625 | 98.4% |
deepseek-ai/DeepSeek-R1-0528 | 2800-5200 | 1050-1950 | BF16 | 16 | 13 | 130 | 76.078 | 20.745 | 668.408 | 36.507 | BF16 | 16 | 13 | 130 | 76.063 | 20.741 | 670.283 | 36.53 | 100.0% |
2800-5200 | 1050-1950 | W8A8-INT8 | 8 | 13 | 130 | 132.563 | 36.148 | 639.606 | 42.055 | W8A8-INT8 | 8 | 13 | 130 | 132.123 | 36.028 | 638.907 | 42.18 | 99.7% | |
Qwen/Qwen3-235B-A22B-Instruct-2507 | 2800-5200 | 1050-1950 | BF16 | 8 | 106 | 1060 | 489.726 | 133.54 | 2780.778 | 92.187 | W8A8-INT8 混合量化 | 4 | 95 | 950 | 832.724 | 227.071 | 2337.891 | 97.278 | 170.0% |
Qwen/Qwen3-VL-30B-A3B-Instruct | 2800-5200 | 1050-1950 | BF16 | 2 | 72 | 720 | 2615.439 | 713.185 | 431.293 | 47.78 | W8A8-INT8 | 2 | 98 | 980 | 3371.56 | 919.365 | 430.125 | 50.481 | 128.9% |
注:由于真武810E不支持FP8,所以对于原始权重为FP8的情况,使用当前测试的W8A8权重作为对比。
vLLM性能
测试镜像信息:pytorch2.9.0-ubuntu24.04-cuda12.9-vllm0.12.0-py312
Model | input_len | output_len | 原始权重性能数据 | QLean所转权重的性能数据 | Compare Ratio | ||||||||||||||
datatype | TP | 并发数 | 操作数 | Total Throughput /s/card | Output Throughput /s/card | ttft (ms) | tpot (ms) | datatype | TP | 并发数 | 操作数 | Total Throughput /s/card | Output Throughput /s/card | ttft (ms) | tpot (ms) | ||||
deepseek-ai/DeepSeek-V3.2 | 800-1000 | 300-500 | W8A8-INT8 | 8 | 39 | 390 | 72.259 | 22.777 | 804.091 | 100.271 | W8A8-INT8 | 8 | 40 | 400 | 72.506 | 22.845 | 947.792 | 98.14 | 100.3% |
deepseek-ai/DeepSeek-R1-0528 | 2800-5200 | 1050-1950 | BF16 | 16 | 28 | 280 | 107.755 | 29.382 | 2371.914 | 55.35 | BF16 | 16 | 26 | 260 | 105.566 | 28.786 | 589.644 | 53.167 | 98.0% |
W8A8-INT8 | 8 | 28 | 280 | 194.585 | 53.059 | 2652.877 | 61.402 | W8A8-INT8 | 8 | 26 | 260 | 191.23 | 52.145 | 686.914 | 58.728 | 98.3% | |||
Qwen/Qwen3-235B-A22B-Instruct-2507 | 2800-5200 | 1050-1950 | BF16 | 8 | 120 | 1200 | 507.971 | 138.515 | 2690.231 | 100.796 | W8A8-INT8 混合量化 | 4 | 104 | 1040 | 899.99 | 245.412 | 956.795 | 98.988 | 177.2% |
Qwen/Qwen3-VL-30B-A3B-Instruct | 2800-5200 | 1050-1950 | BF16 | 2 | 82 | 820 | 2822.723 | 769.657 | 321.365 | 50.33 | W8A8-INT8 | 2 | 104 | 1040 | 3628.596 | 988.915 | 287.425 | 49.591 | 128.5% |
注:由于真武810E不支持FP8,所以对于原始权重为FP8的情况,使用当前测试的W8A8权重作为对比。
已知问题
Qwen3-Next系列模型架构较新,经过W8A8-INT8量化后,在vllm上的性能待优化,在高版本sglang上暂不支持。
DeepSeek-V3.2反量化模型,框架暂未支持。