前言
之前写三篇关于LoRA微调的一些基础知识,分别如下:
LoRA微调基础知识点
LoRA微调模型结构可训参数和配置详解
LoRA训练推理部署流程
本文主要是基于bert-chinese-base
模型采用LoRA微调技术,进行10分类的一个微调过程。
由于LoRA是一种高效的预训练大模型微调技术,在模型选择方面BERT
显然算不上什么大模型,但是可以学习LoRA微调的整个过程,BERT
也可以进行全量的参数训练,便于比较微调和重训练的区别。
完整代码
如果对你有烦请帮我点个star,非常感谢~~
LoRA微调核心代码
LoRA微调的代码还是很简洁的,只需要在原始模型的某层(Linear层)增加额外的配置即可。
config = LoraConfig(
task_type=TaskType.SEQ_CLS,
target_modules=["query", "key", "value"],
inference_mode=False,
r=8,
lora_alpha=32,
lora_dropout=0.1
)
model = get_peft_model(model, config)
核心超参数如下:
task_type:任务类型,例如序列分类(SEQ_CLS)。
r: LoRA模型中新增加的权重矩阵的秩。
lora_alpha:控制LoRA模块中缩放因子的大小,default=8 (peft==0.5.0)。
lora_dropout:LoRA模块中的dropout。
inference_mode:False为模型处于训练模式,LoRA 层会进行更新,反之LoRA层不更新(推理使用)。
完整训练代码如下:
import pandas as pd
from transformers import BertTokenizerFast, BertForSequenceClassification, Trainer, TrainingArguments
import torch
from torch.utils.data import Dataset
import model_config
from peft import get_peft_model, LoraConfig, TaskType
import time
train_data_path = model_config.train_data_path
dev_data_path = model_config.dev_data_path
train_data = pd.read_csv(train_data_path)
train_texts = train_data["0"].tolist()
train_labels = train_data["1"].tolist()
dev_data = pd.read_csv(dev_data_path)
eval_texts = dev_data["0"].tolist()
eval_labels = dev_data["1"].tolist()
# 分类标签数
num_labels = len(set(train_labels))
# 预训练模型,加载原始bert模型
model_name = model_config.model_name_tokenizer_path
tokenizer = BertTokenizerFast.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=num_labels)
# 对文本进行编码
# 入参详解 请参考 https://blog.csdn.net/weixin_42924890/article/details/139269528
train_encodings = tokenizer(train_texts, truncation=True, padding=True, max_length=64)
eval_encodings = tokenizer