浅谈Llama3.1,从结构、训练过程、影响到数据合成

微调大型语言模型(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配置

我不会深入探讨QLoRA和LoRA之间的详细差异,但LoRA本质上是QLoRA的内存效率较低的版本,因为它不使用量化,但可能会产生略微更高的准确性。(你可以在这里阅读更多关于LoRA的信息。)

在这个步骤中,我们为参数高效微调(PEFT)配置LoRA,与常规微调所有模型参数不同,PEFT只更新一小部分参数。

...

#########################################
### Load LoRA Configurations for PEFT ###
#########################################
peft_config = LoraConfig(
    lora_alpha = 16
    lora_dropout=0.1,
    r=64,
    bias="none",
    task_type="CAUSAL_LM",
)
步骤7 设置训练参数和SFT微调参数

我们即将完成,剩下的是设置训练所需的参数以及训练器的监督微调(SFT)参数:

...

##############################
### Set Training Arguments ###
##############################
training_arguments = TrainingArguments(
    output_dir="./tuning_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"
)


##########################
### Set SFT Parameters ###
##########################
trainer = SFTTrainer(
    model=llama_3,
    train_dataset=train_dataset,
    peft_config=peft_config,
    dataset_text_field="text",
    max_seq_length=None,
    tokenizer=tokenizer,
    args=training_arguments,
    packing=False,
)

我将不解释这些参数的具体含义,但如果感兴趣,你可以查阅Hugging Face的文档:

  • TrainerArguments API参考
  • SFTTrainer API参考
步骤8—开始微调并保存模型

运行以下代码开始微调:

...

#######################
### Fine-Tune Model ###
#######################
trainer.train()

你应该预计训练将持续长达一个小时。在此期间,这里有一张野生骆马派对的图片来为你解闷 😃

在这里插入图片描述

一旦微调完成,保存你的模型和分词器,你就可以立即开始测试微调后模型的效果!

...

##################
### Save Model ###
##################
new_model = "tuned-llama-3-8b"
trainer.model.save_pretrained(new_model)
trainer.tokenizer.save_pretrained(new_model)

#################
### Try Model ###
#################
prompt = "What is a large language model?"
pipe = pipeline(
  task="text-generation", 
  model=llama_3, 
  tokenizer=tokenizer, 
  max_length=200
)
result = pipe(f"[s][INST] {prompt} [/INST]")
print(result[0]['generated_text'])

使用DeepEval评估微调后的LLM

我知道你在想什么(或者至少我希望我知道)。你可能期待着在类似tensorboard的工具上看到微调过程中的损失曲线图,但幸运的是,我不会用这种“评估”方式来让你感到枯燥。相反,我们将使用DeepEval,一个针对LLM的开源评估框架。

既然我们微调LLaMA-3 8B是为了使其作为助手更加有用,我们将根据三个指标来评估我们的模型:偏见、毒性以及帮助性。在DeepEval中,这些指标是通过精心设计的提示工程和诸如QAG和G-Eval等框架结合使用LLM来评估的。

对于感兴趣的人,这里有一篇很好的文章,讲述了为什么我们使用LLM作为评估者的理论依据。首先,设置你的OpenAI API密钥,并定义LLM评估指标:

%env OPENAI_API_KEY=your-openai-api-key
from deepeval.metrics import GEval, BiasMetric, ToxicityMetric
from deepeval.test_case import LLMTestCaseParams

helpfulness_metric = GEval(
    name="Helpfulness",
    criteria="Helpfulness - determine if how helpful the actual output is in response with the input.",
    evaluation_params=[LLMTestCaseParams.INPUT, LLMTestCaseParams.ACTUAL_OUTPUT],
    threshold=0.5
)
bias_metric = BiasMetric(threshold=0.5)
toxicity_metric = ToxicityMetric(threshold=0.5)

DeepEval的指标返回一个分数(0-1),并提供评分的理由。只有当计算出的分数超过阈值(根据不同的指标,这可能是最大或最小阈值)时,指标才被认为是成功的。

最后,通过使用DeepEval的合成数据生成器创建测试案例,来创建一个你想要评估模型输出的输入列表:

from deepeval.synthesizer import Synthesizer
from deepeval.test_case import LLMTestCase
...

synthesizer = Synthesizer()
synthesizer.generate_goldens_from_docs(
  # Generate queries from your documents
    document_paths=['example_1.txt', 'example_2.docx', 'example_3.pdf'],
    max_goldens_per_document=2
)

pipe = pipeline(
  task="text-generation", 
  model=llama_3, 
  tokenizer=tokenizer, 
  max_length=200
)

test_cases = []
for golden in synthesizer.synthetic_goldens:
  actual_output = pipe(f"[s][INST] {input} [/INST]")[0]['generated_text']
  test_case = LLMTestCase(input=golden.input, acutal_output=actual_output)
  test_cases.append(test_case)

我们为了简单起见硬编码了输入,但你已经明白了要点。最后,使用你之前定义的LLM评估指标来创建并评估你的数据集:

from deepeval.dataset import EvaluationDataset
...

evaluation_dataset = EvaluationDataset(test_cases=test_cases)
evaluation_dataset.evaluate([bias_metric, helpfulness_metric, toxicity_metric])

就这样完成了!恭喜你坚持到了本教程的结尾,但有了这样的设置,你将能够添加更多的指标和测试案例,进一步评估和迭代你的微调过的LLaMA-3。

附言。 DeepEval还与Hugging Face集成,允许在微调期间进行实时评估。

结论

在这篇文章中,我们探讨了LLaMA-3是什么,为什么你应该进行微调及其所涉及的内容,以及在微调时需要注意的事项,包括使用正确的数据集,以及将其格式化以适应基础模型训练时使用的提示模板。

我们也看到了如何利用Hugging Face生态系统,在Google Colab笔记本中无缝执行微调,使用如QLoRA等量化技术。最后,我们了解到如何使用DeepEval来评估微调后的模型。我们已经为你完成了所有艰难的工作,并提供了一个完整的生态系统,用于LLM的微调评估。

如何系统的去学习大模型LLM ?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

事实上,抢你饭碗的不是AI,而是会利用AI的人。

科大讯飞、阿里、华为等巨头公司发布AI产品后,很多中小企业也陆续进场!超高年薪,挖掘AI大模型人才! 如今大厂老板们,也更倾向于会AI的人,普通程序员,还有应对的机会吗?

与其焦虑……

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高。

针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)👈

一、LLM大模型经典书籍

AI大模型已经成为了当今科技领域的一大热点,那以下这些大模型书籍就是非常不错的学习资源。

在这里插入图片描述

二、640套LLM大模型报告合集

这套包含640份报告的合集,涵盖了大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(几乎涵盖所有行业)

在这里插入图片描述

三、LLM大模型系列视频教程

在这里插入图片描述

四、LLM大模型开源教程(LLaLA/Meta/chatglm/chatgpt)

在这里插入图片描述

LLM大模型学习路线

阶段1:AI大模型时代的基础理解

  • 目标:了解AI大模型的基本概念、发展历程和核心原理。

  • 内容

    • L1.1 人工智能简述与大模型起源
    • L1.2 大模型与通用人工智能
    • L1.3 GPT模型的发展历程
    • L1.4 模型工程
    • L1.4.1 知识大模型
    • L1.4.2 生产大模型
    • L1.4.3 模型工程方法论
    • L1.4.4 模型工程实践
    • L1.5 GPT应用案例

阶段2:AI大模型API应用开发工程

  • 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。

  • 内容

    • L2.1 API接口
    • L2.1.1 OpenAI API接口
    • L2.1.2 Python接口接入
    • L2.1.3 BOT工具类框架
    • L2.1.4 代码示例
    • L2.2 Prompt框架
    • L2.3 流水线工程
    • L2.4 总结与展望

阶段3:AI大模型应用架构实践

  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。

  • 内容

    • L3.1 Agent模型框架
    • L3.2 MetaGPT
    • L3.3 ChatGLM
    • L3.4 LLAMA
    • L3.5 其他大模型介绍

阶段4:AI大模型私有化部署

  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。

  • 内容

    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景

这份 LLM大模型资料 包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)👈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值