轻松上手微调大语言模型——QLORA篇

轻松上手微调大语言模型——QLORA篇

前言

本篇Blog是代码实战篇,着重于新手如何在消费级GPU上快速跑通代码,打造属于自己的AI大语言模型。涉及到相关技术的具体原理我会在以后的更新中一一讲解。

在本篇中我对llama-2进行微调作为示例。

先决条件

安装必要的库文件:

pip install transformers trl bitsandbytes peft datasets
  • transformers:已经成为人工智能社区最流行的库之一,它对pytorch、tensorflow及Jax等等流行深度学习框架进行封装,包括数据预处理、模型加载保存和报告、训练流程等等;它使我们可以更好的关注开发算法或应用,而不必重复造轮子。
  • TRL:是一个全栈库,提供了一组工具来训练具有强化学习的transformer语言模型,从监督微调步骤(SFT),奖励建模步骤(RM)到近端策略优化(PPO)步骤。该库集成了🤗transformers。最佳比较火的RLHF训练方式可以轻松使用这个库来实现。
  • bitsandbytes:一个量化库,可以兼容QLora。量化模型权重,在尽量不损失模型性能情况下,减小模型大小以及对GPU内存的需求。
  • peft(Parameter-Efficient Fine-Tuning,参数高效微调):用于有效地将大型预训练模型适应各种下游应用程序,而无需微调模型的所有参数,因为它的成本过高。 PEFT 方法仅微调少量(额外)模型参数 - 显着降低计算和存储成本 - 同时产生与完全微调模型相当的性能。这使得在消费类硬件上训练和存储大型语言模型 (LLM) 变得更加容易。像LORA、P-Tuning、Prefix tuning等都已被实现,开发者可以轻松使用。
  • Datasets:用于轻松访问和共享音频、计算机视觉和自然语言处理 (NLP) 任务的数据集。只需一行代码即可加载数据集,并使用强大的数据处理方法快速获取本地数据集,准备好进行深度学习模型的训练。在 Apache Arrow 格式的支持下,通过零拷贝读取处理大型数据集,没有任何内存限制,以获得最佳速度和效率。并与 Hugging Face Hub 进行深度集成,可以轻松加载数据集并与更广泛的机器学习社区共享数据集。

代码实战

  1. 导入对应模块

    import transformers
    import datasets
    from transformers import (AutoModelForCausalLM,AutoTokenizer,BitsAndBytesConfig,HfArgumentParser,TrainingArguments,pipeline,logging,
    )
    from peft import LoraConfig, PeftModel
    from trl import SFTTrainer
    
  2. 加载数据集
    使用datasets库可以方便高效的加载本地或者云端的数据集。加载的方式有很多种,我这里介绍一种比较常用的方法,对于没有任何编程基础的同学可以直接选择此方法。datasets详细用法我会在transformers常用库详解(待更新)中详细介绍。

    • 使用load_datasets()方法。
      dataset = datasets.load_dataset("mlabonne/guanaco-llama2-1k", #如果要加载本地数据则换为本地路径split="train", #如果没有这个参数将返回DatasetDict对象,可以使用类似字典的方式操作。)
      
  3. 配置量化参数
    量化模型,大幅减少模型GPU内存占用量。

    quantization_config = BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_compute_dtype='float16',bnb_4bit_quant_type="nf4",bnb_4bit_use_double_quant=True,)
    

    bnb_4bit_quant_type=‘nf4’:NF4是QLoRA论文中的4位数据类型,适用于从正态分布初始化的权重bnb_4bit_quant_type对性能不会产生巨大影响。
    bnb_4bit_use_double_quant:二次量化也称嵌套量化。可以节省额外内存而无需额外性能成本。此功能对已量化的权重执行第二次量化,以额外节省0.4位/参数。
    bnb_4bit_compute_dtype:如果CUDA版本较新可以设置为’bf16’加速计算。

  4. 加载模型

    model = AutoModelForCausalLM.from_pretrained('meta-llama/Llama-2-7b-hf', ##如果没有访问权限可在huggingface申请并添加token=access_token参数quantization_config=quantization_config
    )
    model.config.use_cache = False
    model.config.pretraining_tp = 1# 加载llama tokenizer
    tokenizer = AutoTokenizer.from_pretrained('meta-llama/Llama-2-7b-hf',trust_remote_code=True)
    tokenizer.pad_token = tokenizer.eos_token
    tokenizer.padding_side = "right"
    
  5. 配置LoRA

    peft_config = LoraConfig(lora_alpha=16,lora_dropout=0.1,r=16,bias="none",task_type="CAUSAL_LM",
    )
    
  6. 配置训练参数
    为了加速训练,高效利用GPU,我们可以采用一些方法。
    在这里插入图片描述

    training_args = TrainingArguments(output_dir='dirname',per_device_train_batch_size=1,gradient_accumulation_steps=4,gradient_checkpointing=True,#fp16=True,bf16=True,optim="adamw_bnb_8bit",logging_steps=25,learning_rate=2e-4,max_grad_norm = 0.3,warmup_ratio = 0.03,num_train_epochs=2,report_to="none", #默认wandb,可以换为tensorboard,或者不需要报告# push_to_hub=True,#是否将模型同步到huggingface hub)
    

    gradient accumulation:梯度累积方法旨在以较小的增量计算梯度,而不是一次计算整个批次的梯度。这种方法涉及通过向前和向后遍历模型并在此过程中累积梯度来迭代计算较小批次的梯度。一旦积累了足够数量的梯度,就会执行模型的优化步骤。通过采用梯度累积,可以将有效批量大小增加到超出 GPU 内存容量的限制。但是,需要注意的是,梯度累积引入的额外前向和后向传递可能会减慢训练过程。虽然建议尽可能最大化 GPU 使用率,但大量梯度累积步骤可能会导致更明显的训练速度减慢。考虑以下示例。假设没有梯度累积的 per_device_train_batch_size=4 就达到了 GPU 的极限。如果您想使用大小为64的批次进行训练,请勿将per_device_train_batch_size设置为 1,并将gradient_accumulation_steps设置为64。相反,保留 per_device_train_batch_size=4并设置gradient_accumulation_steps=16。

    Gradient Checkpointing:梯度检查点提供了“保存前向传递中的所有激活以便在后向传递期间计算梯度”与“在向后传递过程中丢弃激活并在需要时重新计算它们”这两种方法之间的折衷方案,并在整个计算图中保存了战略选择的激活,因此只需为梯度重新计算一小部分激活。

    Mixed precision training(bf16, fp16):通过对某些变量使用较低精度的数值格式来优化训练模型的计算效率,如果可以使用Ampere或更新的硬件,则可以使用bf16进行混合精度训练和评估。
    在这里插入图片描述

  7. 配置Trainer
    此处使用SFTTrainer,它继承自Trainer类,但是优化了CAUSAL_LM任务训练流程,无需我们提供Label标签。

    trainer = SFTTrainer(model=model,train_dataset=dataset,peft_config=peft_config,dataset_text_field="text",max_seq_length=None,tokenizer=tokenizer,args=training_args,
    )
    
  8. 训练与保存模型

    trainer.train()trainer.model.save_pretrained('new_model_name')
    

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

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

相关文章

【成功率极高】消逝的光芒1联机显示加入的游戏不可用完美解决办法

今天和朋友联机玩消逝的光芒1,但是总是联机有问题,总是莫名其妙连上又退出去。而且退出去一次之后就进不来了,网上查了下,大概有三种方法,我全都试了下。 发现只有一种办法有用,那就是不连加速器。 没错&…

【你也能从零基础学会网站开发】 SQL结构化查询语言应用基础--创建表约束(table Constraints) 之 PRIMARY KEY 主键约束

🚀 个人主页 极客小俊 ✍🏻 作者简介:程序猿、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注 什么是SQL数据…

《“微软蓝屏”敲响警钟:网络安全与系统稳定何去何从》

#“微软蓝屏”事件暴露了网络安全哪些问题?# 近日,一场由微软视窗系统软件更新所引发的全球性“微软蓝屏”事件,犹如一场突如其来的风暴,以雷霆万钧之势席卷了整个科技领域。这一事件宛如一颗投入平静湖面的巨石,瞬间激…

centos系统mysql数据库压缩备份与恢复

文章目录 压缩备份一、安装 xtrabackup二、数据库中创建一些数据三、进行压缩备份四、模拟数据丢失,删库五、解压缩六、数据恢复 压缩备份 一、安装 xtrabackup 确保已经安装了 xtrabackup 工具。可以从 Percona 的官方网站 获取并安装适合你系统的版本。 # 添加…

Study--Oracle-07-ASM相关参数(三)

一、ASM初始化参数 1、ASM全量参数,见附件 2、ASM重要参数 3、ASM权限 ASM的三大系统权限包括SYSDBA、‌SYSOPER和SYSASM。‌ SYSDBA(‌系统管理员)‌:‌这是最高级别的权限,‌允许用户执行所有的数据库管理任务&a…

Windows 11 家庭中文版 安装 VMWare 报 安装程序检测到主机启用了Hyper-V或Device

1、问题 我的操作系统信息如下: 我在安装 VMWare 的时候,报: 因为我之前安装了 docker 桌面版,所以才报这个提示。 安装程序检测到主机启用了 Hyper-v或 Device/credential Guard。要在启用了Hyper-或 Device/Credential Guard …

系统架构师考点--设计模式

大家好。今天来总结一下设计模式的相关考点。这部分考点也有可能在论文中出现,这里总结的可能不够全面,大家自己可以翻一下教材好好了解一下。 架构模式:软件设计中的高层决策,例如C/S结构就属于架构模式,架构模式反…

[k8s源码]9.workqueue

client-go 是一个库,提供了与 Kubernetes API 服务器交互的基础设施。它提供了诸如 Informer、Lister、ClientSet 等工具,用于监听、缓存和操作 Kubernetes 资源。而自定义控制器则利用这些工具来实现特定的业务逻辑和自动化任务。业务逻辑实现&#xff…

【ROS2】演示:为有损网络使用服务质量设置

目录 背景 先决条件 运行演示 命令行选项 添加网络流量 背景 请阅读有关 QoS 设置的文档页面,以获取有关 ROS 2 中可用支持的背景信息。 在这个演示中,我们将生成一个发布相机图像的节点和另一个订阅图像并在屏幕上显示图像的节点。然后,我们…

Fedora40安装telnet-server启用telnet服务

Fedora40安装telnet-server启用telnet服务 安装 telnet-server sudo yum install telnet-server或 sudo dnf install telnet-server启用服务 fedora40 或 CentosStream9 不能用 yum或dnf安装xinetd, telnet-server 的服务名为: telnet.socket 启用 telnet.socket.service …

三、基础语法2(30小时精通C++和外挂实战)

三、基础语法2(30小时精通C和外挂实战) B-02内联函数B-04内联函数与宏B-05_constB-06引用B-07引用的本质B-08-汇编1-X86-X64汇编B-09-汇编2-内联汇编B-10-汇编3-MOV指令C-02-汇编5-其他常见指令C-05-汇编8-反汇编分析C-07-const引用、特点 B-02内联函数 …

TreeSelect增加可筛选功能

TreeSelect官方可筛选示例 <template><el-tree-selectv-model"value":data"data"filterablestyle"width: 240px"/><el-divider /><el-divider />filter node method:<el-tree-selectv-model"value":data&q…

数据安全传输--加密算法

目录 古典加密算法与近代加密算法对比 算法分类 对称加密 常见的对称加密算法 在对称加密算法中密钥共享是一个很麻烦的问题 非对称加密 非对称加密过程 常见非对称加密算法 对称加密和非对称加密两者对比结论 DH算法 身份认证和数据认证技术 hash算法 hash算法特点…

PySide(PyQt),自定义图标按钮

1、在Qt Designer中新建画面&#xff0c;并放置3个按钮&#xff08;QPushButton&#xff09;和一个分组框&#xff08;QGroupBox&#xff09;小部件&#xff0c;分别命名为btn_1&#xff0c; btn_2&#xff0c;btn_3和btnStation。 2、将所有小部件的显示文字内容删除。 3、将…

论文复现:Predictive Control of Networked Multiagent Systems via Cloud Computing

Predictive Control of Networked Multiagent Systems via Cloud Computing论文复现 文章目录 Predictive Control of Networked Multiagent Systems via Cloud Computing论文复现论文摘要系统参数初始化系统模型观测器预测过程控制器设计系统的整体框图仿真结果 论文摘要 翻译…

杰发科技Bootloader(2)—— 基于7840的Keil配置地址

序 在7840的sample代码里面有一个简单的Boot跳转APP的示例 PFlash地址从0开始 DFlash的地址从1000000开始 Boot解析 他的boot地址配置为0 Boot的代码主要是这几行&#xff0c;主要作用就是Flash的跳转 int main(void) {SystemClock_Config();InitDebug();printf("demo…

NSAT-8000与Chroma8000相比,有什么独特优势?

在电源模块的广泛应用推动下&#xff0c;测试效率成为行业关注的焦点。纳米软件响应这一需求&#xff0c;推出了NSAT-8000电源自动测试系统&#xff0c;其0代码操作模式大幅简化了测试流程。那么与Chroma 8000系统相比&#xff0c;有什么不同呢&#xff1f; 一、测试项目搭建 C…

nacos get changed dataId error, code: 403

nacos get changed dataId error, code: 403问题解决 问题出现原因&#xff1a;解决办法&#xff1a;需要在运行项目的配置添加权限账号和密码,重启服务 问题出现原因&#xff1a; 由于nacosserver开启了权限验证&#xff0c;项目启动时出现异常 nacos.core.auth.caching.ena…

数据结构->线性结构->顺序存储->静态链表

一、思路 链表由节点组成。 1、分析需求&#xff0c;画图&#xff1a; 2、定义学生结构体&#xff0c;包含姓名、年龄、性别和下一个学生的指针&#xff1a; #include <stdio.h> #define N 20// 定义性别枚举类型&#xff0c;固定值&#xff0c;不是男就是女 typedef e…

torchscript接口

一、定义 定义script、eager、onnx 模式对比案例生成的模型可以被c调用接口解读 二、实现 定义 可以在高性能环境libtorch&#xff08;C &#xff09;中直接加载&#xff0c;实现模型推理&#xff0c;而无需Pytorch训练框架依赖无需代码&#xff0c;直接加载模型&#xff0c…