QLoRA:量化 LLM 的高效微调

news2024/11/17 15:52:56

此 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 是一个纯粹用于研究目的的系统,可能会产生有问题的输出。

  1. 在此处访问现场演示。注意这里是33B型号,65B型号的demo稍后会有。

  2. 或者使用此笔记本直接在 Colab 中托管您自己的 Guanaco gradio 演示。适用于 7B 和 13B 型号的免费 G​​PU。

  3. 或者,您能区分 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_sizegradient_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_sizeper_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

已知问题和限制

这里是已知问题和错误的列表。如果您的问题未在此处报告,请打开一个新问题并描述问题。

  1. 4 位推理很慢。目前,我们的 4 位推理实现尚未与 4 位矩阵乘法集成
  2. 使用 HF 当前不支持的训练器恢复 LoRA 训练运行。
  3. 目前,使用bnb_4bit_compute_type='fp16'会导致不稳定。对于 7B LLaMA,只有 80% 的微调运行完成且没有错误。我们有解决方案,但它们尚未集成到 bitsandbytes 中。
  4. 确保tokenizer.bos_token_id = 1避免生成问题。
  5. 如果遇到此问题(“非法内存访问”),则应使用更新的 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个不同的开源微调模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/611752.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

volatile - (C语言)

volatile关键字和const一样都是一种类型修饰符&#xff0c;用它修饰过的变量表示可以被某些编译器未知的因素更改&#xff0c;比如操作系统、硬件或者是其它线程等。 该关键字是不希望被编译器优化&#xff0c;从而达到稳定访问内存的目的。 示例代码&#xff1a; #include&…

FlinkUI和Flink常见问题解决

Flink 系统架构/Flink 作业提交运行的原理 我们编写的代码,对应着在Flink集群上执行的一个作业;所以我们在本地执行代码, 其实是idea开发环境中根据引入的依赖,先模拟启动一个Flink集群,然后把我们代码中定义好的操作,作为"作业",(job要打包好)然后将作业提…

双出口网络链路和设备双冗余案例

1、AR3模拟联通和电信运营商 2、2台防火墙vrrphrp双冗余&#xff0c;下联局域网vrrp 10.3.0.3地址&#xff0c;上联两条外线每条外线都分别vrrp虚拟一个地址1.1.1.1.和2.2.2.2.1。 3、防火墙外线地址和运营商给的外线地址不在同一个网段&#xff0c;每条都用vrrp冗余链路&#…

安装第三方库时的问题—复现带setup.py的项目

目录 题目分析&#xff1a; 正片开始&#xff1a; 题目分析&#xff1a; 事情的经过大致是这样&#xff1a; 今天在github上拿到一个处理时间序列的迁移学习项目的复现代码&#xff0c;项目文件如下所示&#xff1a; 或者我们来关注一下tl4sm这个文件夹里的东西&#xff1…

Tomcat的部署和优化(生命中的全部偶然,其实都是命中注定)

文章目录 一、Tomcat简介二、Tomcat 的构成三、Tomcat 功能组件结构四、Tomcat 请求过程五、Tomcat 服务部署六、Tomcat 虚拟主机配置七、Tomcat优化1.Tomcat 配置文件参数优化2.JVM优化 一、Tomcat简介 Tomcat 是 Java 语言开发的&#xff0c;Tomcat 服务器是一个免费的开放源…

【shiro】问题记录--为什么refreshToken方法走不下去

一、前言 最近做Jwt token续签的时候&#xff0c;在很多博客和下载的代码中&#xff0c;都是在JWTFilter中进行token的刷新&#xff0c;于是就按照了网上的代码进行尝试&#xff0c;代码如下&#xff1a; 1. 代码 在JWTFilter中的isAccessAllowed方法 目的&#xff1a;就是想…

STM32单片机RS485远程PID直流电机调速系统光电传感器

实践制作DIY- GC0137-RS485远程PID直流电机调速系统 基于STM32单片机设计-RS485远程PID直流电机调速系统 二、功能介绍&#xff1a; 主机&#xff1a;STM32F103C系列最小系统LCD1602直流电机光电测速MX15系列驱动模块4*4矩阵键盘RS485收发电路 从机&#xff1a;STM32F103C系…

Kubernetes配置管理

1. ConfigMap简介 Kubernetes ConfigMap是一种用于存储应用程序配置信息的对象。在企业中&#xff0c;我们通常会有许多不同的应用程序&#xff0c;每个应用程序都需要一些配置信息&#xff0c;例如数据库连接字符串、API密钥等等。这些配置信息可能会因为环境的不同而有所不同…

JavaSE进阶(day12,复习自用)

网络编程&#xff08;通信&#xff09; 网络通信三要素三要素概述、要素一&#xff1a;IP地址IP地址操作类-InetAddress要素二&#xff1a;端口号要素三&#xff1a;协议 UDP通信-快速入门UDP通信-广播、组播TCP通信-快速入门编写客户端代码编写服务端代码、原理分析 TCP通信-多…

30天从入门到精通TensorFlow1.x 第四天,TensorFlow中的计算图或数据流图

文章目录 一、接前一天二、计算图或数据流图1. 什么是计算图或者数据流图2. 为什么需要计算图或者数据流图3. 执行顺序和延迟加载在tf中的使用 一、接前一天 这几天主要学习了张量的创建方法&#xff0c;以及变量&#xff0c;变量命名域共享变量等概念。今天主要熟悉 数据流图…

网络隔离的生物制药企业,怎样实现安全的跨网文件交换?

在数字时代&#xff0c;生物制药企业结合现代技术追求和实现生物科技领域上的突破&#xff0c;研发及生产出更多满足人体健康需求的药物及医疗技术。由于生物制药企业&#xff0c;在进行某一领域的科研时通常周期较长、且涉及很多创新性成果&#xff0c;因此&#xff0c;科研数…

css:CSS 线性渐变linear-gradient

CSS 渐变使您可以显示两种或多种指定颜色之间的平滑过渡。 CSS 定义了两种渐变类型&#xff1a; 线性渐变&#xff08;向下/向上/向左/向右/对角线&#xff09;径向渐变&#xff08;由其中心定义&#xff09; 参考文档 CSS 线性渐变 https://www.w3school.com.cn/css/css3_…

访问学者带孩子去美国何时入境最好?

访问学者带孩子去美国入境的最佳时间会受到多种因素的影响&#xff0c;例如孩子的学校安排、访问学者的工作计划以及家庭的个人喜好。然而&#xff0c;以下是知识人网小编整理的一些常见考虑因素&#xff1a; 1. 学校假期&#xff1a;如果孩子正在就读学校&#xff0c;最佳时间…

uniapp 打包app wgt热更新和整包更新以及更新弹窗动画

app热更新是app项目最常见的功能&#xff0c;接下来我总结了当时做这个功能的过程&#xff0c;来交流学习一哈 热更新的流程步骤 在用户进入app就获取当前版本号与调用后端接口返回的版本号对比是否是最新的版本不是最新弹出弹窗让用户确认是否更新&#xff0c;点击更新下载w…

财务创造价值,如何降本增效?

一、整体成本管控理论 有财务人员可能认为这和我们财务有什么关系&#xff0c;这和财务管理也没有关系。我们经常提到的业务财融合以及成本BP&#xff0c;其实在这里面是需要发挥应有的价值的。如何理解这个问题&#xff1f;无论是老板还是财务人员&#xff0c;一是有财务管理…

2023年测试人前景归途?我主攻自动化测试拿到了25k的offer...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…

LeetCode_双指针_中等_86.分隔链表

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。 示例 1&…

JavaEE(系列19) -- 计算机网络初识

目录 1. 网络发展史 2. IP地址和端口号 3. 协议 4. 五元组 6. 协议分层 6.1 OSI 七层模型 6.2 TCP/IP五层&#xff08;或四层&#xff09;模型 7. 协议分层(网络数据传输过程) 7.1 应用层 7.2 传输层(进入了操作系统内核) 7.3 网络层 7.4 数据链路层 7.5 物理层 声明:本文内…

【CSS3+HTML5+JQUERY】------ 实现环形进度条实例代码-(已简单封装)

1. JavaScript代码 circle.js文件: 简单的封装了一下 直接调用方法即可 (function ($$) {var lyCircle {};lyCircle.options{timer:20,circleLeft:.ly-circle-left,elements:"",circleRight:".ly-circle-right",percentSum:0,//百分比bgColor:#00a7ff,bor…

stable diffusion中的u net

Stable Diffusion 包含几个核心的组件&#xff1a; 一个文本编码器&#xff08;在 Stable Diffusion 中使用 CLIP 的 ViT-L/14 的文本编码器&#xff09;&#xff0c;用于将用户输入的 Prompt 文本转化成 text embedding&#xff1b;一个 Image Auto Encoder-Decoder&#xff…