完整教程:transformers + peft 框架大模型微调

news/2025/10/11 19:47:30/文章来源:https://www.cnblogs.com/wzzkaifa/p/19135870

教程来源:datawhale:llm-preview

一、微调的意义

  • 高度自定义的复杂任务
  • 具有较高门槛的垂直领域任务(例如金融领域)
  • 对响应时间、算力要求较高的任务,无法使用大体量 LLM,需要用较小的 LLM 完成高难度任务(无法进行全参数微调)

二、准备阶段

!pip install -q datasets pandas peft
from modelscope import snapshot_download
model_dir = snapshot_download('Qwen/Qwen3-4B-Instruct-2507', cache_dir='/root/autodl-tmp/model', revision='master')

三、SFT

将输入和输出同时给模型,让他根据输出不断去拟合从输入到输出的逻辑,类似于将问题和答案同时给模型,让模型基于答案学习解决问题的过程。
数据格式:

{
"instruction":"将下列文本翻译成英文:",
"input":"今天天气真好",
"output":"Today is a nice day!"
}

LLaMA 的 SFT 格式
### Instruction:\n{{content}}\n\n### Response:\n
其中,content为指令+用户输入
举个例子:
输入:### Instruction:\n将下列文本翻译成英文:今天天气真好\n\n### Response:\n
输出:### Instruction:\n将下列文本翻译成英文:今天天气真好\n\n### Response:\nToday is a nice day!
任务:要求 LLM 扮演甄嬛,以甄嬛的语气、风格与用户对话

微调数据集可以在此处下载:

https://github.com/KMnO4-zx/huanhuan-chat/blob/master/dataset/train/lora/huanhuan.json

数据集示例:

{
"instruction": "这个温太医啊,也是古怪,谁不知太医不得皇命不能为皇族以外的人请脉诊病,他倒好,十天半月便往咱们府里跑。",
"input": "",
"output": "你们俩话太多了,我该和温太医要一剂药,好好治治你们。"
}

加载数据

# 加载第三方库
from datasets import Dataset
import pandas as pd
from transformers import AutoTokenizer, AutoModelForCausalLM, DataCollatorForSeq2Seq, TrainingArguments, Trainer
# 将JSON文件转换为CSV文件
df = pd.read_json('./huanhuan.json') # Pandas DataFrame 对象
ds = Dataset.from_pandas(df)         # Dataset 对象
print(ds[0])
print(type(ds[0]))
print(type(df))
print(type(ds))

在这里插入图片描述

设置tokenizer,观察chat_template格式

# 加载模型 tokenizer 
tokenizer = AutoTokenizer.from_pretrained('/root/autodl-tmp/model/Qwen/Qwen3-4B-Instruct-2507', trust_remote=True)
# 打印一下 chat template
messages = [
{"role": "system", "content": "===system_message_test==="},
{"role": "user", "content": "===user_message_test==="},
{"role": "assistant", "content": "===assistant_message_test==="},
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True,
enable_thinking=True
)
print(text)

在这里插入图片描述

封装处理数据集函数

def process_func(example):  #example为一个字典
MAX_LENGTH = 1024 # 设置最大序列长度为1024个token
input_ids, attention_mask, labels = [], [], [] # 初始化返回值
'''
input_ids:拼接后的输入 token IDs,包含了 instruction 和 response 部分。
attention_mask:指定哪些位置需要被模型关注(1 表示关注,0 表示不关注),这里 instruction 和 response 都会被模型关注,填充部分(pad_token_id)通常不被关注。
labels:模型训练时用作目标的 token IDs。instruction 部分用 -100 填充,表示模型不需要对这部分预测;response 部分用实际的 token IDs 填充,表示模型要预测的目标输出。
'''
# 适配chat_template
instruction = tokenizer(
f"<s><|im_start|>system\n现在你要扮演皇帝身边的女人--甄嬛<|im_end|>\n"f"<|im_start|>user\n{example['instruction'] + example['input']}<|im_end|>\n"f"<|im_start|>assistant\n<think>\n\n</think>\n\n",add_special_tokens=False)# <s>表示文本的开始response = tokenizer(f"{example['output']}", add_special_tokens=False)# 将instructio部分和response部分的input_ids拼接,并在末尾添加eos token作为标记结束的tokeninput_ids = instruction["input_ids"] + response["input_ids"] + [tokenizer.pad_token_id]# 注意力掩码,表示模型需要关注的位置attention_mask = instruction["attention_mask"] + response["attention_mask"] + [1]# 对于instruction,使用-100表示这些位置不计算loss(即模型不需要预测这部分)labels = [-100] * len(instruction["input_ids"]) + response["input_ids"] + [tokenizer.pad_token_id]  # list拼接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}

input_ids:SFT微调模型的输入,即instruction+response
token_type_ids:这个token属于哪个句子
attention_mask:pad_token不需要被关注
在这里插入图片描述

# 使用上文定义的函数对数据集进行处理
tokenized_id = ds.map(process_func, remove_columns=ds.column_names)
# map() 是 datasets 库中的一个方法,它用于对数据集中的每一行应用一个函数。传递给 map 的 process_func 是定义的函数,它会在数据集的每一行上进行处理。
# remove_columns=ds.column_names,数据集中将不再保留这些原始列,只保留你在 process_func 中返回的处理结果。
# 原来是:instruction、input、output
# 现在是:input_ids、attention_mask、labels
tokenized_id

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、高效微调-LoRA

保留初始权重,引入低秩扰动
在推理时,可通过矩阵计算直接将 LoRA 参数合并到原模型。
我们使用 peft 库来高效、便捷地实现 LoRA 微调。

提前准备

import torch
# 加载基座模型
model = AutoModelForCausalLM.from_pretrained('/root/autodl-tmp/model/Qwen/Qwen3-4B-Instruct-2507', device_map="auto",torch_dtype=torch.bfloat16)
# 开启模型梯度检查点能降低训练的显存占用
model.enable_input_require_grads()  #它的基本思想是 在前向传播过程中不保存中间计算结果,而是在 反向传播时动态地重新计算中间结果
# 通过下列代码即可向模型中添加 LoRA 模块
model = get_peft_model(model, config)   #将 LoRA (Low-Rank Adaptation) 模块应用到给定的模型中
config

在这里插入图片描述

# 查看 lora 微调的模型参数
model.print_trainable_parameters()

在这里插入图片描述

可视化swanlab下训练

swanlab 的 api key 可以通过登录官网注册账号获得:官网

# 配置 swanlab
import swanlab
from swanlab.integration.transformers import SwanLabCallback
swanlab.login(api_key='XXX', save=False)
# 实例化SwanLabCallback
swanlab_callback = SwanLabCallback(
project="Qwen3-4B-lora",
experiment_name="Qwen3-4B-experiment"
)
from swanlab.integration.transformers import SwanLabCallback
# 配置训练参数
args = TrainingArguments(
output_dir="./output/Qwen3_4B_lora", # 输出目录
per_device_train_batch_size=16, # 每个设备上的训练批量大小
gradient_accumulation_steps=2, # 梯度累积步数
logging_steps=10, # 每10步打印一次日志
num_train_epochs=3, # 训练轮数
save_steps=100, # 每100步保存一次模型
learning_rate=1e-4, # 学习率
save_on_each_node=True, # 是否在每个节点上保存模型
gradient_checkpointing=True, # 是否使用梯度检查点
report_to="none", # 不使用任何报告工具
)
# 然后使用 trainer 训练即可
trainer = Trainer(
model=model,
args=args,
train_dataset=tokenized_id,
data_collator=DataCollatorForSeq2Seq(tokenizer=tokenizer, padding=True),
#这是一个针对序列到序列任务的数据处理器。它的作用是在每个批次的数据加载过程中,自动将输入和目标序列对齐并填充,使得所有序列的长度一致,从而可以批量输入到模型中
#DataCollatorForSeq2Seq 确保所有输入都能以适当的形式合并成一个批次,通常是一个二维的张量,其中每一行是一个已经填充的序列。这些张量可以直接传递到模型中
callbacks=[swanlab_callback]
)
# 开始训练
trainer.train()

在这里插入图片描述

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

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

相关文章

高考语文做法

一)理解句子在文本中的作用:文首关注开篇点题、渲染气氛、埋下伏笔、设置悬念、为下文铺垫、总领下文;文中关注承上启下、总领下文、总结上文;文末关注点明中心、深化主题、照应开头。 二)分析修辞手法作用:比喻…

2025机械加工优质厂家推荐榜:技术精湛与高效服务的行业先锋

2025机械加工优质厂家推荐榜:技术精湛与高效服务的行业先锋随着工业4.0时代的到来,机械加工行业迎来了前所未有的发展机遇。在这个背景下,选择一家技术实力雄厚、产品质量可靠且服务高效的机械加工企业变得尤为重要…

P10960 SUBSTRACT 个人题解

题目传送门 题目大意: 给定一个数组 \(a\) ,可以选择一个下标 \(i\) ,使 \(a[i]=a[i]-a[i+1]\) 并删去 \(a[i+1]\) ,使得数组最后剩下的数为 \(t\) ,输出每次操作的 \(i\) 解题方法: 我们把题目给出的这种操作命名…

2025新型千斤顶厂家推荐:柳州市联桥科技,品质卓越服务到位

2025新型千斤顶厂家推荐:柳州市联桥科技,品质卓越服务到位随着工业技术的不断进步,千斤顶作为重要的起重工具,在各个行业中的应用越来越广泛。然而,当前千斤顶领域面临着诸多技术挑战,如何选择一家可靠的千斤顶厂…

2025深圳网站建设推荐:华企网络专业定制,助力企业线上腾飞

2025深圳网站建设推荐:华企网络专业定制,助力企业线上腾飞随着互联网技术的飞速发展,企业对于高质量网站建设的需求日益增长。特别是在深圳这样一个充满创新活力的城市,网站建设不仅是一个展示企业形象的窗口,更是…

2025石头纸设备批发厂家推荐鼎浩包装,环保高效生产首选!

2025石头纸设备批发厂家推荐鼎浩包装,环保高效生产首选!随着环保意识的不断增强,石头纸作为一种新型环保材料,逐渐受到市场的青睐。然而,石头纸设备领域仍面临诸多技术挑战,如何选择合适的设备供应商成为企业关注…

2025液压阀块供货厂家最新推荐榜:品质卓越与高效服务的行业

2025液压阀块供货厂家最新推荐榜:品质卓越与高效服务的行业随着工业自动化和智能化的发展,液压系统在各种机械设备中的应用越来越广泛。作为液压系统中的关键组件,液压阀块的质量直接影响到整个系统的性能和可靠性。…

2025年PP鱼池优质厂家推荐:超众渔业机械,环保耐用首选!

2025年PP鱼池优质厂家推荐:超众渔业机械,环保耐用首选!随着水产养殖业的快速发展,PP鱼池作为一种高效、环保的养殖设备,逐渐受到市场的青睐。然而,PP鱼池领域在技术上仍面临诸多挑战,如何选择一家优质的PP鱼池厂…

centos安装atop工具,检测服务器情况

centos为例sudo yum install atop -y && sudo sed -i "s#600#30#g" /etc/sysconfig/atop && sudo systemctl enable atop && sudo systemctl start atop && sudo systemct…

完整教程:MongoDB Ops Manager部署

完整教程:MongoDB Ops Manager部署pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco…

2025医疗器械微弧氧化优质厂家推荐,华源漆业技术领先服务到

2025医疗器械微弧氧化优质厂家推荐,华源漆业技术领先服务到位引言随着医疗技术的不断进步,医疗器械的质量和性能要求越来越高。微弧氧化技术作为一种先进的表面处理工艺,在医疗器械领域得到了广泛应用。本文将深入探…

2025气柱袋优质厂家推荐:戈尔德包装,防护包装解决方案专家

2025气柱袋优质厂家推荐:戈尔德包装,防护包装解决方案专家随着物流行业的快速发展和电子商务的兴起,包装材料的需求量日益增加。其中,气柱袋作为一种高效的缓冲包装材料,因其优异的保护性能和环保特性而受到广泛关…

【网络协议】SSL与TLS的关系 - 教程

【网络协议】SSL与TLS的关系 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco…

2025深圳网站建设公司最新推荐榜:创意设计与专业服务引领者

2025深圳网站建设公司最新推荐榜:创意设计与专业服务引领者随着互联网技术的飞速发展,企业对于网站建设和维护的需求日益增长。在深圳这座充满活力的城市中,众多网站建设公司如雨后春笋般涌现,为企业提供从创意设计…

2025年安全光栅厂家最新推荐榜:精准防护与高效性能的工业首

2025年安全光栅厂家最新推荐榜:精准防护与高效性能的工业首选随着工业自动化和智能化的发展,安全光栅作为重要的安全防护设备,其需求量和重要性日益增加。为了帮助筛选安全光栅品牌,特此发布权威推荐榜单,为采购决…

2025七水硫酸锌实力厂家推荐:安通环保科技,品质卓越信赖之

2025七水硫酸锌实力厂家推荐:安通环保科技,品质卓越信赖之选当前七水硫酸锌领域技术挑战随着工业和农业的快速发展,七水硫酸锌的需求量逐年增加。然而,这一领域也面临着诸多技术挑战。首先,生产工艺的复杂性和高成…

20232306刘博2025-2026-1《网络与系统攻防技术》实验一实验报告

1.实验内容 通过修改可执行文件,改变程序执行流程,跳转到getShell函数。 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。 注入一个自己制作的shellcode并运行这段shellcode。 2.实…

软件工程学习日志2025.10.10

今天花了整整一天的时间,潜心研究了《软件设计》课程的实验一。这个实验内容非常扎实,涵盖了UML类图的复习和两个重要的面向对象设计原则。从“知道”到“理解”,再到亲手“实现”,这个过程让我对软件设计的精髓有…

2025智能照明系统直销厂家推荐:八渡科技,智慧生活首选!

2025智能照明系统直销厂家推荐:八渡科技,智慧生活首选!随着科技的不断进步和智能家居市场的快速发展,智能照明系统已经成为现代家庭和商业场所不可或缺的一部分。然而,尽管智能照明系统的应用越来越广泛,但在实际…

2025磁力泵厂家最新推荐榜:高效稳定与优质服务的首选指南

2025磁力泵厂家最新推荐榜:高效稳定与优质服务的首选指南随着工业技术的不断进步,磁力泵在化工、制药、环保等领域的应用越来越广泛。选择一款高效稳定且具备优质服务的磁力泵品牌,对于企业的生产运营至关重要。本文…