此 repo 支持论文“QLoRA:量化 LLM 的高效微调”,旨在使对 LLM 研究的访问民主化。
QLoRA 使用bitsandbytes进行量化,并与 Hugging Face 的PEFT和transformers库集成。QLoRA 由华盛顿大学 UW NLP 小组的成员开发。
概述
我们介绍了 QLoRA,这是一种有效的微调方法,可以减少内存使用量,足以在单个 48GB GPU 上微调 65B 参数模型,同时保留完整的 16 位微调任务性能。QLoRA 通过冻结的 4 位量化预训练语言模型将梯度反向传播到低阶适配器 (LoRA)。我们最好的模型系列,我们命名为 Guanaco,在 Vicuna 基准测试中优于所有以前公开发布的模型,达到 ChatGPT 性能水平的 99.3%,同时只需要在单个 GPU 上进行 24 小时的微调。QLoRA 引入了许多创新来节省内存而不牺牲性能:(a) 4 位 NormalFloat (NF4),一种新的数据类型,理论上是正态分布权重的最佳信息(b)双量化通过量化量化常量来减少平均内存占用,以及(c)分页优化器来管理内存峰值。我们使用 QLoRA 对 1,000 多个模型进行微调,提供跨 8 个指令数据集、多种模型类型(LLaMA、T5)和无法通过常规微调运行的模型规模(例如 33B 和65B参数模型)。我们的结果表明,即使使用比以前的 SoTA 更小的模型,QLoRA 在小型高质量数据集上进行微调也会产生最先进的结果。我们提供了基于人类和 GPT-4 评估的聊天机器人性能的详细分析,表明 GPT-4 评估是人类评估的廉价且合理的替代方案。此外,我们发现当前的聊天机器人基准测试无法准确评估聊天机器人的性能水平。我们发布了所有模型和代码,包括用于 4 位训练的 CUDA 内核。
许可和预期用途
我们根据 MIT 许可在此存储库中发布与 QLoRA 微调相关的资源。此外,我们还发布了用于 7B、13B、33B 和 65B 基本 LLaMA 模型尺寸的 Guanaco 模型系列。这些模型旨在用于符合 LLaMA 许可证的目的,并且需要访问 LLaMA 模型。
演示
Guanaco 是一个纯粹用于研究目的的系统,可能会产生有问题的输出。
-
在此处访问现场演示。注意这里是33B型号,65B型号的demo稍后会有。
-
或者使用此笔记本直接在 Colab 中托管您自己的 Guanaco gradio 演示。适用于 7B 和 13B 型号的免费 GPU。
-
或者,您能区分 ChatGPT 和 Guanaco 吗?试一试!您可以在此处访问模型响应 Colab,在 Vicuna 提示上比较 ChatGPT 和 Guanaco 65B。
安装
要使用 transformers 和 bitsandbytes 加载 4 位模型,您必须从源代码安装加速器和 transformers,并确保您拥有最新版本的 bitsandbytes 库 (0.39.0)。安装 PyTorch 后(按照此处的说明操作),您可以使用以下命令实现上述目标:
pip install -U -r requirements.txt
入门
该qlora.py
代码是对各种数据集进行微调和推理的起点。在羊驼数据集上微调基线模型的基本命令:
python qlora.py --model_name_or_path <path_or_name>
对于大于 13B 的模型,我们建议调整学习率:
python qlora.py –learning_rate 0.0001 --model_name_or_path <path_or_name>
要复制我们的 Guanaco 模型,请参见下文。
教程和演示
这是一篇讨论 4 位量化、QLoRA 以及它们如何集成到转换器中的博客。
您可以按照此笔记本直接在 Colab 中托管自己的 gradio Guanaco 演示。此外,以下是 Colab 笔记本,其中包含使用 QLoRA 进行推理和微调的示例:
- 推理笔记本
- 微调笔记本
其他示例位于该examples/
文件夹下。
量化
BitsandbytesConfig
量化参数由(参见 HF 文档)控制,如下所示:
- 通过激活加载 4 位
load_in_4bit
- 用于线性层计算的数据类型
bnb_4bit_compute_dtype
- 嵌套量化是通过激活
bnb_4bit_use_double_quant
- 用于量化的数据类型用 指定
bnb_4bit_quant_type
。请注意,有两种支持的量化数据类型fp4
(四位浮点数)和nf4
(普通四位浮点数)。后者在理论上对于正态分布的权重是最优的,我们建议使用nf4
.
model = AutoModelForCausalLM.from_pretrained( model_name_or_path='/name/or/path/to/your/model', load_in_4bit=True, device_map='auto', max_memory=max_memory, torch_dtype=torch.bfloat16, quantization_config=BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16, bnb_4bit_use_double_quant=True, bnb_4bit_quant_type='nf4' ), )
分页优化器
您可以使用参数访问分页优化器--optim paged_adamw_32bit
原驼微调
您可以选择--dataset
oasst1
加载用于训练 Guanaco 的 OpenAssistant 数据集。您还可以在 HF 上的timdettmers/openassistant-guanaco找到它。
我们包括用于重现 Guanaco 模型训练的超参数的脚本,用于各种大小./scripts/finetune_guanaco*.sh
。确保进行调整per_device_train_batch_size
,gradient_accumulation_steps
使他们的乘积为 16,并且训练适合您的 GPU。
使用本地数据集
您可以使用参数指定数据集的路径--dataset
。如果--dataset_format
未设置参数,它将默认为羊驼格式。这里有一些例子:
- 使用羊驼格式数据集进行训练:
python qlora.py --dataset="path/to/your/dataset"
- 使用自指导格式数据集进行训练:
python qlora.py --dataset="path/to/your/dataset" --dataset_format="self-instruct"
多GPU
多 GPU 训练和推理通过 Hugging Face 的 Accelerate 开箱即用。请注意,per_device_train_batch_size
和per_device_eval_batch_size
参数是全局批量大小,不像它们的名字所暗示的那样。
在多个 GPU 上加载用于训练或推理的模型时,您应该将类似以下的内容传递给AutoModelForCausalLM.from_pretrained()
:
device_map = "auto" max_memory = {i: '46000MB' for i in range(torch.cuda.device_count())}
示例输出
我们为文件夹中的 OA 和 Vicuna 查询提供论文中描述的模型的生成eval/generations
。这些旨在促进对模型评估和分析的进一步研究。
你能区分 ChatGPT 和 Guanaco 吗?试一试!您可以在此处访问模型响应 Colab,在 Vicuna 提示上比较 ChatGPT 和 Guanaco 65B。
评估
我们包括改编自 FastChat 存储库的脚本,以使用 GPT-4 自动评估模型生成。我们包括用于与 ChatGPT 进行比较的脚本,得分为 10 分,以及带有三类标签(赢、松或平)的“成对比较”。这些可以在文件夹中找到eval
。
为了促进我们在该领域的评估和未来工作的复制,我们发布了 GPT-4 和我们系统的人工评级。这些位于eval/ratings-human
和下eval/ratings-gpt4
。
可以在 找到更多详细信息eval/EVAL_README.md
。
已知问题和限制
这里是已知问题和错误的列表。如果您的问题未在此处报告,请打开一个新问题并描述问题。
- 4 位推理很慢。目前,我们的 4 位推理实现尚未与 4 位矩阵乘法集成
- 使用 HF 当前不支持的训练器恢复 LoRA 训练运行。
- 目前,使用
bnb_4bit_compute_type='fp16'
会导致不稳定。对于 7B LLaMA,只有 80% 的微调运行完成且没有错误。我们有解决方案,但它们尚未集成到 bitsandbytes 中。 - 确保
tokenizer.bos_token_id = 1
避免生成问题。 - 如果遇到此问题(“非法内存访问”),则应使用更新的 HF LLaMA 转换或降级 PyTorch 版本。
引用
@article{dettmers2023qlora, title={QLoRA: Efficient Finetuning of Quantized LLMs}, author={Dettmers, Tim and Pagnoni, Artidoro and Holtzman, Ari and Zettlemoyer, Luke}, journal={arXiv preprint arXiv:2305.14314}, year={2023} }
5月24日华盛顿大学的研究者发布了QLoRA技术及用其生成的Guanaco大模型。在Vicuna基准测试中表现优于所有先前公开发布的模型,达到ChatGPT性能水平的99.3%,仅需要单个GPU上的24小时微调时间。业界一片叫好。
参考及资源链接:
代码:https://github.com/artidoro/qlora
量化代码:GitHub - TimDettmers/bitsandbytes: 8-bit CUDA functions for PyTorch
PEFT: https://github.com/huggingface/peft
Transformer:https://github.com/huggingface/transformers/
模型:timdettmers (Tim Dettmers)
BLOG : Making LLMs even more accessible with bitsandbytes, 4-bit quantization and QLoRA
论文:[2305.14314] QLoRA: Efficient Finetuning of Quantized LLMs (arxiv.org)
Demo环境:Guanaco Playground Tgi - a Hugging Face Space by uwnlp
Basic usage Google Colab notebook - This notebook shows how to use 4bit models in inference with all their variants, and how to run GPT-neo-X (a 20B parameter model) on a free Google Colab instance
Fine tuning Google Colab notebook - This notebook shows how to fine-tune a 4bit model on a downstream task using the Hugging Face ecosystem. We show that it is possible to fine tune GPT-neo-X 20B on a Google Colab instance!
Original repository for replicating the paper's results
Guanaco 33b playground
以下内容主要来自论文QLoRA: Efficient Finetuning of Quantized LLMs和其他资料。
摘要:
我们提出了一种高效的微调方法QLORA,可以在单个48GB GPU上减少内存使用量,同时保持完整的16位微调任务性能,从而对一个拥有65B参数的模型进行微调。QLORA通过将梯度反向传播到冻结的4位量化预训练语言模型中,进而传递到低秩适配器(LoRA)。我们的最佳模型系列被命名为Guanaco,在Vicuna基准测试中表现优于所有先前公开发布的模型,达到ChatGPT性能水平的99.3%,仅需要单个GPU上的24小时微调时间。QLORA引入了一些创新来节省内存而不牺牲性能:(a)4位NormalFloat(NF4),这是一种对于正态分布权重来说在信息论上是最优的数据类型;(b)双量化,通过量化量化常数来减少平均内存占用;以及(c)分页优化器,用于管理内存峰值。我们使用QLORA对1,000多个模型进行微调,并对8个指令数据集、多个模型类型(LLaMA、T5)和模型规模进行了详细的指令追踪和聊天机器人性能分析,这在常规微调中是不可行的(例如33B和65B参数模型)。我们的结果表明,QLoRA在一个小型高质量数据集上进行微调可以获得最先进的结果,即使使用的模型比先前的最优模型要小。我们基于人工和GPT-4评估对聊天机器人性能进行了详细分析,结果显示GPT-4评估是评估聊天机器人的廉价且合理的替代方法。此外,我们发现当前的聊天机器人基准测试不能准确评估聊天机器人的性能水平。通过一项详细的分析,我们展示了Guanaco与ChatGPT相比存在的失败之处。我们公开发布了我们的所有模型和代码,包括4位训练的CUDA核心。
1 引言
微调大型语言模型(LLMs)是提高它们性能的一种高效方法[40, 62, 43, 61, 59, 37],也可以添加期望的行为或去除不可取的行为[43, 2, 4]。然而,对于非常大的模型,常规的16位微调是成本过高的;对LLaMA 65B参数模型[57]的常规16位微调需要超过780GB的GPU内存。尽管最近的量化方法可以减少LLMs的内存占用[14, 13, 18, 66],但这些技术只适用于推理阶段,在训练阶段会失效[65]。
我们首次证明了可以在不降低性能的情况下微调量化的4位模型。我们的方法QLORA使用一种新的高精度技术将预训练模型量化为4位,然后通过反向传播梯度来调整量化权重集合中的一小组可学习低秩适配器权重[28]。
QLORA将微调65B参数模型的平均内存需求从>780GB的GPU内存降低到<48GB,与完全微调的16位基准相比,既不降低运行时间也不降低预测性能。这标志着LLM微调的可及性出现了重大变化:现在可以在单个GPU上微调迄今为止最大的公开可用模型。使用QLORA,我们训练了Guanaco模型系列,其中第二好的模型在Vicuna[10]基准测试上达到了ChatGPT性能水平的97.8%,而在单个消费级GPU上的微调时间不到12小时;在单个专业级GPU上的24小时内,我们的最大模型达到了99.3%,基本上缩小了与Vicuna基准测试上的ChatGPT之间的差距。在部署时,我们最小的Guanaco模型(7B参数)仅需要5GB内存,在Vicuna基准测试上比26GB的Alpaca模型高出20个百分点以上(表6)。
QLORA引入了多个创新,旨在减少内存使用而不牺牲性能:(1)4位NormalFloat,一种信息论上对于正态分布数据来说最优的量化数据类型,其实际结果比4位整数和4位浮点数更好。 (2)双量化(Double Quantization),一种量化量化常数的方法,平均每个参数节省约0.37位(65B模型约为3GB)。 (3)分页优化器(Paged Optimizers),使用NVIDIA统一内存来避免在处理具有长序列长度的小批量时出现的梯度检查点内存峰值。我们将这些贡献结合到更好调整的LoRA方法中,其中包括在每个网络层中使用适配器,从而避免了先前工作中出现的几乎所有精度权衡取舍(accuracy tradeoffs)的问题。
QLORA的高效性使我们能够对指令微调和聊天机器人性能进行深入研究,这在常规微调中由于内存开销是不可能的。因此,我们在几个指令微调数据集、模型架构和参数大小在80M到65B之间训练了1,000多个模型。除了展示QLORA恢复了16位性能(§4)和训练了最先进的聊天机器人Guanaco(§5),我们还分析了训练模型的趋势。首先,我们发现数据质量远比数据集大小更重要,例如,一个9k样本的数据集(OASST1)在聊天机器人性能上优于一个450k样本的数据集(FLAN v2,子采样),即使两者都旨在支持指令跟踪泛化。其次,我们显示了强大的Massive Multitask Language Understanding(MMLU)基准性能并不意味着强大的Vicuna聊天机器人基准性能,反之亦然,换句话说,对于给定任务,数据集的适用性比大小更重要。
此外,我们还对聊天机器人性能进行了详细分析,同时使用人工评估者和GPT-4进行评估。我们采用了锦标赛风格的基准测试,其中模型在比赛中互相竞争,为给定提示产生最佳回答。一场比赛的获胜者由GPT-4或人工注释员评判。锦标赛结果被汇总为Elo分数[16, 17],确定聊天机器人性能的排名。我们发现,在锦标赛中,GPT-4和人工评估在模型性能的排名上基本一致,但我们也发现存在强烈分歧的情况。因此,我们强调基于模型的评估虽然提供了与人工注释相比的廉价替代方案,但也存在不确定性。
我们通过定性分析Guanaco模型来增强我们的聊天机器人基准测试结果。我们的分析突出了定量基准测试未能捕捉到的成功和失败案例。我们公开发布所有带有人工和GPT-4注释的模型,以促进进一步的研究。我们开源我们的代码库和CUDA核心,并将我们的方法整合到Hugging Face的transformers堆栈[64]中,使其易于访问。我们发布了7/13/33/65B大小模型的适配器集合,这些模型在8个不同的指令跟踪数据集上进行了训练,总共有32个不同的开源微调模型。