大模型微调指南之 Xtuner 篇:3步实现Qwen1.5中文对话模型优化
一、介绍
Xtuner 是一款用来微调大语言模型(LLM)的工具。在微调的过程中,用户可以直观地看到验证数据的训练情况。因此,Xtuner 更适合用来微调主观类的数据。
二、安装使用
2.1 构建虚拟环境
推荐使用 Python-3.10 的 conda 虚拟环境安装 XTuner
2.1.1 创建虚拟环境
1 | |
2.1.2 安装 Xtuner
- 方案 a:通过 pip 直接安装
1 | |
- 方案 b:通过源码安装【推荐】
1 | |
2.2 下载模型
此文以从 modelscope 平台下载 Qwen/Qwen1.5-0.5B-Chat 模型为例
1 | |
2.3 微调准备
2.3.1 创建微调训练配置文件
在 xtuner 的文件夹下找到 xtuner/xtuner/configs/qwen/qwen1_5/qwen1_5_0_5b_chat/qwen1_5_0_5b_chat_qlora_alpaca_e3.py 文件,将该文件复制一份至 xtuner/ 根目录(如果使用其他模型,需要找到对应模型的配置文件)
配置文件名中,有形如 <model>_full_*.py、<model>_qlora_*.py、<model>_int8_lora*.py 的不同文件,作以下说明:
full:表示对整个模型的所有参数进行微调
qlora:基于量化+LoRA 的低资源微调
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28model = dict(
type=SupervisedFinetune,
use_varlen_attn=use_varlen_attn,
llm=dict(
type=AutoModelForCausalLM.from_pretrained,
pretrained_model_name_or_path=pretrained_model_name_or_path,
trust_remote_code=True,
torch_dtype=torch.float16,
quantization_config=dict(
type=BitsAndBytesConfig,
load_in_4bit=True, # 是否开启4位QLoRA量化
load_in_8bit=False, # 是否开启8位QLoRA量化
llm_int8_threshold=6.0,
llm_int8_has_fp16_weight=False,
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
),
),
lora=dict(
type=LoraConfig,
r=32, # LoRA 秩(参数量)
lora_alpha=64, # 缩放系数
lora_dropout=0.1,
bias="none",
task_type="CAUSAL_LM",
),
)int8_lora:8 位 QLoRA 量化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20model = dict(
type=SupervisedFinetune,
use_varlen_attn=use_varlen_attn,
llm=dict(
type=AutoModelForCausalLM.from_pretrained,
pretrained_model_name_or_path=pretrained_model_name_or_path,
trust_remote_code=True,
torch_dtype=torch.float16,
load_in_8bit=True, # 是否开启8位QLoRA量化
),
lora=dict(
type=LoraConfig,
r=16, # LoRA 秩(参数量)
lora_alpha=16, # 缩放系数
lora_dropout=0.05,
target_modules=["gate_proj", "down_proj", "up_proj"],
bias="none",
task_type="CAUSAL_LM",
),
)
2.3.2 修改微调训练配置文件
以下列举常用修改参数
1 | |
2.4 微调训练
在 xtuner/ 根目录下执行:
1 | |
模型在训练过程中,会在 `xtuner/work_dirs/<mode 给我重新修改下这几篇文章的标题,主要用于 csdn 博客
训练完成(模型微调数据已经收敛或者已经达到期望的训练效果,此时可能之前设置的训练轮次还没执行完)后,执行以下命令进行模型转换:
1 | |
此时生成的模型仅仅是个适配器,并不是一个完整的模型(因为这里是 QLoRA 微调)
【问题】
博主测试使用的是 Pytorch2.6 (requirements.txt),出现以下提示:
1 | |
【解决】
- 查看提示(1)
- 找到
xtuner/xtuner/model/utils.py源码文件 - 将
state_dict = torch.load(pth_model, map_location="cpu")修改为state_dict = torch.load(pth_model, map_location="cpu", weights_only=False)即可
2.6 模型合并
如果使用了 LoRA / QLoRA 微调,则模型转换后将得到适配器 Adapter 参数,而并不包含原 LLM 参数。
- Full Fine-Tuning 全参数微调:生成的是完整模型,无需依赖基座模型
- LoRA/QLoRA 微调:生成的仅仅是适配器,必须与基座模型结合使用
如果期望获得合并后的模型权重(例如用于后续评测),则需要对模型进行合并:
1 | |
至此,得到 /root/workspace/ai/models/custom/qwen1_5_0_5b_chat_qlora_alpaca_e3/ 下的文件即为微调后的完整模型,可以直接使用