微调的基本步骤

微调的基本步骤

大模型微调的标准化流程,可以概括为:

  1. 找一个基座模型
  2. 准备训练数据(重中之重)
  3. 进行训练调整参数

下文基于魔搭平台提供的免费GPU环境

微调框架使用Llamafactory

1. 选择并下载模型

下载模型使用的命令:

1
2
3
modelscope download \
--model Qwen/Qwen2.5-3B-Instruct \
--local_dir /mnt/workspace/models/Qwen2.5-3B-Instruct

模型对话,使用 LLaMA-Factory 自带的命令行对话:

1
2
3
4
llamafactory-cli chat \
--model_name_or_path /mnt/workspace/models/Qwen2.5-3B-Instruct \
--template qwen \
--infer_backend huggingface

2. 选择并下载数据集

想将该自定义数据集放到我们的系统中使用,则需要进行如下两步操作

  1. 复制该数据集到 data目录下
  2. 修改 data/dataset_info.json 新加内容完成注册, 该注册同时完成了3件事

下载数据集:

1
2
3
4
5
cd /mnt/workspace/LlamaFactory

modelscope download \
--dataset llamafactory/alpaca_zh \
--local_dir /mnt/workspace/LlamaFactory/data/alpaca_zh

在 data/dataset_info.json 最后添加一个新的本地数据集配置:

1
2
3
4
5
6
7
8
9
"alpaca_zh_local": {
"file_name": "alpaca_zh/alpaca_data_zh_51k.json",
"formatting": "alpaca",
"columns": {
"prompt": "instruction",
"query": "input",
"response": "output"
}
}

因为魔搭的notebook对json文件只读,编辑不了

直接在当前目录执行下面的 Python 修改脚本即可:

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
28
29
cd /mnt/workspace/LlamaFactory

cp data/dataset_info.json data/dataset_info.json.bak

python - <<'PY'
import json
from pathlib import Path

path = Path("data/dataset_info.json")

with path.open(encoding="utf-8") as f:
info = json.load(f)

info["alpaca_zh_local"] = {
"file_name": "alpaca_zh/alpaca_data_zh_51k.json",
"formatting": "alpaca",
"columns": {
"prompt": "instruction",
"query": "input",
"response": "output"
}
}

with path.open("w", encoding="utf-8") as f:
json.dump(info, f, ensure_ascii=False, indent=2)
f.write("\n")

print("dataset_info.json 已更新")
PY

3. 正式训练

在Llamafactory目录下新建一个qwen2.5_3b_alpaca_zh_lora.yaml配置文件

yaml文件配置如下:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
### model
model_name_or_path: /mnt/workspace/models/Qwen2.5-3B-Instruct
trust_remote_code: true

### method
stage: sft
do_train: true
finetuning_type: lora
lora_rank: 8
lora_target: all

### dataset
dataset: alpaca_zh_local
dataset_dir: /mnt/workspace/LlamaFactory/data
template: qwen
cutoff_len: 2048
max_samples: 1000
preprocessing_num_workers: 8
dataloader_num_workers: 2

### output
output_dir: /mnt/workspace/LlamaFactory/saves/qwen2.5-3b/lora/alpaca_zh
logging_steps: 10
save_steps: 100
plot_loss: true
overwrite_output_dir: true
save_only_model: false
report_to: none

### train
per_device_train_batch_size: 1
gradient_accumulation_steps: 8
learning_rate: 1.0e-4
num_train_epochs: 3.0
lr_scheduler_type: cosine
warmup_ratio: 0.1
bf16: true
ddp_timeout: 180000000
resume_from_checkpoint: null

### eval
# eval_dataset: alpaca_zh_local
# val_size: 0.1
# per_device_eval_batch_size: 1
# eval_strategy: steps
# eval_steps: 100

正式训练命令:

1
2
3
CUDA_VISIBLE_DEVICES=0 \
llamafactory-cli train \
/mnt/workspace/LlamaFactory/qwen2.5_3b_alpaca_zh_lora.yaml

4. 训练后验证

训练完之后,加载微调后的 adapter进行对话:

1
2
3
4
5
6
7
cd /mnt/workspace/LlamaFactory

llamafactory-cli chat \
--model_name_or_path /mnt/workspace/models/Qwen2.5-3B-Instruct \
--adapter_name_or_path /mnt/workspace/LlamaFactory/saves/qwen2.5-3b/lora/alpaca_zh \
--template qwen \
--infer_backend huggingface