以 Qwen2.5-7B-Instruct 为例走通 LoRA 微调全流程:环境准备与依赖安装、模型下载、指令集构建与数据格式化、加载半精度模型与 tokenizer、定义 LoraConfig 并用 Trainer 训练,最后加载 LoRA 权重推理。
环境准备
本文基础环境如下:
1 | --------------- |
首先 pip 换源加速下载并安装依赖包
1 | python -m pip install --upgrade pip |
模型下载
https://hf-mirror.com/Qwen/Qwen2.5-7B-Instruct
指令集构建
LLM 的微调一般指指令微调过程。所谓指令微调,是说我们使用的微调数据形如:
1 | { |
其中,instruction 是用户指令,告知模型其需要完成的任务;input 是用户输入,是完成用户指令所必须的输入内容;output 是模型应该给出的输出。
即核心训练目标是让模型具有理解并遵循用户指令的能力。因此,在指令集构建时,我们应针对我们的目标任务,针对性构建任务指令集。例如,在本节我们使用由笔者合作开源的 Chat-甄嬛 项目作为示例,我们的目标是构建一个能够模拟甄嬛对话风格的个性化 LLM,因此我们构造的指令形如:
1 | { |
所构造的全部指令数据集在根目录下。
数据格式化
Lora 训练的数据是需要经过格式化、编码之后再输入给模型进行训练的,如果是熟悉 Pytorch 模型训练流程的同学会知道,我们一般需要将输入文本编码为 input_ids,将输出文本编码为 labels,编码之后的结果都是多维的向量。我们首先定义一个预处理函数,这个函数用于对每一个样本,编码其输入、输出文本并返回一个编码后的字典:
1 | def process_func(example): |
Qwen2 采用的 Prompt Template格式如下:
1 | <|im_start|>system |
加载 tokenizer 和半精度模型
模型以半精度形式加载,如果你的显卡比较新的话,可以用 torch.bfolat形式加载。对于自定义的模型一定要指定 trust_remote_code参数为 True。
1 | tokenizer = AutoTokenizer.from_pretrained('/data/models/Qwen2.5-7B-Instruct/', use_fast=False, trust_remote_code=True) |
定义 LoraConfig
LoraConfig这个类中可以设置很多参数,但主要的参数没多少,简单讲一讲,感兴趣的同学可以直接看源码。
task_type:模型类型target_modules:需要训练的模型层的名字,主要就是attention部分的层,不同的模型对应的层的名字不同,可以传入数组,也可以字符串,也可以正则表达式。r:lora的秩,具体可以看Lora原理lora_alpha:Lora alaph,具体作用参见Lora原理Lora的缩放是lora_alpha/r, 在这个LoraConfig中缩放就是 4 倍。
1 | config = LoraConfig( |
自定义 TrainingArguments 参数
TrainingArguments这个类的源码也介绍了每个参数的具体作用,当然大家可以来自行探索,这里就简单说几个常用的。
output_dir:模型的输出路径per_device_train_batch_size:顾名思义batch_sizegradient_accumulation_steps: 梯度累加,如果你的显存比较小,那可以把batch_size设置小一点,梯度累加增大一些。logging_steps:多少步,输出一次lognum_train_epochs:顾名思义epochgradient_checkpointing:梯度检查,这个一旦开启,模型就必须执行model.enable_input_require_grads(),这个原理大家可以自行探索,这里就不细说了。1
2
3
4
5
6
7
8
9
10
11args = TrainingArguments(
output_dir="./output/Qwen2.5_instruct_lora",
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
logging_steps=10,
num_train_epochs=3,
save_steps=100,
learning_rate=1e-4,
save_on_each_node=True,
gradient_checkpointing=True
)
使用 Trainer 训练
1 | trainer = Trainer( |
加载 lora 权重推理
训练好了之后可以使用如下方式加载 lora权重进行推理:
1 | from transformers import AutoModelForCausalLM, AutoTokenizer |

