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

2023-11-11 07:52

本文主要是介绍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 torchmodel_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 torchpeft_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将大型语言模型的能力开放给了更广泛的用户群体。

这篇关于PEFT概述:最先进的参数高效微调技术的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/388611

相关文章

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

Java通过反射获取方法参数名的方式小结

《Java通过反射获取方法参数名的方式小结》这篇文章主要为大家详细介绍了Java如何通过反射获取方法参数名的方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、解决方式方式2.1: 添加编译参数配置 -parameters方式2.2: 使用Spring的内部工具类 -

Tomcat高效部署与性能优化方式

《Tomcat高效部署与性能优化方式》本文介绍了如何高效部署Tomcat并进行性能优化,以确保Web应用的稳定运行和高效响应,高效部署包括环境准备、安装Tomcat、配置Tomcat、部署应用和启动T... 目录Tomcat高效部署与性能优化一、引言二、Tomcat高效部署三、Tomcat性能优化总结Tom

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon