首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

微调并评估LLaMA 3的终极指南

作者:Jeffrey Ip

编译:ronghuaiyang

导读

不超过100行代码微调并评估LLM。

微调大型语言模型(LLM)相比于依赖如OpenAI的GPT模型等专有基础模型,带来了诸多益处。想一想,你可以获得低至十分之一的推理成本,每秒处理的token数量提高十倍,而且无需担心OpenAI在其API背后可能进行的任何隐晦操作。我们应该这样思考微调:不是考虑如何超越OpenAI或取代RAG,而是如何在特定应用场景下保持相同性能的同时,减少推理时间和成本。

但让我们面对现实吧,构建RAG应用程序的普通开发者对自己的能力缺乏信心,不知道如何微调LLM——收集训练数据很难,理解方法论也很困难,而评估微调模型更是不易。因此,微调成为了LLM实践者的最佳补剂。你会经常听到诸如“现在微调不是优先事项”,“我们会先尝试RAG,如果必要再转向微调”,以及经典的“已在规划路线图中”。但如果我告诉你,任何人都能在不到两小时内免费开始微调LLM,代码行数不超过100行呢?为什么不是两者兼得,而非要二选一?

在本文中,我将展示如何使用Hugging Face的transformers库微调LLaMA-3 8B模型,以及如何使用DeepEval评估你的微调模型,所有操作都在Google Colab中完成。

让我们直接进入正题。

什么是LLaMA-3以及微调?

LLaMA-3是Meta的第二代开源LLM系列,采用了优化的Transformer架构,提供8B和70B两种大小的模型,适用于各种NLP任务。虽然预训练的自回归模型如LLaMA-3在预测序列中的下一个token方面表现良好,但微调对于使模型响应符合人类预期是必要的。

机器学习中的微调涉及到在新数据上调整预训练模型的权重,通过在特定任务数据集上训练模型,以适应新输入,增强特定任务的性能。在微调LLaMA-3的情况下,这意味着给模型一组指令和响应,以使用指令微调,使其作为助手时更有用。微调之所以优秀,是因为你知道吗?仅训练LLaMA-3 8B模型,Meta就花费了130万GPU小时。

微调有两种不同的形式:

SFT(监督微调):LLMs在一组指令和响应上进行微调。模型的权重将被更新,以最小化生成输出与标记响应之间的差异。

RLHF(基于人类反馈的强化学习):LLMs被训练以最大化奖励函数(使用近端策略优化算法或直接偏好优化(DPO)算法)。该技术使用人类对生成输出的评价反馈,进而捕捉更复杂的人类偏好,但容易受到不一致的人类反馈的影响。

正如你可能已经猜到的,本文中我们将使用SFT来指令微调LLaMA-3 8B模型。

微调中的常见陷阱

劣质训练数据

前面对RLHF的陈述突显了一个非常重要的一点:当涉及到微调时,训练数据集的质量是最关键的因素。实际上,LIMA论文显示,在65B LLaMA(1)上使用1000个高质量样本进行微调可以胜过OpenAI的DaVinci003。

再考虑另一个例子,这是一个在14万条Slack消息上微调的gpt-3.5-turbo:

这确实挺搞笑的,但可能只是因为我没有从自己的LLM中得到这样的回应。

使用错误的提示模板

这实际上只在你使用了特定模型的情况下才重要,这些模型是在特定的提示模板上训练的,比如LLaMA-2的聊天模型。简而言之,Meta在训练LLaMA-2聊天模型时使用了以下模板,理想情况下,你需要将训练数据格式化为此格式。

[s][INST] [[SYS]]

System prompt

[[/SYS]]

User prompt [/INST] Model answer [/s]

基于以上原因,我们将使用mlabonne/guanaco-llama2–1k数据集进行微调。这是一个高质量的1000个指令-响应数据集(源自timdettmers/openassistant-guanaco数据集),已经按照LLaMA-2的提示模板重新格式化。

微调LLaMA-3的逐步指南

第一步  安装

首先,创建一个新的Google Colab笔记本。

然后,安装并导入所需的库:

!pip install transformers peft bitsandbytes trl deepeval

import os

import torch

from datasets import load_dataset

from transformers import (

AutoModelForCausalLM,

AutoTokenizer,

BitsAndBytesConfig,

TrainingArguments,

pipeline,

)

from peft import LoraConfig

from trl import SFTTrainer

在这里,我们使用来自Hugging Face和Confident AI生态系统的库:

transformers:用于加载模型、分词器等。

peft:执行参数高效微调。

bitsandbytes:设置4位量化。

trl:进行监督微调。

deepeval:评估微调后的LLaMA

第二步 量化设置

为了在LLaMA-3 8B微调期间优化Colab RAM使用,我们采用QLoRA(量化低秩近似)。以下是其关键原则的分解:

4位量化:QLoRA通过仅用4位(而非标准的32位浮点数)表示权重来压缩预训练的LLaMA-3 8B模型,这大大减少了模型的内存占用。

冻结预训练模型:量化后,LLaMA-3的绝大多数参数被冻结。这阻止了在微调过程中对核心模型的直接更新。

低秩适配器:QLoRA在模型架构中引入轻量级、可训练的适配器层。这些适配器在不显著增加参数数量的情况下捕获任务特定知识。

基于梯度的微调:在微调过程中,梯度流经冻结的4位量化模型,但仅用于更新低秩适配器中的参数。这种隔离优化极大地减少了计算开销。

下图是原始论文中QLoRA的可视化表示。

我们可以利用bitsandbytes来实现:

...

#################################

### Setup Quantization Config ###

#################################

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,

)

第三步 使用QLoRA配置加载LLaMA-3

这一步相当直接。我们将直接从Hugging Face加载LLaMA-3 8B模型。

请注意,尽管LLaMA-3是开源的,并且可以在Hugging Face上获取,但你需要向Meta发送请求以获得访问权限,这个过程通常需要长达一周的时间。

...

#######################

### Load Base Model ###

#######################

base_model_name = "meta-llama/Meta-Llama-3-8B"

llama_3 = AutoModelForCausalLM.from_pretrained(

base_model_name,

quantization_config=quant_config,

device_map={"": 0}

)

第四步 - 加载分词器

当一个大型语言模型读取文本时,它首先必须将文本转换为可读的格式。这一过程被称为分词,由分词器执行。

分词器通常是为其对应的模型设计的。复制以下代码来加载LLaMA-3的分词器:

...

######################

### Load Tokenizer ###

######################

tokenizer = AutoTokenizer.from_pretrained(

base_model_name,

trust_remote_code=True

)

tokenizer.pad_token = tokenizer.eos_token

tokenizer.padding_side = "right"

步骤5 加载数据集

正如前一节所述,我们将使用mlabonne/guanaco-llama2–1k数据集进行微调,因为它的数据标签质量高,并且与LLaMA-3的提示模板兼容。

...

####################

### Load Dataset ###

####################

train_dataset_name = "mlabonne/guanaco-llama2-1k"

train_dataset = load_dataset(train_dataset_name, split="train")

步骤6 为PEFT加载LoRA配置

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O-FC6-Ba0ENIhC-S3V5gIvdA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券