AutoRound 是一种用于低位 LLM 推理的高级量化算法。它专为多种型号量身定制。 AutoRound 采用符号梯度下降法,只需 200 步即可微调权重的舍入值和最小最大值,与最新方法相比,无需引入任何额外的推理开销,并保持较低的调整成本。下图展示了 AutoRound 的概述。请查看我们在 arxiv 上的论文了解更多详细信息,并访问 low_bit_open_llm_leaderboard 了解各种模型的更准确数据和配方。
[2024/10] AutoRound 已经集成到 torch/ao 中,查看他们的发行说明
[2024/10] 重要更新:我们现在支持全范围对称量化,并将其设为默认配置。这种配置通常比非对称量化更好或相当,并且显着优于其他对称变体,特别是在 2 位等低位宽下。
[2024/09] AutoRound 格式支持多种 LVM 模型,查看示例 Qwen2-Vl、Phi-3-vision、Llava
[2024/08] AutoRound 格式支持 Intel Gaudi2 设备。请参考Intel/Qwen2-7B-int4-inc。
[2024/08] AutoRound 引入了几个实验性功能,包括范数/偏差参数的快速调整(针对 2 位和 W4A4)、激活量化和 mx_fp 数据类型。
pip install -vvv --no-build-isolation -e 。
pip 安装自动轮次
通过在终端上调用auto-round -h
可以提供详细说明受支持参数的完整列表的用户指南。或者,您可以使用auto_round
而不是auto-round
。在format
中设置您想要的格式,并支持多种格式导出。
CUDA_VISIBLE_DEVICES=0 自动循环 --型号 facebook/opt-125m --位 4 --group_size 128 --格式“auto_round,auto_gptq” --disable_eval --output_dir ./tmp_autoround
我们提供了两种方法,可在低内存的情况下实现最佳准确性和快速运行速度。详情如下。
## 最佳精度,慢 3 倍,low_gpu_mem_usage 可以节省约 20G,但慢约 30%CUDA_VISIBLE_DEVICES=0 自动回合 --型号 facebook/opt-125m --位 4 --group_size 128 --n样本512 --1000 迭代 --low_gpu_mem_usage --disable_eval
## 快速且占用内存少,加速 2-3 倍,W4G128CUDA_VISIBLE_DEVICES=0 自动回合时精度略有下降 --型号 facebook/opt-125m --位 4 --group_size 128 --n样本128 --迭代200 --seqlen 512 --批次大小 4 --disable_eval
AutoRound 格式:此格式非常适合 CPU、HPU 设备、2 位以及混合精度推理。支持 [2,4] 位。它还受益于 Marlin 内核,可以显着提高推理性能。然而,它尚未获得社区的广泛采用。
AutoGPTQ 格式:该格式非常适合 CUDA 设备上的对称量化,并被社区广泛采用,支持 [2,3,4,8] 位。它还受益于 Marlin 内核,可以显着提高推理性能。然而,非对称内核存在可能导致精度大幅下降的问题,特别是在 2 位量化和小型模型中。此外,对称量化在 2 位精度下往往表现不佳。
AutoAWQ 格式:该格式非常适合 CUDA 设备上的非对称 4 位量化,并在社区中广泛采用,仅支持 4 位量化。它具有专为 Llama 模型量身定制的专门层融合功能。
从变压器导入 AutoModelForCausalLM, AutoTokenizermodel_name = "facebook/opt-125m"model = AutoModelForCausalLM.from_pretrained(model_name)tokenizer = AutoTokenizer.from_pretrained(model_name)from auto_round 导入 AutoRoundbits, group_size, sym = 4, 128, Trueautoround = AutoRound(model, tokenizer , 位=位, group_size=group_size, sym=sym)## 最佳精度,慢 3 倍,low_gpu_mem_usage 可以节省约 20G,但慢约 30%# autoround = AutoRound(model, tokenizer, nsamples=512, iters=1000, low_gpu_mem_usage=True, bits=位, group_size=group_size, sym=sym)## 快速且占用内存少, 2-3X加速,W4G128 的精度略有下降# autoround = AutoRound(model, tokenizer, nsamples=128, iters=200, seqlen=512, batch_size=4, bits=bits, group_size=group_size, sym=sym )autoround.quantize()output_dir = "./tmp_autoround"## format= 'auto_round'(版本>0.3.0时默认), 'auto_gptq', 'auto_awq'autoround.save_quantized(output_dir, format='auto_round', inplace=True)
使用夜间版本的 PyTorch 2.6.0.dev20241029+cu124 在 Nvidia A100 80G 上进行测试。请注意,评估中不包括数据加载和打包成本。我们为 Torch 2.6 启用 torch.compile,但由于遇到问题而不为 2.5 启用。
要优化 GPU 内存使用,除了激活low_gpu_mem_usage
之外,您还可以设置gradient_accumulate_steps=8
和batch_size=1
,但这可能会增加调整时间。
3B和14B模型在Qwen 2.5上进行评估,8X7B模型是Mixtral,而其余模型则使用LLaMA 3.1。
火炬版本/配置 W4G128 | 3B | 8B | 14B | 70B | 8X7B |
---|---|---|---|---|---|
2.6 用torch编译 | 7分钟 10GB | 12分钟 18GB | 23分钟 22GB | 120分钟 42GB | 28分钟 46GB |
2.6 用torch编译 low_gpu_mem_usage=真 | 12分钟 6GB | 19分钟 10GB | 33分钟 11GB | 140分钟 25GB | 38分钟 36GB |
2.6 用torch编译 low_gpu_mem_usage=真 梯度累积步数=8,bs=1 | 15分钟 3GB | 25分钟 6GB | 45分钟 7GB | 187分钟 19GB | 75分钟 36GB |
2.5 不带 torch 编译 | 8分钟 10GB | 16分钟 20GB | 30分钟 25GB | 140分钟 49GB | 50分钟 49GB |
请先运行量化代码
CPU : auto_round版本> 0.3.1 ,pip install intel-extension-for-pytorch(在Intel CPU上速度更高)或pip install intel-extension-for-transformers,
HPU :推荐使用 Gaudi 软件堆栈的 docker 镜像。更多详细信息可以在高迪指南中找到。
CUDA :对称量化不需要额外的操作,对于非对称量化,需要从源安装自动舍入
from Transformers import AutoModelForCausalLM, AutoTokenizerfrom auto_round import AutoRoundConfigbackend = "auto" ##cpu, hpu, cuda, cuda:marlin(在 auto_round>0.3.1 和 'pip install -v gptqmodel --no-build-isolation' 中受支持)quantization_config = AutoRoundConfig(后端=后端)quantized_model_path =“./tmp_autoround”模型= AutoModelForCausalLM.from_pretrained(quantized_model_path, device_map=backend.split(':')[0], quantization_config=quantization_config)tokenizer = AutoTokenizer.from_pretrained(quantized_model_path)text = "有一个喜欢冒险的女孩,"inputs = tokenizer(text, return_tensors="pt").to(model.device)print(tokenizer.decode(model.generate(**inputs, max_new_tokens=50)[0]))
自动舍入--模型保存的量化模型 --评估 --任务 lambda_openai --eval_bs 1
from Transformers import AutoModelForCausalLM, AutoTokenizerquantized_model_path = "./tmp_autoround"model = AutoModelForCausalLM.from_pretrained(quantized_model_path, device_map="auto")tokenizer = AutoTokenizer.from_pretrained(quantized_model_path)text = "有一个喜欢冒险的女孩,"inputs = tokenizer(文本, return_tensors="pt").to(model.device)print(tokenizer.decode(model.generate(**inputs, max_new_tokens=50)[0]))
AutoRound基本上支持所有主要的大语言模型。
请注意,星号 (*) 表示第三方量化模型,该模型可能缺乏准确性数据并使用不同的配方。我们非常感谢他们的努力,并鼓励更多用户分享他们的模型,因为我们自己无法发布大部分模型。
模型 | 支持 |
---|---|
元骆驼/元骆驼-3.1-70B-指示 | 食谱 |
元骆驼/元骆驼-3.1-8B-指示 | 模型-kaitchup-autogptq-int4*,模型-kaitchup-autogptq-sym-int4*,配方 |
元骆驼/元骆驼-3.1-8B | 模型-kaitchup-autogptq-sym-int4* |
Qwen/Qwen-VL | 准确度、配方 |
Qwen/Qwen2-7B | 模型-autoround-sym-int4、模型-autogptq-sym-int4 |
Qwen/Qwen2-57B-A14B-指令 | 模型-autoround-sym-int4,模型-autogptq-sym-int4 |
01-ai/易-1.5-9B | 模型-LnL-AI-autogptq-int4* |
01-ai/Yi-1.5-9B-聊天 | 模型-LnL-AI-autogptq-int4* |
英特尔/神经聊天-7b-v3-3 | 模型-autogptq-int4 |
英特尔/神经聊天-7b-v3-1 | 模型-autogptq-int4 |
TinyLlama-1.1B-中级 | 模型-LnL-AI-autogptq-int4* |
米斯特拉莱/Mistral-7B-v0.1 | 模型-autogptq-lmhead-int4,模型-autogptq-int4 |
谷歌/gemma-2b | 模型-autogptq-int4 |
蒂尤埃/falcon-7b | 模型-autogptq-int4-G64 |
sapienzanlp/modello-italia-9b | 模型-fbaldassarri-autogptq-int4* |
微软/phi-2 | 模型 autoround-sym-int4 模型 autogptq-sym-int4 |
微软/Phi-3.5-迷你指令 | 模型-kaitchup-autogptq-sym-int4* |
微软/Phi-3-vision-128k-instruct | 食谱 |
米斯特拉莱/Mistral-7B-指令-v0.2 | 准确性、配方、示例 |
Mistralai/Mixtral-8x7B-Instruct-v0.1 | 准确性、配方、示例 |
米斯特拉莱/Mixtral-8x7B-v0.1 | 准确性、配方、示例 |
元骆驼/元骆驼-3-8B-指示 | 准确性、配方、示例 |
谷歌/gemma-7b | 准确性、配方、示例 |
元骆驼/Llama-2-7b-chat-hf | 准确性、配方、示例 |
Qwen/Qwen1.5-7B-聊天 | 准确性、sym 配方、asym 配方、示例 |
百川公司/百川2-7B-Chat | 准确性、配方、示例 |
01-ai/Yi-6B-聊天 | 准确性、配方、示例 |
脸书/opt-2.7b | 准确性、配方、示例 |
大科学/bloom-3b | 准确性、配方、示例 |
EleutherAI/gpt-j-6b | 准确性、配方、示例 |
AutoRound 已集成到多个存储库中。
英特尔神经压缩器
ModelCloud/GPTQ模型
pytorch/ao
如果您发现 AutoRound 对您的研究有用,请引用我们的论文:
@文章{heng2023优化, title={通过有符号梯度下降优化权重舍入以实现 LLM 的量化}, 作者={程、文华和张、伟伟和沈、海浩和蔡、一阳和何、辛和吕、考考和刘、易}, 期刊={arXiv预印本arXiv:2309.05516}, 年={2023} }