Transformers 文档

AutoRound

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

AutoRound

AutoRound 是一种先进的量化算法,即使在 2 位精度下也能提供强大的准确性。它利用符号梯度下降在仅仅 200 步内微调舍入值和最小-最大裁剪阈值。它设计用于广泛的兼容性,无缝支持各种大型语言模型(LLM),并正在积极扩展以涵盖更多的视觉语言模型(VLM)。它还支持跨多个硬件平台进行量化和推理,包括 CPU、XPU 和 CUDA。

AutoRound 还提供各种实用功能,包括混合位调优和推理、lm-head 量化、支持导出为 GPTQ/AWQ/GGUF 等格式,以及灵活的调优方案。有关全面的概述和最新更新,请查阅 AutoRound 的 README

AutoRound 最初是作为 Intel Neural Compressor 的一部分开发的,作为深度学习的通用模型压缩库。此后,它演变为一个独立的库,专门专注于大型语言模型(LLM)的低精度优化。AutoRound 仍与 Intel Neural Compressor 完全集成,您可以浏览存储库了解更多详情。

安装

pip install auto-round

支持的量化配置

AutoRound 支持多种量化配置:

  • Int8 仅权重
  • Int4 仅权重
  • Int3 仅权重
  • Int2 仅权重
  • 混合位仅权重

硬件兼容性

支持 CPU、XPU 和 CUDA 进行量化和推理。

量化和序列化(离线)

目前,仅支持离线模式生成量化模型。

量化命令
量化 AutoRound API
量化 AutoRound-Best
量化 AutoRound-Light

命令行用法

auto-round \
    --model facebook/opt-125m \
    --bits 4 \
    --group_size 128 \
    --output_dir ./tmp_autoround

AutoRound 还提供了另外两种方案,`auto-round-best` 和 `auto-round-light`,分别旨在提供最佳准确性和提高速度。对于 2 位量化,我们建议使用 `auto-round-best` 或 `auto-round`。

W4G128 13 项任务(mmlu-pro、if_eval、gsm8k 等)的平均准确率和时间消耗结果(测试在 Nvidia A100 80G 上进行,使用 PyTorch 2.6.0 版本,并启用了 `torch_compile`)

模型 Qwen2.5-0.5B-Instruct Falcon3-3B Qwen2.5-7B-Instruct Meta-Llama-3.1-8B-Instruct Falcon3-10B Qwen2.5-72B-Instruct
16比特 0.4192 0.5203 0.6470 0.6212 0.6151 0.7229
最佳 0.4137(7分钟) 0.5142(23分钟) 0.6426(58分钟) 0.6116(65分钟) 0.6092(81分钟) 0.7242(575分钟)
默认 0.4129(2分钟) 0.5133(6分钟) 0.6441(13分钟) 0.6106(13分钟) 0.6080(18分钟) 0.7252(118分钟)
轻量级 0.4052(2分钟) 0.5108(3分钟) 0.6453(5分钟) 0.6104(6分钟) 0.6063(6分钟) 0.7243(37分钟)

推理

AutoRound 会根据已安装的库自动选择最佳可用后端,并在找到更好的后端时提示用户安装额外的库。

CPU 推理
XPU 推理
CUDA 推理
推理后端
格式转换

CPU

支持 2、4 和 8 位。我们建议使用 intel-extension-for-pytorch (IPEX) 进行 4 位推理。

from transformers import AutoModelForCausalLM, AutoTokenizer

model_name = "OPEA/Qwen2.5-1.5B-Instruct-int4-sym-inc"
model = AutoModelForCausalLM.from_pretrained(model_name, device_map="cpu", torch_dtype="auto")
tokenizer = AutoTokenizer.from_pretrained(model_name)
text = "There is a girl who likes adventure,"
inputs = tokenizer(text, return_tensors="pt").to(model.device)
print(tokenizer.decode(model.generate(**inputs, max_new_tokens=50, do_sample=False)[0]))

问题

如果您在使用 transformers 集成时遇到任何问题,请在 transformers 仓库中提出问题。
如果您在使用 auto-round 时遇到任何问题,请在 AutoRound 仓库中提出问题。

致谢

特别感谢 AutoGPTQ、AutoAWQ、GPTQModel、Triton、Marlin 和 ExLLaMAV2 等开源低精度库,它们提供了 AutoRound 中利用的低精度 CUDA 内核。

贡献

欢迎并非常感谢对 AutoRound 的贡献!无论是修复 bug、改进文档、添加新功能还是提出改进建议,您的帮助都非常宝贵。

< > 在 GitHub 上更新