简介
LLM 通用模型在各种使命上表现良好,咱们能够将它们用刁难方针使命进行微调的基础。微调允许咱们使模型适应方针域和方针使命,使其能够更好地完成咱们所需要的特定的使命。
目前模型微调办法首要有 Full(全参微调)、Freeze、P-tuning、LoRA、QLora,这些这些办法都各有优势,关于它们的介绍也有很多,本篇首要讲解代码完成,原理方面就不赘述了,相同考虑到不是一切读者都有满足的算力,因而运用占用资源最少的 QLora 对模型进行微调,各个微调方法占用资源如下图所示(batch_size 设置为 1)。
这里推荐运用 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/yangjianxin1/Firefly.git
cd Firefly
pip install -r requirements.txt
然后找到 1. Firefly/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": 1,
"gradient_accumulation_steps": 16,
"learning_rate": 2e-4,
"max_seq_length": 1024,
"logging_steps": 100,
"save_steps": 100,
"save_total_limit": 1,
"lr_scheduler_type": "constant_with_warmup",
"warmup_steps": 100,
"lora_rank": 64,
"lora_alpha": 128,
"lora_dropout": 0.05,
"gradient_checkpointing": true,
"disable_tqdm": false,
"optim": "paged_adamw_32bit",
"seed": 42,
"fp16": true,
"report_to": "tensorboard",
"dataloader_num_workers": 0,
"save_strategy": "steps",
"weight_decay": 0,
"max_grad_norm": 0.3,
"remove_unused_columns": false
}
数据预备
这里的数据集是官方提供的一个测试数据集,用于跑通流程,以下是其间一条数据: 这个 json 中只用 “conversation_id” 和 “conversation” 两个是练习需要的,其他的不必在意。”conversation_id” 表明对话的序号,”conversation” 对应的是一个列表,元素是字典,每个字典中有 “human” 和 “assistant” 两个键,分别表明用户和模型的说话内容。假如要用自己的数据集也要按照这种格式进行修正。
开端练习
使用以下代码开端练习:
python train.py --train_args_file train_args/sft/qlora/qwen-7b-sft-qlora.json
练习完成后会在装备文件中设置的 output_dir 生成对应的 QLora 文件,可使用 Firefly/script/chat 途径下的两个脚本进行调用来测试模型微调的效果。