使用QLoRA在自定义数据集上finetuning 大模型 LLAMA3 的数据比对分析

news2024/11/19 16:41:14

概述:

大型语言模型(LLM)展示了先进的功能和复杂的解决方案,使自然语言处理领域发生了革命性的变化。这些模型经过广泛的文本数据集训练,在文本生成、翻译、摘要和问答等任务中表现出色。尽管LLM具有强大的功能,但它可能并不总是与特定的任务或领域保持一致。

什么是LLM微调?

微调LLM涉及对预先存在的模型进行额外的训练,该模型之前使用较小的特定领域数据集从广泛的数据集中获取了模式和特征。在“LLM微调”的上下文中,LLM表示“大型语言模型”,例如OpenAI的GPT系列。这种方法具有重要意义,因为从头开始训练大型语言模型在计算能力和时间方面都是高度资源密集型的。利用嵌入预训练模型中的现有知识允许在显著减少数据和计算需求的情况下实现特定任务的高性能。

以下是LLM微调中涉及的一些关键步骤:
  1. List item选择预训练模型:对于LLM微调,第一步是仔细选择符合我们所需架构和功能的基础预训练模型。预训练模型是在大量未标记数据的语料库上训练的通用模型。

  2. 收集相关数据集:然后我们需要收集与我们的任务相关的数据集。数据集应该以模型可以从中学习的方式进行标记或结构化。

  3. 预处理数据集:一旦数据集准备好,我们需要进行一些预处理以进行微调,方法是清理它,将其拆分为训练、验证和测试集,并确保它与我们想要微调的模型兼容。

  4. 微调:在选择了一个预训练的模型后,我们需要在预处理的相关数据集上对其进行微调,该数据集更适合手头的任务。我们将选择的数据集可能与特定的域或应用程序相关,从而允许模型针对该上下文进行调整和专门化。

  5. 特定任务的适应:在微调过程中,根据新的数据集调整模型的参数,帮助它更好地理解和生成与特定任务相关的内容。这个过程保留了在预训练期间获得的一般语言知识,同时根据目标领域的细微差别调整模型。

什么是LoRa?

LoRA是一种改进的微调方法,其中不是微调构成预训练的大型语言模型的权重矩阵的所有权重,而是微调近似于该较大矩阵的两个较小矩阵。这些矩阵构成了LoRA适配器。然后将这个经过微调的适配器加载到预先训练的模型中,并用于推理。

在针对特定任务或用例对LoRA进行微调后,结果是原始LLM不变,并且出现了相当小的“LoRA适配器”,通常表示原始LLM大小的个位数百分比(以MB而非GB为单位)。

在推理过程中,LoRA适配器必须与其原始LLM相结合。其优点在于许多LoRA适配器能够重用原始LLM,从而在处理多个任务和用例时降低总体内存需求。

什么是量化LoRA(QLoRA)?

QLoRA代表了LoRA的一种更具内存效率的迭代。QLoRA还通过将LoRA适配器(较小矩阵)的权重量化到较低精度(例如,4比特而不是8比特),使LoRA更进一步。这进一步减少了内存占用和存储需求。在QLoRA中,预训练的模型用量化的4位权重加载到GPU存储器中,而在LoRA中使用的是8位。尽管比特精度有所下降,QLoRA仍保持着与LoRA相当的有效性水平。

代码实现

依赖加载

from datasets import load_dataset
from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    BitsAndBytesConfig,
    HfArgumentParser,
    AutoTokenizer,
    TrainingArguments,
    Trainer,
    GenerationConfig
)
from tqdm import tqdm
from trl import SFTTrainer
import torch
import time
import pandas as pd
import numpy as np
from huggingface_hub import interpreter_login
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
from functools import partial


import os
#禁用权重和偏差
os.environ['WANDB_DISABLED']="true"

数据加载

huggingface_dataset_name = "neil-code/dialogsum-test"#“neil代码/对话和测试
dataset = load_dataset(huggingface_dataset_name)
print(dataset['train'][0])

在这里插入图片描述
数据包含以下字段。
对话:对话的文本。
摘要:人类书写的对话摘要。
主题:人类书写的主题/对话的一行。
id:示例的唯一文件id。

加载模型

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,
    )
    
model_name=r'D:\临时模型\Meta-Llama-3-8B-Instruct'
device_map = {
   "": 0}
original_model = AutoModelForCausalLM.from_pretrained(model_name, 
                                                      device_map=device_map,
                                                      quantization_config=bnb_config,
                                                      trust_remote_code=True,
                                                      use_auth_token=True)

BitsAndBytesConfig 为量化配置

  • List itemload_in_4bit=True:这个参数指定模型在加载时是否应该以4位量化的格式进行。这意味着模型的权重将使用4位精度来存储,从而减少模型的内存占用和加速推理过程。

  • bnb_4bit_quant_type='nf4':这个参数定义了用于量化的数值格式。在这里,‘nf4’ 代表 “Normal Float 4”,它是一种4位量化的浮点数格式,用于量化模型的权重。

  • bnb_4bit_compute_dtype=compute_dtype:这个参数指定了在推理时用于计算的数据类型。compute_dtype 是一个变量,应该在这段代码之前定义,它通常是一个类似于 torch.bfloat16 的数据类型,表示在计算期间使用的半精度浮点数格式。

  • bnb_4bit_use_double_quant=False:这个参数控制是否使用双量化技术。双量化是一种技术,它在量化过程中使用两个不同的量化表(lookup table)来提高精度。在这里,False 表示不使用双量化。

数据预处理

#prompt 工程
def create_prompt_formats(sample):
    """
    格式化示例的各个字段('instruction','output')
    然后使用两个换行符将它们连接起来
    :参数sample:样本字典
	
	这里主要对数据添加一个prompt 用于给到大模型更好的格式规范,这里是模型效果提升的第一个关键点
    """
    INTRO_BLURB = "Below is an instruction that describes a task. Write a response that appropriately completes the request."
    INSTRUCTION_KEY = "### Instruct: Summarize the below conversation."
    RESPONSE_KEY = "### Output:"
    END_KEY = "### End"
    
    blurb = f"\n{
     INTRO_BLURB}"
    instruction = f"{
     INSTRUCTION_KEY}"
    input_context = f"{
     sample['dialogue']}" if sample["dialogue"] else None
    response = f"{
     RESPONSE_KEY}\n{
     sample['summary']}"
    end = f"{
     END_KEY}"
    
    parts = [part for part in [blurb, instruction, input_context, response, end] if part]

    formatted_prompt = "\n\n".join(parts)
    sample["text"] = formatted_prompt

    return sample

#数据截断
def get_max_length(model):
    conf = model.config
    max_length = None
    for length_setting in ["n_positions", "max_position_embeddings", "seq_length"]:
        max_length = getattr(model.config, length_setting, None)
        if max_length:
            print(f"Found max lenth: {
     max_length}")
            break
    if not max_length:
        max_length = 1024
        print(f"Using default max length: {
     max_length}")

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

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

相关文章

oracle 数据库找到UDUMP的文件名称

oracle 数据库找到UDUMP的文件名称 select p.value||\||i.instance_name||_ora_||spid||.trc as "trace_file_name" from v$parameter p ,v$process pro, v$session s, (select sid from v$mystat where rownum1) m, v$instance i where lower(p.name)user_dump_…

红米Turbo3小米平板6SPro澎湃OS系统强解BL锁-跳小米社区绑定-刷ROOT权限

红米Turbo3小米平板6SPro这2款设备都出厂为澎湃OS系统,官方提供都是小米社区申请解锁权限,然后自己答题解锁,门槛非常高,想要玩机root的用户,都在堵在门外。还在这目前这两款机型官方并没有加入强制验证,在…

Python turtle绘制图形详解

Python 的 Turtle 模块是一个简单而直观的绘图工具,可以帮助初学者理解基本的图形绘制概念。 1.导入 Turtle 模块: import turtle 2.创建 Turtle 对象: t turtle.Turtle() 3.绘制图形: 4.移动Turtle对象:t.forward(di…

基于Spring Boot的酒店管理系统设计与实现

基于Spring Boot的酒店管理系统设计与实现 开发语言:Java 框架:springboot JDK版本:JDK1.8 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea 系统部分展示 系统首页界面图,在系统首页可以查看首页…

pgsql查看指定模式的存储过程

pgsql查看指定模式的存储过程 在 PostgreSQL 中,如果你想要查看指定模式的存储过程(也称为函数),你可以使用 \df 或 \df 命令在 psql 命令行工具中,或者使用 SQL 查询来从 pg_catalog 系统模式中查询。 \df命令行查询…

容器集群管理系统Kubernetes(K8S)

目录 一、前言 1.1什么是云原生? 1.2云要素的四要素? 1.2.1微服务 1.2.2容器化 1.2.3DevOps 1.2.4持续交付 1.3云平台有哪些? 1.4SRE 二、Kubernetes 概述 2.1K8S 是什么 2.2K8S作用 2.3K8S版本 2.4为什么要用 K8S 2.5K8S 的特…

从零开始打造个性化生鲜微信商城小程序

随着移动互联网的普及,小程序商城已经成为越来越多商家的选择。本文将通过实战案例分享,教您如何在五分钟内快速搭建个性化生鲜小程序商城。 步骤一:登录乔拓云网后台,进入商城管理页面 打开乔拓云官网,点击右上角的“…

unaipp推荐算法的汽车租赁系统zaxzu 微信小程序hbuiderx

随着现代汽车租赁管理的快速发展,可以说汽车租赁管理已经逐渐成为现代汽车租赁管理过程中最为重要的部分之一。但是一直以来我国传统的汽车租赁管理并没有建立一套完善的行之有效的汽车租赁管理系统,传统的汽车租赁管理已经无法适应高速发展,…

自动驾驶中常见坐标系极其转换

各个传感器坐标系 相机坐标系统 摄像头的作用是把三维世界中的形状、颜色信息,压缩到一张二维图像上。基于摄像头的感知算法则是从二维图像中提取并还原三维世界中的元素和信息,如车道线,车辆、行人等,并计算他们与自己的相对位置。 感知算法和相机相关的坐标系有图像坐…

GaussianBody:基于3D高斯散射的服装人体重建

GaussianBody: Clothed Human Reconstruction via 3d Gaussian Splatting GaussianBody:基于3D高斯散射的服装人体重建 Mengtian Li1,2,3, Shengxiang Yao1, Zhifeng Xie1,3,2, Keyu Chen4,2, Yu-Gang Jiang2 李梦田 1,2,3 、姚胜祥 1 、谢志峰 1,3, 2 、陈科宇 4, …

一文了解CloudXR优势及应用原理

CloudXR是一种新颖而先进的技术,旨在将虚拟现实和增强现实体验从本地设备转移到云端,主要功能也包括了远程渲染、流媒体传输、低延迟、高带宽和高质量的音视频传输。CloudXR(云化XR)可以将高保真度的虚拟现实或增强现实场景实时传…

2024年软件测试最全jmeter做接口压力测试_jmeter接口性能测试_jmeter压测接口(3),【大牛疯狂教学

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化! 由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、…

2024年大学生三下乡社会实践活动投稿注意事项

随着2024年夏季的热浪一同涌来的,是我校一年一度的“大学生三下乡”社会实践活动。作为一名积极参与其中的大学生,我满怀激情地投身于这项旨在促进农村发展的公益行动中。然而,当活动圆满落幕,轮到我承担起向各大媒体投稿、传播实践成果的重任时,却遭遇了一系列意想不到的挑战,…

今天又发现一个有意思的问题:SQL Server安装过程中下载报错,证明GPT是可以解决问题的

我们在安装数据库的时候,都会有报错问题,无论是Oracle、SQL Server、还是MySQL,都会遇到各种各样的报错,这归根到底还是因为电脑环境的不同,和用户安装的时候,操作习惯的不一样导致的问题。今天的问题是&am…

Python_AI库 Pandas DataFrame的索引方式

Pandas DataFrame的索引方式主要有以下几种: 位置索引(Position-based indexing) 使用行和列的整数位置进行索引。例如,df.iloc[0, 1] 会选择第一行第二列的值(注意Python是0索引的)。 标签索引&#xff…

【Python深度学习(第二版)(2)】深度学习之前:机器学习简史

文章目录 一. 深度学习的起源1. 概率建模--机器学习分类器2. 早期神经网络--反向传播算法的转折3. 核方法 -- 忽略神经网络4. 决策树、随机森林和梯度提升机5. 神经网络替代svm与决策树 二. 深度学习与机器学习有何不同 可以这样说,当前工业界所使用的大部分机器学习…

LVS DR模式部署

一、LVS 简介 LVS的三种工作模式 NAT 地址转换 调度器会作为所有节点服务器的默认网关,也是客户端的访问入口和节点服务器返回响应消息的出口,所以调度器会承载双向流量的负载压力,可能会为整个群集的性能瓶颈。由于节点服务器都会处于内网…

数据存储-SQLite

一般使用到数据库存储,涉及到的数据量都较大,采用文件存储也能完成,但是文件操作复杂,效率低,大量结构化数据通常采用关系型数据库存储较为合适。Android中已经嵌入了轻量级的关系型数据库SQLite,直接按照数…

ICode国际青少年编程竞赛- Python-2级训练场-坐标与列表练习

ICode国际青少年编程竞赛- Python-2级训练场-坐标与列表练习 1、 for i in range(6):Spaceship.step(Item[i].x - Spaceship.x)Dev.step(Item[i].y - Dev.y)Dev.step(Spaceship.y - Dev.y)2、 for i in range(5):Spaceship.step(Item[i].x - Spaceship.x)Flyer[i].step(Item[…

【Linux网络】HTTPS【上】{运营商劫持/加密方式/数据摘要/https的诞生}

文章目录 1.引入1.1http与https1.2SSL/TLS1.3VPN1.4认识1.5密码学1.6为什么要加密?运营商 1.7常见的加密方式对称加密非对称加密 2.加密与解密3.数据摘要 && 数据指纹MD5 数字 签名理解三者数据摘要(Digital Digest):数字…