使用LoRA 对千问70B模型进行微调
要使用 LoRA 对已经下载的模型进行微调,可以通过 PEFT
(Parameter-Efficient Fine-Tuning)库来实现。以下是具体的步骤。
1. 安装必要的库
确保你已经安装了 transformers
和 peft
(用于 LoRA 微调)库:
pip install transformers peft
2. 加载模型和配置 LoRA 微调
下面的代码将展示如何加载已经下载的模型,并在 LoRA 配置下进行微调。
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
from peft import LoraConfig, get_peft_model
from datasets import load_dataset# 加载模型和分词器
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen-72B-Chat", trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen-72B-Chat", trust_remote_code=True)# 配置 LoRA 微调
lora_config = LoraConfig(r=8, # LoRA 矩阵的秩(可以调整以适应显存)lora_alpha=16, # LoRA 层的缩放因子target_modules=["q_proj", "v_proj"], # LoRA 目标层,可以根据模型结构调整lora_dropout=0.1, # Dropout 概率,防止过拟合bias="none" # 设置为 "none" 不引入额外的偏置项
)# 将模型转换为 LoRA 微调模型
model = get_peft_model(model, lora_config)# 打印模型层,确认 LoRA 层是否成功添加
model.print_trainable_parameters()
3. 准备数据集
可以选择开源数据集或自定义数据集。这里以 wikitext
数据集为例:
# 加载示例数据集
dataset = load_dataset("wikitext", "wikitext-2-raw-v1", split="train")# 定义数据预处理函数
def preprocess_function(examples):return tokenizer(examples["text"], padding="max_length", truncation=True, max_length=512)# 预处理数据集
tokenized_dataset = dataset.map(preprocess_function, batched=True)
4. 配置训练参数
设置微调的训练参数,如 batch size、学习率、epoch 等。
training_args = TrainingArguments(output_dir="./lora_finetuned_qwen", # 输出路径per_device_train_batch_size=1, # 每个 GPU 上的 batch sizegradient_accumulation_steps=8, # 梯度累积步数num_train_epochs=3, # 训练轮次learning_rate=2e-4, # 学习率fp16=True, # 启用混合精度logging_steps=10, # 日志打印间隔save_steps=100, # 模型保存间隔save_total_limit=2, # 最多保存模型数量
)
5. 开始训练
使用 Trainer
进行微调。
trainer = Trainer(model=model,args=training_args,train_dataset=tokenized_dataset,
)# 开始训练
trainer.train()
6. 保存微调后的模型
训练完成后,将微调后的模型保存到指定的文件夹中。
model.save_pretrained("./lora_finetuned_qwen")
tokenizer.save_pretrained("./lora_finetuned_qwen")
7. 加载和推理
微调完成后,可以加载微调后的模型并进行推理。
from transformers import AutoModelForCausalLM, AutoTokenizer# 加载微调后的模型
model = AutoModelForCausalLM.from_pretrained("./lora_finetuned_qwen")
tokenizer = AutoTokenizer.from_pretrained("./lora_finetuned_qwen")# 进行推理
input_text = "Your prompt here"
inputs = tokenizer(input_text, return_tensors="pt")
outputs = model.generate(**inputs)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
总结
这个流程中,LoRA 微调的关键是通过 PEFT
库对模型的特定层(如 q_proj
和 v_proj
)进行部分参数化微调,以降低显存消耗。