大模型基础知识-LoRA与QLoRA

介绍 LoRA 与 QLoRA
1. LoRA (Low-Rank Adaptation)
LoRA 是一种用于大规模语言模型 (LLM) 的参数高效微调技术,旨在减少微调大模型所需的计算资源和存储空间。LoRA 的核心思想是将全量参数更新分解为低秩矩阵的形式,从而显著减少参数数量和计算开销。

核心思想:

低秩分解:将大模型的权重矩阵表示为两个低秩矩阵的乘积。这种分解方法不仅保留了原始模型的表示能力,还显著减少了微调过程中需要更新的参数数量。
参数高效:通过这种方式,只需微调少量参数(即低秩矩阵的参数),而非整个模型的参数,从而大大降低了存储和计算成本。
优点:

存储节省:减少了需要存储和更新的参数数量。
计算效率:降低了微调过程中所需的计算资源。
可扩展性:适用于各种大规模预训练模型,包括 NLP 和 CV 等领域。
应用场景:

自然语言处理 (NLP):如机器翻译、文本生成等任务。
计算机视觉 (CV):如图像分类、对象检测等任务。

import torch
import torch.nn as nnclass LoRALinear(nn.Module):def __init__(self, in_features, out_features, rank=4):super(LoRALinear, self).__init__()self.rank = rankself.weight_A = nn.Parameter(torch.randn(in_features, rank))self.weight_B = nn.Parameter(torch.randn(rank, out_features))self.bias = nn.Parameter(torch.zeros(out_features))def forward(self, x):return x @ self.weight_A @ self.weight_B + self.bias# 示例用法
lora_layer = LoRALinear(512, 1024)
input_data = torch.randn(32, 512)
output_data = lora_layer(input_data)

2. QLoRA (Quantized Low-Rank Adaptation)

QLoRA (Quantized Low-Rank Adaptation) 是一种结合了模型量化和低秩适配的技术,旨在减少大规模预训练模型微调和部署的计算和存储成本。QLoRA 的主要思路是:

量化预训练模型参数:将已有的大规模预训练模型参数进行量化处理,以减少存储需求和计算负担。
低秩适配 (LoRA):在量化后的模型上应用低秩适配技术,仅微调少量附加的低秩矩阵,从而保持微调的高效性。
核心思想
模型量化:对预训练模型的权重进行量化处理,如使用 8-bit 或更低精度表示模型参数,以减少存储空间和计算资源。
低秩适配:在量化后的模型基础上进行低秩适配,通过引入低秩矩阵来进行微调,从而节省参数数量和计算开销。
优点
存储节省:通过量化大幅减少了模型权重的存储需求。
计算加速:量化后的计算通常更快,特别是在专门的硬件(如 GPU、TPU)上。
高效微调:结合 LoRA 技术,只需微调少量参数即可实现模型的适应,提高了微调效率。

import torch
import torch.nn as nn# 定义一个简单的预训练线性层
class PretrainedLinear(nn.Module):def __init__(self, in_features, out_features):super(PretrainedLinear, self).__init__()self.weight = nn.Parameter(torch.randn(out_features, in_features))self.bias = nn.Parameter(torch.zeros(out_features))def forward(self, x):return torch.matmul(x, self.weight.t()) + self.bias# 量化函数
def quantize_tensor(tensor, num_bits=8):scale = tensor.abs().max() / (2**(num_bits - 1) - 1)quantized = (tensor / scale).round()return quantized, scale# 反量化函数
def dequantize_tensor(quantized, scale):return quantized * scale# 定义量化后的 LoRA 适配层
class QuantizedLoRALinear(nn.Module):def __init__(self, pretrained_layer, rank=4, num_bits=8):super(QuantizedLoRALinear, self).__init__()self.pretrained_layer = pretrained_layer# 对预训练层的权重进行量化 一般对预训练的大模型如LLAMA3 的 attention 层和fc层 等线性层进行量化self.quantized_weight, self.scale = quantize_tensor(pretrained_layer.weight.data, num_bits)# 定义低秩适配的权重self.weight_A = nn.Parameter(torch.randn(pretrained_layer.weight.shape[1], rank))self.weight_B = nn.Parameter(torch.randn(rank, pretrained_layer.weight.shape[0]))def forward(self, x):# 反量化预训练的权重dequantized_weight = dequantize_tensor(self.quantized_weight, self.scale)# 计算 LoRA 适配部分lora_adjustment = torch.matmul(torch.matmul(x, self.weight_A), self.weight_B.t())# 总输出为预训练层输出加上 LoRA 适配部分return torch.matmul(x, dequantized_weight.t()) + lora_adjustment + self.pretrained_layer.bias# 示例用法
pretrained_layer = PretrainedLinear(512, 1024)
quantized_lora_layer = QuantizedLoRALinear(pretrained_layer, rank=4, num_bits=8)input_data = torch.randn(32, 512)
output_data = quantized_lora_layer(input_data)
print(output_data)

例子:使用 LLaMA 3 作为预训练模型,并结合 QLoRA 技术进行微调,可以显著减少存储和计算成本,同时保持模型性能。下面将介绍如何将 QLoRA 应用于 LLaMA 3 模型,并提供一个具体的示例代码。

主要步骤
加载预训练的 LLaMA 3 模型和分词器。
对注意力层和全连接层进行量化。
应用 LoRA 技术进行低秩适配。

准备数据为alpaca数据格式
微调模型。

测试模型

import torch
import torch.nn as nn
from transformers import LLaMAForCausalLM, LLaMATokenizer, Trainer, TrainingArguments, DataCollatorForLanguageModeling
from datasets import load_dataset# 定义量化函数
def quantize_tensor(tensor, num_bits=8):scale = tensor.abs().max() / (2**(num_bits - 1) - 1)quantized = (tensor / scale).round().int()return quantized, scale# 定义反量化函数
def dequantize_tensor(quantized, scale):return quantized.float() * scale# 定义量化后的 LoRA 适配层
class QLoRALayer(nn.Module):def __init__(self, pretrained_layer, rank=4, num_bits=8):super(QLoRALayer, self).__init__()self.pretrained_layer = pretrained_layer# 对预训练层的权重进行量化self.quantized_weight, self.scale = quantize_tensor(pretrained_layer.weight.data, num_bits)# 定义低秩适配的权重self.weight_A = nn.Parameter(torch.randn(pretrained_layer.weight.shape[1], rank))self.weight_B = nn.Parameter(torch.randn(rank, pretrained_layer.weight.shape[0]))def forward(self, x):# 反量化预训练的权重dequantized_weight = dequantize_tensor(self.quantized_weight, self.scale)# 计算 LoRA 适配部分lora_adjustment = torch.matmul(torch.matmul(x, self.weight_A), self.weight_B.t())# 总输出为预训练层输出加上 LoRA 适配部分return torch.matmul(x, dequantized_weight.t()) + lora_adjustment# 加载预训练的 LLaMA 3 模型和分词器
model_name = "facebook/llama-3b"
model = LLaMAForCausalLM.from_pretrained(model_name)
tokenizer = LLaMATokenizer.from_pretrained(model_name)# 遍历模型中的注意力层和全连接层进行量化和 LoRA 适配
for name, module in model.named_modules():if isinstance(module, nn.Linear):quantized_lora_layer = QLoRALayer(module)# 替换原始层setattr(model, name, quantized_lora_layer)# 准备 Alpaca 格式的数据集
dataset = load_dataset("alpaca", split="train")# 数据预处理函数
def preprocess_function(examples):inputs = [ex["instruction"] + " " + ex["input"] for ex in examples]model_inputs = tokenizer(inputs, max_length=512, truncation=True, padding="max_length")labels = tokenizer(examples["output"], max_length=512, truncation=True, padding="max_length")model_inputs["labels"] = labels["input_ids"]return model_inputs# 处理数据集
tokenized_dataset = dataset.map(preprocess_function, batched=True)# 数据整理器
data_collator = DataCollatorForLanguageModeling(tokenizer, mlm=False)# 微调模型的训练参数
training_args = TrainingArguments(output_dir="./results",overwrite_output_dir=True,num_train_epochs=3,per_device_train_batch_size=8,save_steps=10_000,save_total_limit=2,logging_dir="./logs",
)# 定义 Trainer
trainer = Trainer(model=model,args=training_args,data_collator=data_collator,train_dataset=tokenized_dataset,
)# 开始微调
trainer.train()# 测试模型
model.eval()
instruction = "Translate English to French:"
input_text = "The quick brown fox jumps over the lazy dog."
test_input = tokenizer(instruction + " " + input_text, return_tensors="pt")with torch.no_grad():generated_ids = model.generate(test_input["input_ids"], max_length=50)generated_text = tokenizer.decode(generated_ids[0], skip_special_tokens=True)print(f"Generated Text: {generated_text}")

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

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

相关文章

WSL-Ubuntu20.04训练环境配置

1.YOLOv8训练环境配置 训练环境配置的话就仍然以YOLOv8为例,来说明如何配置深度学习训练环境。这部分内容比较简单,主要是安装miniAnaconda以及安装torch和torchvision. 首先是miniAnaconda的安装(参考官网的教程Miniconda — Anaconda ),执行…

CH552G使用IAP下载

常见下载中的方式ISP,IAP,ICP 参考,CH552G中文手册,参考1 ISP:In System Programing,在系统编程。是常见的,使用软件,先将某个引脚(例如boot)连接到合适的电…

Spring源码注解篇三:深入理解@Component注解

Component及其派生注解的源码 Spring框架作为Java开发中不可或缺的一部分,其依赖注入机制的核心是通过注解来实现的。本文将深入探讨Spring中Component及其派生注解的源码实现,分析Spring如何通过类路径扫描(Classpath Scanning)和…

【笔记】一起齿轮箱的故障和相应的数学模拟实验

1.齿轮箱故障一例 出处:设备的故障识别 GearBox的频谱图,原作者不知道是从哪里拷贝来的,待会儿确认一下。 齿轮啮合频率GMF等于齿数乘以齿轮转速频率: ★齿轮啮合频率两边有边频,间距为1X(这是由冲击响应…

JS【实用教程】(2024最新版)

JS 简介 JavaScript 简称 JS,可运行于浏览器 或 node 环境。 JS 的特点 单线程——同一时间只能执行一个任务,多个任务时会排队,后续任务必须等到前一个任务结束才能开始执行。 为什么JavaScript不能有多个线程? 因为作为浏览器脚…

BERT架构的深入解析

BERT(Bidirectional Encoder Representations from Transformers)是由Google在2018年提出的一种基于Transformer架构的预训练模型,迅速成为自然语言处理(NLP)领域的一个里程碑。BERT通过双向编码器表示和预训练策略&am…

17-5 向量数据库之野望5 - 使用 Rust 实现矢量数据库

​​​​​​ 与存储标量数据(如整数、字符串等)的传统数据库不同,矢量数据库旨在有效地存储和检索矢量数据——表示多维空间中的点的数值集合。 本文将探讨如何在 Rust 中实现基本的向量数据库。 让我们开始吧!🦀 什么是矢量数据库? 矢量数据库是一种针对存储和查询…

Neo4j数据库相关

Neo4j 使用指南 目录 什么是 Neo4jNeo4j 的特点Neo4j 的使用场景安装 Neo4j 使用 Docker 安装 Neo4j直接安装 Neo4j 启动和访问 Neo4j使用 Cypher 查询语言 创建节点和关系查询节点和关系更新和删除操作 使用 Python 访问 Neo4j 安装 py2neoPython 代码示例 高级功能和扩展 插…

十年笃行,拥抱世界,JumpServer开源堡垒机v4.0正式发布

2024年7月15日,JumpServer开源堡垒机正式发布v4.0版本。在JumpServer开源堡垒机v4.0版本的设计过程中,JumpServer开源项目组继续秉持“内外兼修”的原则,并且开始迈步走向全球化,同时进一步提升用户的使用体验,真正用心…

25_Vision Transformer原理详解

1.1 简介 Vision Transformer (ViT) 是一种将Transformer架构从自然语言处理(NLP)领域扩展到计算机视觉(CV)领域的革命性模型,由Google的研究人员在2020年提出。ViT的核心在于证明了Transformer架构不仅在处理序列数据(如文本)方面非常有效&…

【C++精华铺】12.STL list模拟实现

1.序言 STL (Standard Template Library)是C标准库中的一个重要组件,提供了许多通用的数据结构和算法。其中,STL list是一种带头双向链表容器,可以存储任意类型的元素。 list的特点包括: 双向性:list中的元素可以根据需…

怎样去除视频上的水印和文字,视频水印文本移除教程

在观看和分享视频时,我们经常会遇到带有水印或额外文字的情况。这些标记有时是为了版权保护,有时则是平台的标识,但在某些情况下,它们可能会干扰视频的观赏体验。本文将向你介绍常见的视频水印类型以及如何使用简鹿水印助手去除这…

浅谈安数云智能安全运营管理平台:DCS-SOAR

SOAR(security orchestration,automation and response),由Gartner于2015年提出,最初的含义是安全运营、分析与报告。2017年,Gartner又重新定义了SOAR的能力,包括安全编排、安全自动化和安全响应…

Purple Pi OH在Android11下测试WiFi和LAN的TCP和UDP传输速率

本文适用于在Purple Pi OH在Andriod11下如何测试WiFi和LAN的TCP和UDP传输速率。触觉智能的Purple Pi OH鸿蒙开源主板,是华为Laval官方社区主荐的一款鸿蒙开发主板。 该主板主要针对学生党,极客,工程师,极大降低了开源鸿蒙开发者的…

AI安全系列——[第五空间 2022]AI(持续更新)

最近很长时间没有更新,其实一直在学习AI安全,我原以为学完深度学习之后再学AI安全会更加简单些,但是事实证明理论转实践还是挺困难的,但是请你一定要坚持下去,因为“不是所有的坚持都有结果,但总有一些坚持…

QT简介、安装与运行

QT5.9.0 安装 下载地址:https://download.qt.io/archive/qt/ 安装过程,直接点击下一步,设置勾选如下: 下载VS编译插件地址如下(已安装vs): https://download.qt.io/archive/vsaddin/2.3.2/

【ARMv8/v9 异常模型入门及渐进 9.1 - FIQ 和 IRQ 打开和关闭】

请阅读【ARMv8/v9 ARM64 System Exception】 文章目录 FIQ/IRQ Enable and Disable汇编指令详解功能解释使用场景和注意事项 FIQ/IRQ Enable and Disable 在ARMv8/v9架构中,可以使用下面汇编指令来打开FIQ和 IRQ,代码如下: asm volatile ("msr da…

敏捷营销在AI智能名片微信小程序中的应用探索

摘要:在数字化转型的浪潮中,企业面临着前所未有的挑战与机遇。AI智能名片微信小程序作为一种创新的营销工具,以其便捷性、智能化和高效性,正逐步成为企业连接客户、推广品牌的新宠。然而,如何在快速变化的市场环境中&a…

docker 安装 onlyoffice

1.文档地址 Installing ONLYOFFICE Docs for Docker on a local server - ONLYOFFICE 2.安装onlyoffice docker run -i -t -d -p 9000:8000 --restartalways -e JWT_ENABLEDfalse onlyoffice/documentserver 如果发现镜像无法下载,可以尝试更换镜像源 {"registry-mir…