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

了解参数高效微调技术,如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将大型语言模型的能力开放给了更广泛的用户群体。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java学习 9.Java-数组 讲解及习题

一、数组的定义与使用 1.数组的基本概念 1.1 为什么要使用数组 数组是最简单的一种数据结构 组织一组相同类型数据的集合 数据结构本身是来描述和组织数据的 数据加结构 1.2.1 数组的创建 代码实现 new int 可省略&#xff1b; char[] chars{a,b,c};//定义一个整形类型数…

在线免费语音克隆工具,1分钟,复制你的声音

hi&#xff0c;同学们&#xff0c;我是赤辰。玩自媒体这么多年&#xff0c;总结出凡是用自己的声音做短视频&#xff0c;既有识别度&#xff0c;也更容易上热门&#xff0c;但是录制音频的艰难&#xff0c;试过的都知道&#xff0c;市面上也有很多克隆工具&#xff0c;但是基本…

【Git】Git分支与标签掌握这些技巧让你成为合格的码农

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Git》。&#x1f3af;&#x1f3af; &#x1f449…

Qt——连接mysql增删查改(仓库管理极简版)

目录 UI布局设计 .pro文件 mainwindow.h main.cpp UI布局设计 .pro文件 QT core gui QT core gui sql QT sqlgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any …

【算法-链表4】环形链表2的两种解法

今天&#xff0c;带来链表相关算法的讲解。文中不足错漏之处望请斧正&#xff01; 理论基础点这里 环形链表 1. 思路 利用链表相交 我们在环内任意一处断开&#xff0c;然后判断断开处的下一个位置和head是否相交&#xff0c;如果相交&#xff0c;相交处就是环口。 公式法 …

ArcGIS10.8 连接 PostgreSQL 及遇到的两个问题

前提 以前同事用过我的电脑连PostgreSQL&#xff0c;失败了。当时不知道原因&#xff0c;只能使用GeoServer来发布数据了。现在终于搞明白了&#xff0c;原因是ArcGIS10.2版本太老&#xff0c;无法连接PostgreSQL9.4。参考这里 为了适应时代的发展&#xff0c;那我就用新的Ar…

Spark的转换算子和操作算子

1 Transformation转换算子 1.1 Value类型 1&#xff09;创建包名&#xff1a;com.shangjack.value 1.1.1 map()映射 参数f是一个函数可以写作匿名子类&#xff0c;它可以接收一个参数。当某个RDD执行map方法时&#xff0c;会遍历该RDD中的每一个数据项&#xff0c;并依次应用f函…

python Flask框架,调用MobileNetV2图像分类模型,实现前端上传图像分类

python Flask框架&#xff0c;调用MobileNetV2图像分类模型&#xff0c;实现前端上传图像分类 今天博主介绍一个图像分类的小项目 基于flask 和mobileNetV2模型的前端图像分类项目 环境配置如下&#xff1a; python版本3.7.6 安装库的版本如下&#xff1a; tensorflow 2.11.…

LabVIEW中NIGPIB设备与驱动程序不相关的MAX报错

LabVIEW中NIGPIB设备与驱动程序不相关的MAX报错 当插入GPIB-USB设备时&#xff0c;看到了NI MAX中列出该设备&#xff0c;但却显示了黄色警告指示&#xff0c;并且指出Windows没有与您的设备相关的驱动程序。 解决方案 需要安装能兼容的NI-488.2驱动程序。 通过交叉参考以下有…

STM32--时钟树

一、什么是时钟&#xff1f; 时钟是单片机的脉搏&#xff0c;是系统工作的同步节拍。单片机上至CPU&#xff0c;下至总线外设&#xff0c;它们工作时序的配合&#xff0c;都需要一个同步的时钟信号来统一指挥。时钟信号是周期性的脉冲信号。 二、什么是时钟树&#xff1f; S…

“Git实践指南:深入探索开发测试上线、分支管理与标签“

文章目录 引言一、Git的分支的使用1.分支2.标签3.分支与标签的关系4. 分支在实际中的作用5. 四个环境以及各自的功能特点6. 分支策略分支应用场景 二、Git的标签3.1 标签的基本使用3.3 标签的共享与推送 总结 引言 在现代软件开发中&#xff0c;版本控制是一个关键的环节&…

2023年【危险化学品经营单位主要负责人】免费试题及危险化学品经营单位主要负责人证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年危险化学品经营单位主要负责人免费试题为正在备考危险化学品经营单位主要负责人操作证的学员准备的理论考试专题&#xff0c;每个月更新的危险化学品经营单位主要负责人证考试祝您顺利通过危险化学品经营单位主…

【扩散模型】万字长文全面理解与应用Stable Diffusion

万字长文全面理解与应用Stable Diffusion 1. Stable Diffusion简介1.1 基本概念1.2 主体结构1.3 训练细节1.4 模型评测1.5 模型应用1.6 模型版本1.7 其他类型的条件生成模型1.8 使用DreamBooth进行微调 2. 实战Stable Diffusion2.1 环境准备2.2 从文本生成图像2.3 Stable Diffu…

LIBGDX实时绘制字符、实时绘制中文

LIBGDX实时绘制字符、实时绘制中文 转自&#xff1a;https://lingkang.top/archives/libgdx-shi-shi-hui-zhi-zi-fu 注意&#xff0c;相比于贴图字体&#xff0c;实时绘制会有一定的失真、模糊 Maven项目依赖&#xff1a; <properties><maven.compiler.source>…

抢量双11!抖音商城「官方立减」 缘何成为“爆单神器”?

10月20日抖音商城双11好物节正式开跑&#xff0c;仅仅三天&#xff0c;抖音商城整体GMV对比去年同期提升了200%&#xff0c;而在开跑一周后&#xff0c;一些品牌的销售额已经超过了今年整个618&#xff0c;可谓增势迅猛。其中&#xff0c;平台官方特别推出的「官方立减」玩法&a…

基于51单片机的篮球比赛计分器积分器

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;单片机篮球 获取完整源程序仿真源文件原理图文件论文报告等 基于51单片机的篮球计分器 由STC89C51单片机数码管显示模块按键模块电源模块构成 具体功能&#xff1a; &#xff08;1&#xff09;能记录单节比赛的比赛时间&am…

ETW HOOK原理探析

ETW HOOK研究 文章目录 ETW HOOK研究前言原理探究内核开启ETW日志HOOK ETW修改ETW日志上下文代理GetCpuClock函数寻找SSDT和SSDT Shadow 总结参考 前言 关于ETW是什么我就不多说了&#xff0c;可以通过微软的相关文档了解到。据网上得知这项技术最早被披露于2345的驱动中&…

【字符串】【双指针翻转字符串+快慢指针】Leetcode 151 反转字符串中单词【好】

【字符串】【双指针翻转字符串快慢指针】Leetcode 151 反转字符串中单词 解法1 双指针翻转字符串快慢指针更新数组大小 ---------------&#x1f388;&#x1f388;题目链接&#x1f388;&#x1f388;------------------- ---------------&#x1f388;&#x1f388;解答链接…

UI自动化测试 | Jenkins配置优化

前一段时间帮助团队搭建了UI自动化环境&#xff0c;这里将Jenkins环境的一些配置分享给大家。 背景&#xff1a; 团队下半年的目标之一是实现自动化测试&#xff0c;这里要吐槽一下&#xff0c;之前开发的测试平台了&#xff0c;最初的目的是用来做接口自动化测试和性能测试&…

MySQL 数据库查询与数据操作:使用 ORDER BY 排序和 DELETE 删除记录

使用 ORDER BY 进行排序 使用 ORDER BY 语句按升序或降序对结果进行排序。 ORDER BY 关键字默认按升序排序。要按降序排序结果&#xff0c;使用 DESC 关键字。 示例按名称按字母顺序排序结果&#xff1a; import mysql.connectormydb mysql.connector.connect(host"l…