PEFT概述:最先进的参数高效微调技术

news2024/11/18 3:35:00

了解参数高效微调技术,如LoRA,如何利用有限的计算资源对大型语言模型进行高效适应。

PEFT概述:最先进的参数高效微调技术

  • 什么是PEFT
  • 什么是LoRA
  • 用例
  • 使用PEFT训练LLMs
    • 入门
    • PEFT配置
    • 4位量化
    • 封装基础Transformer模型
    • 保存模型
    • 加载模型
    • 推理
  • 结论

什么是PEFT

随着大型语言模型(LLMs)如GPT-3.5、LLaMA2和PaLM2在规模上不断扩大,对它们在下游自然语言处理(NLP)任务上进行微调变得越来越耗费计算和内存资源。

参数高效微调(PEFT)方法通过仅微调少量额外的参数,同时冻结大多数预训练模型,解决了这些问题。这可以防止在大型模型中发生灾难性遗忘,从而使有限的计算资源能够进行微调。

PEFT已经在图像分类和文本生成等任务上证明了其有效性,同时仅使用了模型参数的一小部分。微调后的小权重可以简单地添加到原始的预训练权重中。

你甚至可以在Google Colab的免费版本上使用4位量化和PEFT技术QLoRA微调LLMs。

PEFT的模块化性质还允许通过添加小的任务特定权重,将相同的预训练模型适应于多个任务,避免了存储完整副本的需要。

PEFT库集成了像LoRA、Prefix Tuning、AdaLoRA、Prompt Tuning、MultiTask Prompt Tuning和LoHa等流行的PEFT技术,并与Transformers和Accelerate一起使用。这提供了轻松访问高效且可扩展微调的尖端大型语言模型。

什么是LoRA

在本教程中,我们将使用最流行的参数高效微调(PEFT)技术之一,称为LoRA(大型语言模型的低秩适应)。LoRA是一种显著加速大型语言模型微调过程并消耗更少内存的技术。

LoRA背后的关键思想是使用低秩分解实现两个较小矩阵表示权重更新。通过训练这些矩阵,它们可以适应新的数据,同时最小化总体修改次数。原始权重矩阵保持不变,不进行进一步调整。最终结果通过将原始权重和适应后的权重组合而得到。

使用LoRA有几个优势。首先,它通过减少可训练参数的数量极大地提高了微调的效率。此外,LoRA与各种其他参数高效方法兼容,并且可以与它们结合使用。使用LoRA微调的模型表现出与完全微调的模型相媲美的性能。重要的是,LoRA不引入任何额外的推理延迟,因为适配器权重可以与基本模型无缝合并。

用例

PEFT有许多用例,从语言模型到图像分类器。您可以在官方文档中查看所有用例的教程。

  1. StackLLaMA:使用RLHF训练LLaMA的实践指南
  2. Finetune-opt-bnb-peft
  3. 使用LoRA和Hugging Face进行Efficient flan-t5-xxl训练
  4. 使用LoRA进行DreamBooth微调
  5. 使用LoRA进行图像分类

使用PEFT训练LLMs

在本节中,我们将学习如何使用’bitsandbytes’和‘peft’库加载和包装我们的变压器模型。我们还将涵盖加载保存的微调QLoRA模型并进行推断的过程。

入门

首先,我们将安装所有必要的库。

%pip install accelerate peft transformers datasets bitsandbytes

接下来,将导入必要的模块,并使用基本模型(Llama-2-7b-chat-hf)进行fine-tune,使用mlabonne/guanaco-llama2-1k数据集进行微调。

from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import get_peft_model, LoraConfig
import torch


model_name = "NousResearch/Llama-2-7b-chat-hf"
dataset_name = "mlabonne/guanaco-llama2-1k"

PEFT配置

创建用于包装或训练模型的PEFT配置。

peft_config = LoraConfig(
    lora_alpha=16,
    lora_dropout=0.1,
    r=64,
    bias="none",
    task_type="CAUSAL_LM",
)

4位量化

开发者或Colab GPU在加载LLMs面临重大挑战。然而,通过使用BitsAndBytes实现具有NF4类型配置的4位量化技术,我们可以克服这个问题。通过采用这种方法,我们可以有效地加载我们的模型,从而节省内存并防止机器崩溃。

compute_dtype = getattr(torch, "float16")

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=compute_dtype,
    bnb_4bit_use_double_quant=False,
)

封装基础Transformer模型

为了使模型参数高效,将使用get_peft_model封装基础的Transformer模型。

model = AutoModelForCausalLM.from_pretrained(
    model_name,
    quantization_config=bnb_config,
    device_map="auto"
)
model = get_peft_model(model, peft_config)
model.print_trainable_parameters()

可训练参数比基础模型少,使能够使用更少的内存并更快地微调模型。

trainable params: 33,554,432 || all params: 6,771,970,048 || trainable%: 0.49548996469513035

接下来是训练模型的步骤。可以按照4位量化和QLoRA指南进行操作。

保存模型

训练后,可以将模型适配器保存在本地。

model.save_pretrained("llama-2-7b-chat-guanaco")

或者,将其推送到Hugging Face Hub。

!huggingface-cli login --token $secret_value_0
model.push_to_hub("llama-2-7b-chat-guanaco")

正如所见,模型适配器仅为134MB,而基础的LLaMA 2 7B模型约为13GB。
在这里插入图片描述

加载模型

要运行模型推断,首先必须使用4位精度量化加载模型,然后将训练过的PEFT权重与基础(LlaMA 2)模型合并。

from transformers import AutoModelForCausalLM
from peft import PeftModel, PeftConfig
import torch

peft_model = "kingabzpro/llama-2-7b-chat-guanaco"
base_model = AutoModelForCausalLM.from_pretrained(
    model_name,
    quantization_config=bnb_config,
    device_map="auto"
)

model = PeftModel.from_pretrained(base_model, peft_model)
tokenizer = AutoTokenizer.from_pretrained(model_name)

model = model.to("cuda")
model.eval()

推理

为了运行推理,必须按照guanaco-llama2-1k数据集的风格编写提示(“[INST] {prompt} [/INST]”)。否则,将得到不同语言的响应。

prompt = "What is Hacktoberfest?"
inputs = tokenizer(f"<s>[INST] {prompt} [/INST]", return_tensors="pt")
with torch.no_grad():
    outputs = model.generate(
        input_ids=inputs["input_ids"].to("cuda"), max_new_tokens=100
    )
    print(
        tokenizer.batch_decode(
            outputs.detach().cpu().numpy(), skip_special_tokens=True
        )[0]
    )

output

[INST] What is Hacktoberfest? [/INST] Hacktoberfest is an open-source software development event that takes place in October. It was created by the non-profit organization Open Source Software Institute (OSSI) in 2017. The event aims to encourage people to contribute to open-source projects, with the goal of increasing the number of contributors and improving the quality of open-source software.

During Hacktoberfest, participants are encouraged to contribute to open-source

结论

像LoRA这样的参数高效微调技术使得仅使用部分参数就能高效微调大型语言模型成为可能。这避免了昂贵的完全微调,并使得在有限的计算资源下进行训练成为可能。PEFT的模块化性质允许将模型调整为多个任务。像4位精度这样的量化方法可以进一步减少内存使用。总体而言,PEFT将大型语言模型的能力开放给了更广泛的用户群体。

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

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

相关文章

Module build failed (from ./node_modules/postcss-loader/src/index.js):

出现该错误是你可能没认真看官网的安装配置&#xff0c;可直接看该目录3&#xff0c;一个字一个字看 先安装uview 如果选择v1版本&#xff0c;建议使用npm下载&#xff0c;下面以v1版本为例&#xff0c;使用的是npm下载&#xff0c;导入uview时该文件也在node_modules文件夹里…

常见后缀名总结 为你指点迷津

相信在日常的学习和工作中&#xff0c;大家一定会遇到各种各样的文件类型&#xff0c;他们的后缀名类型各不相同&#xff0c;诸多陌生的文件格式经常让大家不知道他们存在于电脑的意义&#xff0c;想删又没法删&#xff0c;想执行又无法执行。 今天&#xff0c;学长就带领大家一…

Linux学习第40天:Linux SPI 驱动实验(一):乾坤大挪移

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 主从工作方式完成数据交换&#xff0c;形象的说就是武侠中的乾坤大挪移。 本章实验的最终目的就是驱动 I.MX6UALPHA 开发板上的 ICM-20608 这个 SPI 接口的六轴传…

二十五、城市建成区结果制图——复杂图的制作

一、前言 有些时候看到一些参考文献中有些很复杂的图,例如多幅合并在一起,其实这种图本质上就是单一的图合并在一起,然后将其导出即可。 二、具体操作 其实对于制图必备要素的添加就不过多介绍,主要介绍有什么办法保持图形之间一致性,例如,其图例、指北针、比例尺统一…

着实不错的自适应大邻域搜索算法ALNS

文章目录 引言演进路线邻域搜索&#xff0c;NS变邻域搜素&#xff0c;VDNS大邻域搜索&#xff0c;LNS自适应大邻域搜索&#xff0c;ALNS 代码实现34个国内城市的TSP测试集XQF131 相关阅读 引言 之前介绍的差分进化算法和蚁群算法分别适用于求解连续优化问题和组合优化问题&…

Git基本概念和使用方式

Git 是一种版本控制系统&#xff0c;用于管理文件版本的变化。以下是其基本概念和使用方式&#xff1a; 仓库&#xff08;repository&#xff09;&#xff1a;Git 存储代码的地方&#xff0c;可以理解为一个项目的文件夹。提交&#xff08;commit&#xff09;&#xff1a;Git …

【OpenCV实现图像:用OpenCV图像处理技巧之白平衡算法2】

文章目录 概要Gray-world AlgotithmGround Truth Algorithm结论&#xff1a; 概要 随着数字图像处理技术的不断发展&#xff0c;白平衡算法成为了图像处理中一个关键的环节。白平衡的目标是校正图像中的颜色偏差&#xff0c;使得白色在图像中呈现真实的白色&#xff0c;从而提…

Linux之基础开发工具gdb调试器的使用(三)

文章目录 一、Linux调试器-gdb使用1、安装gdb2、背景3、Debug和release4、区分Debug和release 二、Linux调试器-gdb命令演示1、显示指定行之后的代码&#xff08;自动记录最后一条指令&#xff09;2、断点1、打印断点2、查看断点3、删除断点4、使能&#xff08;禁用/开启&#…

统计分钟级别的视频在线用户数+列炸裂+repeat函数

统计分钟级别的视频在线用户数 1、原始数据如下&#xff1a; uid vid starttime endtime select aa as uid,v00l as vid,2023-10-25 12:00 as starttime,2023-10-2512:15 as endtime union select bb as uid,v002 as vid,2023-10-25 12:05 as starttime,2023-10-25 12:19 …

笔记:AI量化策略开发流程-基于BigQuant平台(二)

五、模型训练股票预测 完成了数据处理&#xff0c;接下来就可利用平台集成的各算法进行模型训练和模型预测啦。本文将详细介绍“模型训练”、“模型预测”两大模块操作、原理。 模型训练和模型预测是AI策略区别于传统量化策略的核心&#xff0c;我们通过模型训练模块利用训练…

为什么Android 手机这么慢?如何提高 Android 手机的运行速度

速印机&#xff08;理想、荣大等&#xff09;、复印机&#xff08;夏普、东芝、理光、佳能、震旦等全系列&#xff09;、打印机、扫描仪、传真机、多媒体教学一体机、交互式电子白板、报警器材、监控、竞业达监考设备及其它监考设备、听力考试设备、特种安防设备维护及维修。吴…

Linux必备:这十个流程图让你变的更强!

图是我们与信息联系并处理其重要性的绝佳方法&#xff1b;它们有助于传达关系和抽取信息&#xff0c;并使我们能够可视化概念。 从基本工作流程图到复杂的网络图&#xff0c;组织图&#xff0c;BPMN&#xff08;业务过程模型和符号&#xff09;&#xff0c;UML图等等&#xff0…

面试10000次依然会问的【ThreadLocal】,你还不会?

ThreadLocal简介与基本概念 ThreadLocal&#xff0c;即线程局部变量&#xff0c;是Java语言中用于实现线程数据隔离的一个重要类。这种机制允许在多线程环境中&#xff0c;每个线程都有自己的变量副本&#xff0c;从而使得每个线程都可以独立地改变自己的副本&#xff0c;而不…

JDK1.8 新特性(一)【默认方法、静态方法和Lambda表达式】

前言 今天学习Java8 新特性&#xff0c;主要是之前在学习 Scala、JavaFX 中遇到一些 Lambda 表达式&#xff0c;感觉 lambda 表达式确实很简洁&#xff0c;很有必要学一学。 目录 前言 1、接口的默认方法与静态方法 编写接口 编写接口的实现类 测试 2、Lambda表达式&am…

YOLO目标检测——交通标志分类数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;交通标志识别数据集在自动驾驶、交通安全监控、智能交通系统、驾驶员辅助系统和城市规划等领域都有广泛应用的潜力数据集说明&#xff1a;交通标志分类数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;含多场景白天黑…

Linux之gdb

gdb就是一个Linux的调试工具&#xff0c;类似与vs里面的调试 可执行程序也有格式&#xff0c;不是简单的二进制堆砌

PyCharm因安装了illuminated Cloud插件导致加载项目失败

打开Pycharm时会有弹窗提示&#xff1a; The license for Illuminated Cloud is invalid or has expired. All Illuminated Cloud features will be disabled. 这个弹窗会导致你加载项目一直失败&#xff0c;close project 也关不掉&#xff0c;我都是用任务管理器杀死进程的…

DevChat全能型AI编程助手,助你“以一敌三卷翻好友”

DevChat全能型AI编程助手&#xff0c;助你“以一敌三卷翻好友” 什么是DevChat&#xff0c;它能帮助我们做什么&#xff1f; DevChat是OpenAI的一个产品&#xff0c;它是一个可以进行编程相关对话的AI。这意味着你可以使用它来解决一些编程上的问题或者获取关于编程的建议。 …

Doris:读取Doris数据的N种方法

目录 1.MySQL Client 2.JDBC 3. 查询计划 4.Spark Doris Connector 5.Flink Doris Connector 1.MySQL Client Doris 采用 MySQL 协议&#xff0c;高度兼容 MySQL 语法&#xff0c;支持标准 SQL&#xff0c;用户可以通过各类客户端工具来访问 Doris。登录到doris服务器后&a…

基于SSM框架的高校试题管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…