OA0 = Omni AI 0
OA0 是一个探索 AI 的论坛
现在注册
已注册用户请  登录
OA0  ›  代码  ›  AutoAWQ — AWQ 量化工具

AutoAWQ — AWQ 量化工具

 
  logging ·  2026-02-28 01:06:37 · 3 次点击  · 0 条评论  

重要通知:vLLM 项目已全面采用 AutoAWQ

对于一个利用业余时间维护项目的独立开发者来说,维护像 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

| 路线图 | 示例 | 问题:寻求帮助 |

Huggingface - Models GitHub - Releases PyPI - Downloads

由以下机构支持

RunPod Logo

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 类

安装

前提条件

  • NVIDIA:
  • 您的 NVIDIA GPU 计算能力必须为 7.5 或更高。支持 Turing 及以后的架构。
  • 您的 CUDA 版本必须是 CUDA 11.8 或更高。
  • AMD:
  • 您的 ROCm 版本必须与 Triton 兼容。
  • Intel CPU 和 Intel GPU:
  • 您的 torch 和 intel_extension_for_pytorch 包版本应至少为 2.4 以获得优化性能。
  • 或者,您可以依赖 GPU 的 triton 内核,那么您需要安装 intel-xpu-backend-for-triton 以及兼容的 torch 和 transformers。最简单的方法是使用预构建的 wheel 包

从 PyPi 安装

有几种安装 AutoAWQ 的方式:

  1. 默认安装:

    • pip install autoawq
    • 注意:默认安装不包含外部内核,推理依赖于 Triton。
  2. 安装包含内核的版本:

    • pip install autoawq[kernels]
    • 注意:这要求您匹配内核构建时所使用的最新 torch 版本。
    • 注意:这会安装 https://github.com/casper-hansen/AutoAWQ_kernels
  3. 从主分支安装以获得 Intel CPU 和 Intel XPU 的优化性能:

    • pip install autoawq[cpu]
    • 注意:需要 torch 版本至少为 2.4.0。

使用

examples 目录下,您可以找到如何量化、运行推理和基准测试 AutoAWQ 模型的示例。

INT4 GEMM vs INT4 GEMV vs FP16

AWQ 有两个版本:GEMM 和 GEMV。这两个名称都与底层矩阵乘法的运行方式有关。我们建议如下:

  • GEMV(量化):比 GEMM 快 20%,仅支持批大小为 1(不适合大上下文)。
  • GEMM(量化):在批大小低于 8 时比 FP16 快得多(适合大上下文)。
  • FP16(非量化):推荐用于最高吞吐量:vLLM

计算受限 vs 内存受限

对于批大小较小的小型 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)
  • 融合模块中的主要加速器来自 FasterTransformer,它仅与 Linux 兼容。
  • model.generate() 返回的 past_key_values 只是虚拟值,因此不能在生成后使用。

示例

更多示例可以在 examples 目录 中找到。

量化 对于较小的 7B 模型,预计需要 10-15 分钟,对于 70B 模型,大约需要 1 小时。
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。

  • 使用 AutoAWQ 版本 0.1.6 测试
  • GPU:RTX 4090(AMD Ryzen 9 7950X)
  • 命令:python examples/benchmark.py --model_path <hf_model> --batch_size 1
  • 🟢 表示 GEMV,🔵 表示 GEMM,🔴 表示避免使用
模型名称 大小 版本 批大小 预填充长度 解码长度 预填充 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
3 次点击  ∙  0 人收藏  
登录后收藏  
目前尚无回复
0 条回复
About   ·   Help   ·    
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
Developed with Cursor