【记录】用AutoAWQ对Qwen3-32B模型做int4量化
用AWQ算法量化Qwen3-32B大语言模型,流程记录
配环境
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)
完整代码
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版本,请参考 AutoAWQ 与 AutoAWQ_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小时跑完;实践中基本上是选取更大的校准集和参数,会需要更好的硬件条件、更长时间
运行的时候用 nvitop
和 htop
看了下,除了要吃显卡性能、大量显存和大量内存,还很吃 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的一些量化版本
开源校准集
其它量化工具
llm-compressor vllm项目一起维护的一个AWQ实现,我自己试了下,似乎很容易OOM。。。文档太长不看
LightCompress (LLMC) 文档太长不看。。。
AngelSlim 虽然感觉目前最易用的是它整理的开源校准数据集,不过开源可嘉。。。
ms-swift 很成熟的LLM全套工具,不过我暂时没有需求去研究它