简介
LLM(Large Language Model)通用模型在各种任务上表现良好,我们可以将它们用作对目标任务进行微调的基础。微调允许我们使模型适应目标域和目标任务,使其可以更好地完成我们所需要的特定任务。
目前模型微调方法主要有 Full(全参微调)、Freeze、P-tuning、LoRA、QLoRA。这些方法各有优势,关于它们的介绍也有很多。本篇主要讲解代码实现,原理方面不赘述。考虑到不是所有读者都有足够的算力,因此使用占用资源最少的 QLoRA 对模型进行微调。
这里推荐使用 Firefly 项目来实现模型微调。这个项目主要是为了微调多轮对话数据集,不过单轮对话也同样适用。
Firefly 项目训练多轮对话模型时,采取了一种更加充分高效的方法。将一条多轮对话数据拼接之后,输入模型,并行计算每个位置的 loss,只有 Assistant 部分的 loss 参与权重更新。
为什么这种做法是可行的?答案在于因果语言模型的 attention mask。以 GPT 为代表的 Causal Language Model(因果语言模型),这种模型的 attention mask 是一个对角掩码矩阵,每个 token 在编码的时候,只能看到它之前的 token,看不到它之后的 token。所以 User1 部分的编码输出,只能感知到 User1 的内容,无法感知到它之后的文本,可以用来预测 Assistant1 的内容。而 User2 部分的编码输出,只能看到 User1、Assistant1、User2 的内容,可以用来预测 Assistant2 的内容,依此类推。对于整个序列,只需要输入模型一次,便可并行获得每个位置的 logits,从而用来计算 loss。
训练环境配置
首先 pull 项目并配置环境:
git clone https://github.com/yangjianxin/Firefly.git
cd Firefly
pip install -r requirements.txt
确保安装以下核心依赖库:
- transformers
- peft
- accelerate
- bitsandbytes
- torch
然后找到 train_args/sft/qlora 路径下的配置文件(例如 qwen-7b-sft-qlora.json)。虽然文件名可能包含 7b,但通常 qwen 系列模型都可以通用。需要对里面的内容进行修改,主要修改模型路径和训练文件,其余参数可以根据显存情况调整。
配置文件详解
{
"output_dir": "output/firefly-qwen-1_8b-sft-qlora",
"model_name_or_path": "Qwen/Qwen-1_8B-Chat",
"train_file": "./data/dummy_data.jsonl",
"template_name": "qwen",
"num_train_epochs": 1,
"per_device_train_batch_size"


