微调 LLaMA 2:定制大型语言模型的分步指南

微调 LLaMA 2:定制大型语言模型的分步指南

深入了解如何运用新技术在 Google Colab 平台上对 Llama-2 进行微调操作,从而有效克服内存与计算方面的限制,让开源大型语言模型变得更加易于获取和使用。自从 Meta 发布了 LLaMA 的首个版本后,一场旨在构建更为强大、能够与 GPT-3.5(ChatGPT)等模型相抗衡的大型语言模型(LLM)的竞赛便正式开启。开源社区迅速行动起来,不断发布性能愈发强大的模型。对于人工智能领域的爱好者而言,这段时间就如同圣诞节一般充满惊喜,新的技术进展接连不断地涌现。

然而,这些显著的进步也带来了一些不可忽视的弊端。一方面,大多数开源模型的使用许可存在诸多限制,这就意味着它们仅仅能够被应用于研究领域。另一方面,只有那些资金充裕的大型企业或专业的研究机构,才具备足够的实力对模型进行微调或训练操作。此外,部署和维护最前沿的大型模型所需的成本相当高昂。全新版本的 LLaMA 模型正是为了解决上述这些问题而诞生的。它提供了商业许可证,使得更多的组织都有机会使用该模型。而且,现在出现了一些新的方法,能够让用户在内存有限的消费级 GPU 上实现对模型的微调。

人工智能的民主化对于其实现广泛应用来说至关重要。通过打破进入的壁垒,即便是规模较小的公司,也能够依据自身的实际需求和预算,构建出符合自身特点的定制化模型。在本教程当中,我们将会深入探索 Llama-2 模型,并实际演示如何借助 Google Colab 平台,在新的数据集上对其进行微调。此外,我们还会介绍一些有助于降低内存占用量,并加快训练速度的新方法和微调技巧。

在这里插入图片描述

了解 Llama 2 和模型微调

Llama 2 是 Meta 公司推出的第二代开源大型语言模型(LLM)集合,并且附带了商业使用许可证。该模型旨在处理各类自然语言处理任务,其模型规模有所不同,参数数量从 70 亿到 700 亿不等。如果您想深入了解更多关于 LLaMA 模型的详细信息,欢迎阅读我们的文章《Meta AI LLaMA 简介:赋能 AI 创新》。Llama-2-Chat 模型针对对话场景进行了专门优化,其性能目前已经能够与 ChatGPT、PaLM 等备受关注的闭源模型相媲美。实际上,我们还可以通过在高质量的对话数据集上对该模型进行微调操作,进一步提升其性能表现。

机器学习领域中,微调指的是根据新的数据对预训练模型的权重和参数进行调整,以此来提高模型在特定任务上的表现的过程。这一过程需要在与当前任务相关的新数据集上对模型进行训练,同时更新模型的权重,使其更好地适应新的数据特征。若您希望了解更多关于微调的相关信息,欢迎阅读我们的《GPT 3.5 微调指南》。以往,由于显存(VRAM)和计算能力的限制,在消费级硬件设备上无法实现对大型语言模型(LLM)的微调操作。不过,在本教程里,我们将着力克服这些在内存和计算方面所面临的挑战,并使用免费版本的 Google Colab Notebook 来完成对我们模型的训练工作。

如何微调 Llama 2:分步指南

在本部分内容中,我们将一同学习在配备 T4 GPU 的环境下,对拥有 70 亿个参数的 Llama 2 模型进行微调操作所需要的全部步骤。您可以自由选择使用 Google Colab 或者 Kaggle 平台上提供的免费 GPU 资源。需要注意的是,相应的代码在这两个平台上均能够正常运行。

Google Colab 所配备的 T4 GPU 的显存(VRAM)存在一定限制,仅有 16GB。这一容量仅仅勉强能够存储 Llama 2-7b 模型的权重数据,这也就表明我们无法对其进行完整的微调操作,因此,我们必须采用诸如 LoRA 或者 QLoRA 这类参数高效的微调技术。

在接下来的操作中,我们将运用 QLoRA 技术,以 4 位精度对模型展开微调工作,并且对显存(VRAM)的使用进行优化。为了达成这一目标,我们会使用 Hugging Face 生态系统中的大型语言模型(LLM)库,具体包括:transformers、accelerate、peft、trl 以及 bitsandbytes。

入门

我们将从安装所需的库开始

%%capture
%pip install accelerate peft bitsandbytes transformers trl

之后,我们将从这些库中加载必要的模块。

import os
import torch
from datasets import load_dataset
from transformers import (AutoModelForCausalLM,AutoTokenizer,BitsAndBytesConfig,TrainingArguments,pipeline,logging,
)
from peft import LoraConfig
from trl import SFTTrainer

模型配置

Meta 公司官方的 Llama-2 模型可以从 Hugging Face 平台获取,不过需要进行申请,并且在申请后通常得等待几天时间才能收到确认回复。为了避免这种等待的时间成本,将选择使用 NousResearch 的 Llama-2-7b-chat-hf 模型作为基础模型。该模型与原始的 Llama-2 模型在性能等方面是一致的,而且相对来说更容易获取到。

在这里插入图片描述

将使用名为mlabonne/guanaco-llama2-1k的较小数据集对的基础模型进行微调,并为微调后的模型写下名称。

# Model from Hugging Face hub
base_model = "NousResearch/Llama-2-7b-chat-hf"# New instruction dataset
guanaco_dataset = "mlabonne/guanaco-llama2-1k"# Fine-tuned model
new_model = "llama-2-7b-chat-guanaco"

在这里插入图片描述

加载数据集、模型和标记器

将从 Hugging Face 中心加载“guanaco-llama2-1k”数据集。该数据集包含 1000 个样本,已处理为符合 Llama 2 提示格式,并且是优秀的timdettmers/openassistant-guanaco数据集的子集。

dataset = load_dataset(guanaco_dataset, split="train")
dataset = load_dataset(guanaco_dataset, split="train")

位量化配置

QLoRA 实现的 4 位量化,能在消费级硬件上高效微调大型 LLM 模型,还能维持高性能。这极大提升了实际应用的可及性与可用性。

QLoRA 把预训练的语言模型量化为 4 位并冻结参数,接着往模型中添加少量可训练的低秩适配器层。

微调时,梯度会经冻结的 4 位量化模型反向传播至低秩适配器层。所以,整个预训练模型的梯度固定为 4 位,仅适配器层会更新。而且,4 位量化不会对模型性能造成影响。

在这里插入图片描述

可以阅读该论文以更好地理解它。在例子中,使用 BitsAndBytes 创建具有 NF4 类型配置的 4 位量化。

compute_dtype = getattr(torch, "float16")quant_config = BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_quant_type="nf4",bnb_4bit_compute_dtype=compute_dtype,bnb_4bit_use_double_quant=False,
)

加载Llama 2模型

接下来,我们将从 Hugginface 加载标记器并设置padding_side为“正确”以修复 fp16 的问题

model = AutoModelForCausalLM.from_pretrained(base_model,quantization_config=quant_config,device_map={"": 0}
)
model.config.use_cache = False
model.config.pretraining_tp = 1

加载标记器

接下来,将从Hugginface加载标记器,并设置padding_side为“正确”,以修复fp16的问题。

tokenizer = AutoTokenizer.from_pretrained(base_model, trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right"

PEFT参数

预训练语言模型 (PLM) 的传统微调需要更新模型的所有参数,这在计算方面成本高昂,并且需要大量的数据。

参数高效微调 (PEFT) 的运作方式是仅更新模型中影响力最大的一小部分参数,借此显著提升模型的效率。可以阅读 PEFT 官方文档来了解相关参数。

peft_params = LoraConfig(lora_alpha=16,lora_dropout=0.1,r=64,bias="none",task_type="CAUSAL_LM",
)

训练参数

以下是可用于优化训练过程的超参数列表:

  • output_dir:输出目录是存储模型预测和检查点的地方。
  • num_train_epochs:一个训练时期。
  • fp16/bf16:禁用 fp16/bf16 训练。
  • per_device_train_batch_size:每个 GPU 的训练批次大小。
  • per_device_eval_batch_size:用于评估的每个 GPU 的批次大小。
  • Gradient_accumulation_steps:这指的是更新过程中累积梯度所需的步数。
  • Gradient_checkpointing:启用梯度检查点。
  • max_grad_norm:梯度剪裁。
  • learning_rate:初始学习率。
  • weight_decay:权重衰减适用于除偏差/LayerNorm权重之外的所有层。
  • Optim:模型优化器(AdamW 优化器)。
  • lr_scheduler_type:学习率计划。
  • max_steps:训练步数。
  • warmup_ratio:线性预热的步骤比率。
  • group_by_length:这可以显著提高性能并加速训练过程。
  • save_steps:每 25 个更新步骤保存检查点。
  • logging_steps:每 25 个更新步骤记录一次。
training_params = TrainingArguments(output_dir="./results",num_train_epochs=1,per_device_train_batch_size=4,gradient_accumulation_steps=1,optim="paged_adamw_32bit",save_steps=25,logging_steps=25,learning_rate=2e-4,weight_decay=0.001,fp16=False,bf16=False,max_grad_norm=0.3,max_steps=-1,warmup_ratio=0.03,group_by_length=True,lr_scheduler_type="constant",report_to="tensorboard"
)

模型微调

监督微调 (SFT) 是强化学习(基于人类反馈)的关键步骤。HuggingFace 的 TRL 库提供了一个使用便捷的 API,仅需几行代码就能创建 SFT 模型,并在数据集上开展训练。它附带了一些工具,可用来通过强化学习训练语言模型,流程是先从监督微调起步,接着进行奖励建模,最后实施近端策略优化 (PPO)。

将为 SFT Trainer 提供模型、数据集、Lora 配置、标记器以及训练参数。

trainer = SFTTrainer(model=model,train_dataset=dataset,peft_config=peft_params,dataset_text_field="text",max_seq_length=None,tokenizer=tokenizer,args=training_params,packing=False,
)

将使用.train()新的数据集对 Llama 2 模型进行微调。该模型完成 1 个 epoch 需要一个半小时。

在这里插入图片描述

模型训练完成后,将保存模型采用器和分词器,也可以使用类似的 API 将模型上传到 Hugging Face。

trainer.model.save_pretrained(new_model)
trainer.tokenizer.save_pretrained(new_model)

在这里插入图片描述

评估

现在可以在 Tensorboard 的交互式会话中查看训练结果。

from tensorboard import notebook
log_dir = "results/runs"
notebook.start("--logdir {} --port 4000".format(log_dir))

在这里插入图片描述

为了测试我们微调的模型,将使用transformers文本生成管道并提出一些简单的问题,例如“列奥纳多达芬奇是谁?”。

logging.set_verbosity(logging.CRITICAL)prompt = "Who is Leonardo Da Vinci?"
pipe = pipeline(task="text-generation", model=model, tokenizer=tokenizer, max_length=200)
result = pipe(f"<s>[INST] {prompt} [/INST]")
print(result[0]['generated_text'])

输出:

正如我们所见,得到了惊人的结果。

<s>[INST] Who is Leonardo Da Vinci? [/INST] Leonardo da Vinci (1452-1519) was an Italian polymath, artist, inventor, and engineer.Da Vinci is widely considered one of the greatest painters of all time, and his works include the famous Mona Lisa. He was also an accomplished engineer, inventor, and anatomist, and his designs for machines and flight were centuries ahead of his time.Da Vinci was born in the town of Vinci, Italy, and he was the illegitimate son of a local notary. Despite his humble origins, he was able to study art and engineering in Florence, and he became a renowned artist and inventor.Da Vinci's work had a profound impact on the Renaissance, and his legacy continues to inspire artists, engineers, and inventors to this day. He

再问一个问题

prompt = "What is Datacamp Career track?"
result = pipe(f"<s>[INST] {prompt} [/INST]")
print(result[0]['generated_text'])

输出:

Guanaco 是一个高质量的数据集,过去曾用于微调最先进的 LLM。Hugging Face 上提供了完整的 Guanaco 数据集,它有潜力在各种自然语言任务上取得更优异的表现。

<s>[INST] What is Datacamp Career track? [/INST] DataCamp Career Track is a program that offers a comprehensive learning experience to help you build your skills and prepare for a career in data science.The program includes a range of courses, projects, and assessments that are designed to help you build your skills in data science. You will learn how to work with data, create visualizations, and build predictive models.In addition to the technical skills, you will also learn how to communicate your findings to stakeholders and how to work with a team to solve complex problems.The program is designed to be flexible, so you can learn at your own pace and on your own schedule. You will also have access to a community of learners and mentors who can provide support and guidance throughout the program.Overall, DataCamp Career Track is a great way to build your skills and prepare for a career in

这是Colab Notebook,其中包含代码和输出,可帮助您完成编码之旅。

结论

本教程提供了全面的指南,指导您如何使用 QLoRA、PEFT 和 SFT 等技术对 LLaMA 2 模型进行微调,以克服内存和计算能力的限制。通过利用 Hugging Face 库(例如transformers、accelerate、peft、trl和bitsandbytes),我们能够在消费级 GPU 上成功微调 7B 参数的 LLaMA 2 模型。

总的来说,本教程举例说明了最近的进展如何实现大型语言模型的民主化和可访问性,甚至允许业余爱好者利用有限的资源构建最先进的人工智能。

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

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

相关文章

探秘明远智睿SSD2351开发板在HMI领域的独特魅力

人机界面&#xff08;HMI&#xff09;是人与机器进行交互的重要桥梁&#xff0c;其性能和用户体验直接影响到整个系统的使用效果。明远智睿的SSD2351开发板凭借其出色的性能和丰富的功能&#xff0c;在HMI领域展现出了独特的魅力。 SSD2351开发板的四核1.4GHz处理器具备强大的图…

Keysight万用表使用指南及基于Python采集数据生成Excel文件

文章目录 说明使用的库openpyxlpyvisa 代码说明效果展示参考代码 说明 本文介绍了 Keysight 34465A 的基本使用和 SCPI 指令设置&#xff0c;演示了使用 Python 的 PyVISA 库控制两台 34465A 同时采集数据的完整流程&#xff0c;包括设置采样参数、触发测量、读取数据、使用 O…

Docker 获取 Python 镜像操作指南

1. 安装 Docker 环境 1.1 上传安装脚本&#xff08;Windows → Linux&#xff09; 在 Windows 的 CMD 中执行&#xff1a; scp docker.sh root10.1.1.58:~ 可自行前往我的飞书下载docker.sh脚本 Docs 1.2 在 Linux 中检查文件 ls -l ~ # 确认 docker.sh 已上传到家目录…

JavaScript:从JS的执行机制到location对象

一、JS执行机制 &#xff08;1&#xff09;JS是单线程 JavaScript语言的一大特点就是单线程&#xff0c;也就是同一时间只能做一件事。因为JavaScript是为了处理页面中的用户交互&#xff0c;以及制作DOM二诞生的。比如我们对某个DOM元素进行添加和删除操作&#xff0c;这个不…

iVX:数字化转型全场景技术革新与生态构建实践

在数字经济蓬勃发展的当下&#xff0c;企业数字化转型需求日益迫切。iVX 凭借其独特的技术架构与创新解决方案&#xff0c;深度渗透工业互联网、元宇宙、智慧城市等领域&#xff0c;成为推动全场景数字化转型的重要力量。本文将重新梳理 iVX 的技术应用与生态价值&#xff0c;以…

生物化学笔记:神经生物学概论05 感受野 视觉中枢 高级视皮层中的信息走向

信息传递中的“击鼓传花” 新特性的突现 功能柱&#xff1a;简化节点 高级视皮层中的信息走向

StarRocks Lakehouse 如何重构大数据架构?

随着数据分析需求的不断演进&#xff0c;企业对数据处理架构的期望也在不断提升。在这一背景下&#xff0c;StarRocks 凭借其高性能的实时分析能力&#xff0c;正引领数据分析进入湖仓一体的新时代。 4 月 18 日&#xff0c;镜舟科技高级技术专家单菁茹做客开源中国直播栏目《…

【SpringBoot】基于mybatisPlus的博客系统

1.实现用户登录 在之前的项目登录中&#xff0c;我使用的是Session传递用户信息实现校验登录 现在学习了Jwt令牌技术后我尝试用Jwt来完成校验工作 Jwt令牌 令牌一词在网络编程一节我就有所耳闻&#xff0c;现在又拾了起来。 这里讲应用&#xff1a;令牌也就用于身份标识&a…

HCIP-security常见名词

缩略语英文全称解释3DESTriple Data Encryption Standard三重数据加密标准AESAdvanced Encryption Standard高级加密标准AHAuthentication Header报文认证头协议CACertification Authority证书颁发中心DESData Encryption Standard数据加密标准DHDiffie-Hellman密钥交换算法DPD…

合并多个Excel文件到一个文件,并保留格式

合并多个Excel文件到一个文件&#xff0c;并保留格式 需求介绍第一步&#xff1a;创建目标文件第二步&#xff1a;创建任务列表第三步&#xff1a;合并文件第四步&#xff1a;处理合并后的文件之调用程序打开并保存一次之前生成的Excel文件第五步&#xff1a;处理合并后的文件之…

TDengine 中的压缩设计

简介 机器设备产生的时序数据量大&#xff0c;直接存储成本非常高&#xff0c;所以需要使用压缩技术&#xff0c;尽可能减小体积。 TDengine 使用了列式存储&#xff0c;结合二级压缩技术&#xff0c;压缩率通常可以达到 20%&#xff0c;特殊情况下更能达到 5 % 以内&#xff…

深度学习涉及的数学与计算机知识总结

深度学习涉及的数学与计算机知识可总结为以下核心模块&#xff0c;结合理论与实践需求分为数学基础和计算机技能两大方向&#xff1a; 一、数学知识 线性代数 核心&#xff1a;矩阵运算&#xff08;乘法、转置、逆矩阵&#xff09;、向量空间、特征值与特征向量、奇异值分解&am…

javascript<——>进阶

一、作用域&#xff1a;变量可以被访问的范围 1.局部作用域 1.1函数作用域 在函数内部声明的变量&#xff0c;在函数内部被访问的&#xff0c;外部无法直接访问。 总结&#xff1a;1、函数内部声明的变量&#xff0c;在函数外部无法直接访问 2、函数的参数也是函数内部的局…

驱动开发硬核特训 · Day 25 (附加篇):从设备树到驱动——深入理解Linux时钟子系统的实战链路

一、前言 在嵌入式Linux开发中&#xff0c;无论是CPU、外设控制器&#xff0c;还是简单的GPIO扩展器&#xff0c;大多数硬件模块都离不开时钟信号的支撑。 时钟子系统&#xff08;Clock Subsystem&#xff09;&#xff0c;作为Linux内核中基础设施的一部分&#xff0c;为设备…

并发设计模式实战系列(7):Thread Local Storage (TLS)

&#x1f31f; 大家好&#xff0c;我是摘星&#xff01; &#x1f31f; 今天为大家带来的是并发设计模式实战系列&#xff0c;第七章Thread Local Storage (TLS)&#xff0c;废话不多说直接开始~ 目录 一、核心原理深度拆解 1. TLS内存模型 2. 关键特性 二、生活化类比&a…

时序数据库 TDengine × Perspective:你需要的可视化“加速器”

你有没有遇到这样的场景&#xff1a;数据已经写进数据库&#xff0c;图表却总是“慢半拍”&#xff1f;或是操作界面太卡&#xff0c;光是一个排序就能让你等到喝完一杯咖啡&#xff1f;当数据量越来越大、响应时间却越来越长&#xff0c;开发者和用户都不禁要问一句——就没有…

前端面试每日三题 - Day 19

这是我为准备前端/全栈开发工程师面试整理的第十一天每日三题练习&#xff0c;涵盖 JavaScript中WeakMap与内存管理的底层机制、Redux Toolkit的事件以及系统设计中的企业级表单引擎构建。通过这三道题&#xff0c;你将对现代前端开发中的关键概念有更深入的理解&#xff0c;并…

Antd Modal Drawer 更改默认项

当项目比较大使用了非常多的 Modal 和 Drawer 要是有需求一次性全部调整就会比较麻烦&#xff0c;目前 Antd 的 ConfigProvider 暂不支持&#xff08;也有可能我没找到&#xff0c;待大佬指证&#xff09;就比如由于默认 Modal Drawer 的遮罩层是可以点击关闭的&#xff0c;但是…

硬件工程师面试常见问题(8)

第三十六问&#xff1a;基尔霍夫定理的内容是什么&#xff1f; 基尔霍夫电流定理&#xff1a; 1. 内容&#xff1a;电路中任意一个节点上&#xff0c;在任意时刻&#xff0c;流入节电的电流之和等于流出节点的电流之和。 2. 表达式&#xff1a;根据上图写出节点电流定律的数学…

Elasticsearch 内存使用指南

作者&#xff1a;来自 Elastic Valentin Crettaz 探索 Elasticsearch 的内存需求以及不同类型的内存统计信息。 Elasticsearch 拥有丰富的新功能&#xff0c;帮助你为你的使用场景构建最佳搜索解决方案。浏览我们的示例笔记本了解更多信息&#xff0c;开始免费云试用&#xff0…