对于一个利用业余时间维护项目的独立开发者来说,维护像 AutoAWQ 这样拥有超过 200 万次下载、Huggingface 上 7000 多个模型和 2.1k 星标的项目,其难度不言而喻。
重要通知:
- AutoAWQ 已正式弃用,将不再维护。
- 最后一个经过测试的配置使用了 Torch 2.6.0 和 Transformers 4.51.3。
- 如果未来版本的 Transformers 破坏了 AutoAWQ 的兼容性,请向 Transformers 项目报告该问题。
替代方案:
- AutoAWQ 已被 vLLM 项目采纳:https://github.com/vllm-project/llm-compressor
- MLX-LM 现已支持 Mac 设备的 AWQ:http://github.com/ml-explore/mlx-lm
如有进一步疑问,欢迎联系:
- X:https://x.com/casper_hansen_
- LinkedIn:https://www.linkedin.com/in/casper-hansen-804005170/
AutoAWQ 是一个易于使用的 4 位量化模型工具包。与 FP16 相比,AutoAWQ 可将模型速度提升 3 倍,并将内存需求减少 3 倍。AutoAWQ 实现了用于量化 LLM 的激活感知权重量化(AWQ)算法。AutoAWQ 基于 MIT 的原始工作创建并改进。
最新动态 🔥
- [2024/06] 支持 CPU 推理(x86)- 感谢 Intel。支持 Cohere 和 Phi3。
- [2024/04] 支持 StableLM 和 StarCoder2。
- [2024/03] 支持 Gemma。
- [2024/02] 支持 FP16 下的 PEFT 兼容训练。
- [2024/02] 通过 ExLlamaV2 内核支持 AMD ROCm。
- [2024/01] 导出到 GGUF,ExLlamaV2 内核,上下文处理速度提升 60%。
- [2023/12] 支持 Mixtral、LLaVa、QWen、Baichuan 模型。
- [2023/11] AutoAWQ 推理已集成到 🤗 transformers 中。现在包含 CUDA 12.1 的 wheel 包。
- [2023/10] 支持 Mistral(融合模块)、Bigcode、Turing,修复内存 Bug(节省 2GB VRAM)
- [2023/09] 融合模型(现包括 MPT 和 Falcon)速度提升 1.6 倍至 2.5 倍。
- [2023/09] 支持多 GPU,修复 Bug,并提供更好的基准测试脚本
- [2023/08] 发布 PyPi 包并提供 AutoModel 类
有几种安装 AutoAWQ 的方式:
默认安装:
pip install autoawq安装包含内核的版本:
pip install autoawq[kernels]从主分支安装以获得 Intel CPU 和 Intel XPU 的优化性能:
pip install autoawq[cpu]在 examples 目录下,您可以找到如何量化、运行推理和基准测试 AutoAWQ 模型的示例。
AWQ 有两个版本:GEMM 和 GEMV。这两个名称都与底层矩阵乘法的运行方式有关。我们建议如下:
对于批大小较小的小型 7B 模型,我们处于内存受限状态。这意味着我们受限于 GPU 在内存中移动权重的带宽,这本质上限制了我们每秒可以生成的令牌数。内存受限是量化模型更快的原因,因为您的权重小了 3 倍,因此可以在内存中更快地移动。这与计算受限不同,在计算受限的情况下,生成过程中花费的主要时间是进行矩阵乘法。
在计算受限的场景中(发生在批大小较大时),使用 W4A16 量化模型不会获得速度提升,因为反量化的开销会减慢整体生成速度。这是因为 AWQ 量化模型仅以 INT4 存储权重,但在推理期间执行 FP16 操作,因此我们本质上是在推理期间将 INT4 -> FP16 进行转换。
融合模块是您从 AutoAWQ 获得的大部分加速的来源。其思想是将多个层组合成单个操作,从而提高效率。融合模块代表一组与 Huggingface 模型分开工作的自定义模块。它们与 model.generate() 和其他 Huggingface 方法兼容,但如果您激活融合模块,在使用模型时会带来一些不灵活性:
fuse_layers=True 时,融合模块被激活。AutoAWQForCausalLM.from_quantized(max_seq_len=seq_len, batch_size=batch_size)model.generate() 返回的 past_key_values 只是虚拟值,因此不能在生成后使用。更多示例可以在 examples 目录 中找到。
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
model_path = 'mistralai/Mistral-7B-Instruct-v0.2'
quant_path = 'mistral-instruct-v0.2-awq'
quant_config = { "zero_point": True, "q_group_size": 128, "w_bit": 4, "version": "GEMM" }
# 加载模型
model = AutoAWQForCausalLM.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
# 量化
model.quantize(tokenizer, quant_config=quant_config)
# 保存量化模型
model.save_quantized(quant_path)
tokenizer.save_pretrained(quant_path)
print(f'Model is quantized and saved at "{quant_path}"')
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer, TextStreamer
from awq.utils.utils import get_best_device
device = get_best_device()
quant_path = "TheBloke/zephyr-7B-beta-AWQ"
# 加载模型
model = AutoAWQForCausalLM.from_quantized(quant_path, fuse_layers=True)
tokenizer = AutoTokenizer.from_pretrained(quant_path, trust_remote_code=True)
streamer = TextStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
# 将提示转换为令牌
prompt_template = """\
<|system|>
</s>
<|user|>
{prompt}</s>
<|assistant|>"""
prompt = "You're standing on the surface of the Earth. "\
"You walk one mile south, one mile west and one mile north. "\
"You end up exactly where you started. Where are you?"
tokens = tokenizer(
prompt_template.format(prompt=prompt),
return_tensors='pt'
).input_ids.to(device)
# 生成输出
generation_output = model.generate(
tokens,
streamer=streamer,
max_seq_len=512
)
这些基准测试展示了处理上下文(预填充)和生成令牌(解码)的速度和内存使用情况。结果包括不同批大小和不同版本 AWQ 内核下的速度。我们力求使用您可以复现结果的相同基准测试工具来公平地测试模型。请注意,速度不仅因 GPU 而异,也因 CPU 而异。最重要的是具有高内存带宽的 GPU 和高单核时钟速度的 CPU。
python examples/benchmark.py --model_path <hf_model> --batch_size 1| 模型名称 | 大小 | 版本 | 批大小 | 预填充长度 | 解码长度 | 预填充 tokens/s | 解码 tokens/s | 内存(VRAM) |
|---|---|---|---|---|---|---|---|---|
| Vicuna | 7B | 🟢GEMV | 1 | 64 | 64 | 639.65 | 198.848 | 4.50 GB (19.05%) |
| Vicuna | 7B | 🟢GEMV | 1 | 2048 | 2048 | 1123.63 | 133.191 | 6.15 GB (26.02%) |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| Mistral | 7B | 🔵GEMM | 1 | 64 | 64 | 1093.35 | 156.317 | 4.35 GB (18.41%) |
| Mistral | 7B | 🔵GEMM | 1 | 2048 | 2048 | 3897.02 | 114.355 | 5.55 GB (23.48%) |
| Mistral | 7B | 🔵GEMM | 8 | 64 | 64 | 4199.18 | 1185.25 | 4.35 GB (18.41%) |
| Mistral | 7B | 🔵GEMM | 8 | 2048 | 2048 | 3661.46 | 829.754 | 16.82 GB (71.12%) |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| Mistral | 7B | 🟢GEMV | 1 | 64 | 64 | 531.99 | 188.29 | 4.28 GB (18.08%) |
| Mistral | 7B | 🟢GEMV | 1 | 2048 | 2048 | 903.83 | 130.66 | 5.55 GB (23.48%) |
| Mistral | 7B | 🔴GEMV | 8 | 64 | 64 | 897.87 | 486.46 | 4.33 GB (18.31%) |
| Mistral | 7B | 🔴GEMV | 8 | 2048 | 2048 | 884.22 | 411.893 | 16.82 GB (71.12%) |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| TinyLlama | 1B | 🟢GEMV | 1 | 64 | 64 | 1088.63 | 548.993 | 0.86 GB (3.62%) |
| TinyLlama | 1B | 🟢GEMV | 1 | 2048 | 2048 | 5178.98 | 431.468 | 2.10 GB (8.89%) |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| Llama 2 | 13B | 🔵GEMM | 1 | 64 | 64 | 820.34 | 96.74 | 8.47 GB (35.83%) |
| Llama 2 | 13B | 🔵GEMM | 1 | 2048 | 2048 | 2279.41 | 73.8213 | 10.28 GB (43.46%) |
| Llama 2 | 13B | 🔵GEMM | 3 | 64 | 64 | 1593.88 | 286.249 | 8.57 GB (36.24%) |
| Llama 2 | 13B | 🔵GEMM | 3 | 2048 | 2048 | 2226.7 | 189.573 | 16.90 GB (71.47%) |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| MPT | 7B | 🔵GEMM | 1 | 64 | 64 | 1079.06 | 161.344 | 3.67 GB (15.51%) |
| MPT | 7B | 🔵GEMM | 1 | 2048 | 2048 | 4069.78 | 114.982 | 5.87 GB (24.82%) |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| Falcon | 7B | 🔵GEMM | 1 | 64 | 64 | 1139.93 | 133.585 | 4.47 GB (18.92%) |
| Falcon | 7B | 🔵GEMM | 1 | 2048 | 2048 | 2850.97 | 115.73 | 6.83 GB (28.88%) |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| CodeLlama | 34B | 🔵GEMM | 1 | 64 | 64 | 681.74 | 41.01 | 19.05 GB (80.57%) |
| CodeLl |