【记录】用AutoAWQ对Qwen3-32B模型做int4量化

用AWQ算法量化Qwen3-32B大语言模型,流程记录

AWQ量化方法 论文 (arxiv)

AutoAWQ 工具(Github)

Qwen3-32B 模型(huggingface)

配环境

Ubuntu 24,Python 3.12.3

先装 pytorch (Nvidia GPU)

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128

再装 AutoAWQ

pip install transformers==4.51.3 autoawq-kernels autoawq

量化过程

校准数据集 sharegpt_gpt4_qwen (AngelSlim)

Qwen关于AWQ量化的文档

AutoAWQ的文档

完整代码

from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer

model_path = "./Qwen3-32B"
quant_path = "./Qwen3-32B-AWQ"
quant_config = {"zero_point": True, "q_group_size": 128, "w_bit": 4, "version": "GEMM"}

# Load model
model = AutoAWQForCausalLM.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(
    model_path, trust_remote_code=True, device_map="auto", safetensors=True
)



# The pattern of data
""" # Example
msg=[
    {"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},
    {"role": "user", "content": "Tell me who you are."},
    {"role": "assistant", "content": "I am a large language model named Qwen..."}
]
data = []
for msg in dataset:
    text = tokenizer.apply_chat_template(msg, tokenize=False, add_generation_prompt=False)
    data.append(text.strip())
return data
"""
# !!!!!!!!!      Customize the code here for calib_data processing    !!!!!!!!!!!!!!
def data_gen():
    import json

    data = []
    with open("sharegpt_gpt4-qwen3_a22B_output.jsonl", "r", encoding="utf-8") as file:
        for line in file:
            msg = json.loads(line)["messages"]
            text = tokenizer.apply_chat_template(
                msg, tokenize=False, add_generation_prompt=False
            )
            data.append(text.strip())
    return data
# !!!!!!!!!      Customize the code here for calib_data processing    !!!!!!!!!!!!!!



# Quantize
model.quantize(
    tokenizer,
    quant_config=quant_config,
    calib_data=data_gen(),
    n_parallel_calib_samples=1,
    max_calib_samples=256,
    max_calib_seq_len=1024,
)

# Save quantized model
model.save_quantized(quant_path)
tokenizer.save_pretrained(quant_path)

print(f'Model is quantized and saved at "{quant_path}"')

model_path 填自己保存Qwen3-32B模型的地址

quant_path 填量化后模型的输出地址

自行修改函数 data_gen() 的实现,以使用自定义的校准集

或者不给 calib_data 传参,此时就用 AutoAWQ 的默认校准集

自行修改下面这些参数来避免OOM

n_parallel_calib_samples=1,  # 并行校准样本数
max_calib_samples=256,       # 最大校准样本数
max_calib_seq_len=1024,      # 最大校准序列长度

注意事项

关于pytorch版本,如上安装较新的 pytorch2.7.1+CUDA12.8 是可以的

如果你不确定兼容性,想要安装其它的pytorch版本,请参考 AutoAWQAutoAWQ_kernels 对平台与环境的需求来尝试

关于AutoAWQ的安装,如上,只需简单地 先装 autoawq-kernels 再装 autoawq,就可以避免形如 ModuleNotFoundError: No module named 'torch' 的报错

此外,安装时 确保 transformers==4.51.3,否则后面在运行Qwen3-32B的量化时还会遇到形如 AttributeError: 'Catcher' object has no attribute 'attention_type' 的报错,此时还要手动回退 transformers 版本到 4.51.3:

pip uninstall transformers
pip install transformers==4.51.3

关于如何在函数 data_gen() 中处理数据,可以参考上述外链文档以及我的代码

一般来说AWQ量化算法的样本数在128~256之间就行

大于最大序列长度的校准数据样本会被直接丢弃,并发数根据自己硬件条件填

这两个参数的填写可以参考上面我的代码和你的实际运行情况

算力需求

建议 内存128G 起,显存 32G 起,CPU单核 越猛越好

我在自己PC(32G内存+32G虚拟内存+24G显存)上跑,不得不将并发数和序列长度调得很小,就算这样,实际跑下来也吃了大量虚拟内存,大概1小时跑完;实践中基本上是选取更大的校准集和参数,会需要更好的硬件条件、更长时间

运行的时候用 nvitophtop 看了下,除了要吃显卡性能、大量显存和大量内存,还很吃 CPU单核性能 ,多核用不太上,那感觉实践中应该用单核强的CPU以及>=128G的内存来做AWQ量化更好

附录

整合一些调研到的信息,不知道放文章前面还是后面,还是放后面好了。。。

本文动机

催 Qwen 更新 Qwen3-32B-Instruct

模型选择

一般认为,参数量越大的模型,能力越强,而采用较低的量化精度(但最低不应低于4位)可以节约大量显存却只损失相对极少的能力,即 32B-4位量化 > 14B-8位量化 > 7B-16位,因此一般单卡PC(22G/24G)上就部署 32B-4位量化 这种水平的模型

关于AWQ量化

一种4位量化方式,一般认为其是效果最好的(相比于GPTQ、INT4),可以看到比较新的工作在4位这个量化尺度用AWQ的比较多

具体的性能如何,一般是自己实际测过才知道,LLM的评测跑分只有一定的参考价值

其它路径

尝试GGUF格式的模型

实际上更值得一提的是 llama-cpp ,对于各种尺寸的权重量化、 KV缓存量化 都已经有很好的原生支持

绝大多数消费级GPU显存都不够,那可以考虑往 GGUF 这边靠,这边模型选择挺多、推理效率也还算高、生态适配也更优秀;相比之下,transformers 这边的 vllm 确实很猛,但还是太吃显卡数量了,况且 vllm 它显然是 不打算 也不太可能 去及时适配 所有 transformers 模型 和 所有平台 的了

关于量化哪些东西会更敏感(对性能伤害大),许多时候可能是 权重 > K > V,实践中直接对 K 和 V 都进行8位量化一般会损失很小的性能,同等的有限显存条件下 全精度权重+8位K量化+4位V量化有较大概率会是理想的实践

参考资料
https://github.com/ggml-org/llama.cpp/pull/7412
https://www.reddit.com/r/LocalLLaMA/comments/1dalkm8/memory_tests_using_llamacpp_kv_cache_quantization/
https://www.reddit.com/r/LocalLLaMA/comments/1flw4of/does_q48_kv_cache_quantization_have_any_impact_on/

直接获得现成的AWQ量化模型

  • 许多HuggingFace模型的readme中也会包含官方量化版本的链接

  • 还是在HuggingFace的模型介绍页面,Ctrl+F Quantizations 就能发现一个 收录 “当前模型的所有量化版本” 的链接,可以看到其它人发布的该模型的量化模型,从它们的文档你可以自己调研你想知道的东西(包括它们用什么校准集,以及本文还未涉及的 LLM量化后的性能评测 环节)

  • swift在modelscope的主页 也可以找到Qwen3的一些量化版本

开源校准集

中文基于Qwen3-235B-2507蒸馏数据集

中文基于满血DeepSeek-R1蒸馏数据集

其它量化工具

llm-compressor vllm项目一起维护的一个AWQ实现,我自己试了下,似乎很容易OOM。。。文档太长不看

LightCompress (LLMC) 文档太长不看。。。

AngelSlim 虽然感觉目前最易用的是它整理的开源校准数据集,不过开源可嘉。。。

ms-swift 很成熟的LLM全套工具,不过我暂时没有需求去研究它

posted @ 2025-08-03 00:38  ilxT  阅读(707)  评论(0)    收藏  举报