基于huggingface的peft高效微调Lora示例

from transformers import TrainingArguments,Trainer,DataCollatorForSeq2Seq
from peft import LoraConfig,get_peft_model,TaskType


config = LoraConfig(task_type=TaskType.CAUSAL_LM, 
                    target_modules="all-linear", #调整所有线性层
                    modules_to_save=["word_embeddings"] #调整词嵌入层 
                    )
model = get_peft_model("你加载的大模型", config)

training_args = TrainingArguments(
    output_dir="你的权重存放路径",
    per_device_train_batch_size=10,
    gradient_accumulation_steps=1, # 多少次batch更新一次梯度
    gradient_checkpointing=True,
    num_train_epochs=6,
    save_steps=100,
    optim="paged_adamw_32bit"
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset="你加载的预处理dataset",
    data_collator=DataCollatorForSeq2Seq(tokenizer=tokenizer,padding=True)
)

trainer.train()

训练完成后,Lora增量模型的加载和合并

from peft import PeftModel

peft_model = PeftModel.from_pretrained(model="你加载的大模型", model_id="你训练的模型权重路径")
peft_model = peft_model.merge_and_unload()
peft_model.save_pretrained("整合后的模型保存路径")

至此,合并结束!

LoRA(Low-Rank Adaptation)是一种高效微调技术,主要用于大型语言模型的自适应调整。它通过仅更新低秩矩阵的方式来大幅减少参数量并提高训练效率。下面是一个简单的 LoRA 微调代码示例,假设我们使用的是 Hugging Face 的 `transformers` 库和 PyTorch 框架。 ### 环境准备 首先确保已经安装了必要的库: ```bash pip install transformers torch datasets evaluate ``` ### 示例数据集加载 这里我们将采用 GLUE 数据集中的 MRPC 分类任务作为例子。 ```python from datasets import load_dataset, load_metric # 加载MRPC数据集 dataset = load_dataset("glue", "mrpc") metric = load_metric('glue', 'mrpc') ``` ### 定义 LoRA 配置及模型初始化 对于支持 LoRA 的模型,通常需要指定哪些层应用 LoRA 修改,并设置相应的超参数如秩数 (`r`) 和 alpha 值等。 ```python import torch from transformers import BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments model_name = "bert-base-uncased" tokenizer = BertTokenizer.from_pretrained(model_name) # 导入LoRA模块 from peft import LoraConfig, get_peft_model config = LoraConfig( r=8, # 秩数,默认值为8 lora_alpha=16, target_modules=["query", "value"], # 要修改的层名称列表 lora_dropout=0.1, ) base_model = BertForSequenceClassification.from_pretrained(model_name, num_labels=2) lora_model = get_peft_model(base_model, config) # 将基础模型转化为含LoRA组件的形式 print(lora_model.print_trainable_parameters()) # 打印可训练参数信息 ``` ### 数据预处理函数 接下来我们需要定义一个函数来编码文本输入并对齐标签。 ```python def preprocess_function(examples): return tokenizer(examples['sentence1'], examples['sentence2'], truncation=True, padding='max_length') encoded_datasets = dataset.map(preprocess_function, batched=True) train_dataset = encoded_datasets["train"].shuffle(seed=42).select([i for i in list(range(16))]) # 取一部分样本用于演示 eval_dataset = encoded_datasets["validation"] ``` ### 训练设置与启动 配置 `Trainer API` 并开始训练。 ```python training_args = TrainingArguments( output_dir='./results', evaluation_strategy="epoch", learning_rate=5e-5, per_device_train_batch_size=8, per_device_eval_batch_size=8, weight_decay=0.01, save_total_limit=3, num_train_epochs=3, fp16=False if not torch.cuda.is_available() else True # 如果GPU可用则启用混合精度加速 ) trainer = Trainer( model=lora_model, args=training_args, train_dataset=train_dataset, eval_dataset=eval_dataset, compute_metrics=lambda p: metric.compute(predictions=p.predictions.argmax(-1), references=p.label_ids), ) trainer.train() ``` 以上就是一个完整的基于 BERT 架构的语言模型利用 LoRA 技术进行微调的过程展示。你可以根据实际情况调整使用的模型和其他细节选项。 如果你希望进一步了解如何优化此过程或解决遇到的问题,请随时提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值