大模型微调 | 微调的主要方法,微调的关键步骤,微调实战(使用peft进行Fine Tuning)

一、大模型微调简介

大模型(Large Language Models, LLMs)通常是指模型参数量极大的深度学习模型,能够理解和生成人类语言,在大量的文本数据上进行训练,可以执行广泛的任务。

我们首先会想为什么要进行大模型微调,这是因为大模型的训练成本极其高昂,同时大模型的知识库有其滞后性,以及希望在特定任务上的能力能够得到提升。为此,微调(Fine-tuning)成为了一种重要手段,其借鉴于计算机视觉模型的迁移学习,这是一个非常伟大的想法。总之,通过对预训练模型进行针对性调整,我们可以使其适应具体应用场景,那么更新大模型知识的方法除了微调这一种,还有一种叫RAG(增强检索生成),这就是后话了。

二、微调的主要方法

2.1 全量微调(Full Fine-tuning)

  • 描述:对预训练模型的所有参数都进行更新
  • 优点:灵活性高
  • 缺点:需要较大的计算资源
  • 使用场景:目标任务数据量大且计算资源充足(一般不使用)

2.2 指令微调(Instruction Tuning)

  • 描述:用在特定任务任务下的明确指令和示例也对大模型进行微调,不更新模型知识
  • 优点:专注于特定任务的微调,保留了模型的基础能力
  • 缺点:限制较大,无法充分发挥模型能力

2.3 参数高效微调(Parameter-Efficient Fine-tuning,PEFT)

参数高效微调有以下几种,我们后续会主要实战lora微调,其他的将在后续的文章的里更新。

2.3.1 Adapter Tuning
  • 描述:在模型的每一层插入小型的适配模块,仅训练这些模块的参数
2.3.2 Prompt Tuning
  • 描述:通过优化提示(prompt)而非模型参数来引导模型输出
2.3.3 Prefix Tuning
  • 描述:在模型输入前添加一个连续的且任务特定的向量序列称之为prefix,固定PLM的所有参数,只更新优化特定的任务的prefix
2.3.4 LoRA (Low-Rank Adaptation)
  • 描述:通过低秩分解的方式更新模型权重,显著减少了需要训练的参数数量。

三、微调的关键步骤

3.1 数据准备

我们要收集与目标任务相关的标注数据。本篇文章将使用alpaca_gpt4_data_zh.json数据集进行微调。

3.2 模型选择

我们要选择适合任务需求的预训练模型,其中Qwen系列的模型在各个尺寸上的都比较齐全,为方便演示本次演示将使用qwen2.5-0.5b

3.3 超参数设置

我们要确定学习率、批量大小、训练轮数等超参数,但这些都需要我们进行大量的实践,也就是说,什么样的超参数会更好,更多的是根据实验人员的经验来设置的。

3.4 训练与验证

在训练集上进行微调,此次训练会使用huggingface的库peft

3.5 模型评估与部署

在测试集上全面评估模型性能,确保其满足实际应用需求。

四、微调实战

4.1 实验环境

  • NVIDIA RTX 3060 (12GB)显存
  • transformers==4.46.3
  • peft==0.14.0
  • datasets

4.2 安装依赖

pip install transformers  
pip install peft

4.3 准备数据集

from datasets import load_dataset
dataset = load_dataset('json', data_files='alpaca_gpt4_data_zh.json')
# dataset["train"].save_to_disk("alpaca_gpt4_data_zh")
dataset = dataset["train"].train_test_split(test_size=0.1)

4.4 加载预训练模型和分词器

# 模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('Qwen/Qwen2.5-0.5B-Instruct')
import torch
import transformers
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained(model_dir)
# 设置精度为float16
model = AutoModelForCausalLM.from_pretrained(model_dir, torch_dtype=torch.float16)
# 将模型参数迁移到GPU
model = model.cuda()
# 打印模型结构
print(model)

4.5 配置LoRA

from peft import LoraConfig, get_peft_model, set_peft_model_state_dict, get_peft_model_state_dict, TaskType
lora_r = 32
lora_alpha=16
target_modules=["q_proj", "k_proj", "v_proj"]
loraconfig = LoraConfig(
    r=lora_r,
    lora_alpha=16,
    target_modules=target_modules,
    task_type=TaskType.CAUSAL_LM
)
model = get_peft_model(model,loraconfig)

4.6 数据预处理

def generate_tokenize(one):
    MAX_LENGTH = 256
    input_ids,attention_mask,labels = [],[],[]
    instruction = tokenizer("\n".join(["Human: "+ one["instruction"],one["input"]]).strip() + "\n\nAssistant: ")
    response = tokenizer(one["output"] + tokenizer.eos_token)
    input_ids = instruction["input_ids"] + response["input_ids"]
    attention_mask = instruction["attention_mask"] + response["attention_mask"]
    labels = [-100] * len(instruction["input_ids"]) + response["input_ids"]
    if len(input_ids) > MAX_LENGTH:
        input_ids = input_ids[:MAX_LENGTH]
        attention_mask = attention_mask[:MAX_LENGTH]
        labels = labels[:MAX_LENGTH]
    return {
        "input_ids": input_ids,
        "attention_mask": attention_mask,
        "labels": labels
    }

tokenizer_dataset = dataset.map(generate_tokenize, remove_columns=dataset['train'].column_names)
train_data = tokenizer_dataset['train']
val_data = tokenizer_dataset['test']

4.7 微调模型

from transformers import TrainingArguments, Trainer, DataCollatorForSeq2Seq

args = TrainingArguments(
    output_dir="./lora_ft",
    per_device_train_batch_size=8,
    logging_steps=10,
    num_train_epochs=1,
    fp16=True,
)

trainer = Trainer(
    model=model,
    args=args,
    train_dataset=train_data,
    data_collator=DataCollatorForSeq2Seq(tokenizer=tokenizer, padding=True),
)

trainer.train()

4.8 加载原有模型并合并训练完得到的权重

from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
# 模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('Qwen/Qwen2.5-0.5B-Instruct')

tokenizer = AutoTokenizer.from_pretrained(model_dir)
model = AutoModelForCausalLM.from_pretrained(model_dir, torch_dtype=torch.float16)
model = model.cuda()

from peft import PeftModel
lora_model = PeftModel.from_pretrained(model, model_id="lora_ft/checkpoint-5492")

prompt = tokenizer("Human: {}\n{}".format("生成一个人们去野营旅行可能需要的十件物品的清单。", "").strip() + "\n\nAssistant: ", return_tensors="pt").to(model.device)
response = tokenizer.decode(lora_model.generate(**prompt,max_length=256,do_sample=False)[0],skip_special_tokens=True)
print(response)

4.9 保存微调后的模型

output\_model\_dir = "merge\_model"  
mergemodel = lora\_model.merge\_and\_unload()  
mergemodel.save\_pretrained(output\_model\_dir)  
tokenizer.save\_pretrained(output\_model\_dir)

4.10 使用微调后的模型

from transformers import AutoModelForCausalLM, AutoTokenizer  
model\_dir = "merge\_model"  
  
tokenizer = AutoTokenizer.from\_pretrained(model\_dir)  
model = AutoModelForCausalLM.from\_pretrained(model\_dir)  
model = model.cuda()  
  
prompt = "生成一个人们去野营旅行可能需要的十件物品的清单。"  
  
messages = \[  
    {"role": "system", "content": "You are a helpful assistant."},  
    {"role": "user", "content": prompt}  
\]  
  
text = tokenizer.apply\_chat\_template(  
    messages,  
    tokenize\=False,  
    add\_generation\_prompt\=True  
)  
  
model\_inputs = tokenizer(\[text\], return\_tensors\="pt").to(model.device)  
  
generated\_ids = model.generate(  
    \*\*model\_inputs,  
    max\_new\_tokens\=512  
)  
  
generated\_ids = \[  
    output\_ids\[len(input\_ids):\] for input\_ids, output\_ids in zip(model\_inputs.input\_ids, generated\_ids)  
\]  
  
response = tokenizer.batch\_decode(generated\_ids, skip\_special\_tokens\=True)\[0\]  
print(response)

在这里插入图片描述

本次微调大概需要25分钟,还是很快的,同时也会发现微调后针对同一个问题回答的效果更好了,当然这只是一个小的实验,仍然有很多工作可以去做,下面是微调前和微调后的对比。

微调前

在这里插入图片描述

微调后

在这里插入图片描述

五、参考资料

  • PEFT官网:https://hugging-face.cn/docs/peft/index
  • transformer参考博客:https://jalammar.github.io/illustrated-transformer/
  • lora论文:https://arxiv.org/abs/2106.09685
  • 使用 PEFT 进行提示微调:https://huggingface.co/learn/cookbook/zh-CN/prompt_tuning_peft

六、如何系统学习掌握AI大模型?

AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。

学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。

这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享

1. 成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。

在这里插入图片描述

2. 大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

在这里插入图片描述

3. 大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

在这里插入图片描述

4. 2024行业报告

行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

在这里插入图片描述

5. 大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

在这里插入图片描述

6. 大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

在这里插入图片描述

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方优快云官方认证二维码,免费领取【保证100%免费

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值