本文用来记录利用llama-factory对qwen大模型的微调过程。


LLAMA-Factory的配置

项目地址:hiyouga/LLaMA-Factory: Unified Efficient Fine-Tuning of 100+ LLMs & VLMs (ACL 2024)

我的环境配置:

  • Windows 2022 server
  • NVIDIA A10

 首先创建环境:

conda create -n lf python=3.10
conda activate lf
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]"

运行完了之后验证一下cuda即可。我这次微调的大模型为qwen2.5-7B-instruct版本,可以从huggingface(不推荐,慢)或modelscope获取,如下所示:

from modelscope import snapshot_download

model_dir = snapshot_download('Qwen/Qwen2.5-7B-Instruct')

下载好后的模型位于.cache文件夹下,输出信息也会有详细的文件地址,这个路径要记住,或像我一样直接把整个Qwen文件夹搬到LLaMA-Factory文件夹下便于使用。

数据集准备

 以我的微调为例,我想要对大模型预测信息这块进行微调,因此我准备的数据集也十分简单,格式如下所示:

[
    {
        "prompt": "你是一个专业的用户性别分析专家。请根据用户观看的历史视频内容,分析用户的性别。请直接给出结果,不需要分析过程。-用户观看历史视频种类与标题:[xxx]",
        "answer": "女"
    },
    {
        "prompt": "你是一个专业的用户性别分析专家。请根据用户观看的历史视频内容,分析用户的性别。请直接给出结果,不需要分析过程。-用户观看历史视频种类与标题:[xxx]",
        "answer": "女"
    },
    {
        "prompt": "你是一个专业的用户性别分析专家。请根据用户观看的历史视频内容,分析用户的性别。请直接给出结果,不需要分析过程。-用户观看历史视频种类与标题:[xxx]",
        "answer": "女"
    },
    {
        "prompt": "你是一个专业的用户性别分析专家。请根据用户观看的历史视频内容,分析用户的性别。请直接给出结果,不需要分析过程。-用户观看历史视频种类与标题:[xxx]",
        "answer": "女"
    },
    {
        "prompt": "你是一个专业的用户性别分析专家。请根据用户观看的历史视频内容,分析用户的性别。请直接给出结果,不需要分析过程。-用户观看历史视频种类与标题:[xxx]",
        "answer": "女"
    }
]

上面的是一个json文件,其中prompt为我们输入给大模型的内容,answer为预期的回答,也就是lable,至于这个数据集如何构建的这里就不做赘述了。

然后我们需要在LLaMA-Factory/data下修改dataset_info.json文件,假如我们上面的数据集名字为data_test.json,放在LLaMA-Factory/data下,我们需要添加如下一段话:

  "data_train": {
    "file_name": "data_test.json",
    "columns": {
      "prompt": "prompt",
      "response": "answer"
    }
  },

这段不难理解,就是告诉大模型我这个数据集里的内容是什么,file_name为data下数据集名称,"data_train"为自定义的数据集名称,后续使用数据集都用的这个自定义的名字。

微调大模型

我采用的是lora的方式对大模型进行微调,因此配置了一个yaml文件来使用,可以看examples/train_lora下的一堆yaml文件来编写,其实就是定义训练和评估的各种超参数,这里给出我用的例子:

### model
model_name_or_path: C:/lds/LLaMA-Factory/Qwen/Qwen2.5-7B-Instruct

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

### dataset
dataset: data_train
template: qwen
cutoff_len: 1024
max_samples: 10000
overwrite_cache: true
preprocessing_num_workers: 16

### output
output_dir: C:/lds/LLaMA-Factory/output_model_age
logging_steps: 10
save_steps: 1000
plot_loss: true
overwrite_output_dir: true

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

### eval
val_size: 0.1
per_device_eval_batch_size: 1
eval_strategy: steps
eval_steps: 1000

然后就可以开始运行微调代码了,打开一个lf环境的终端,输入如下命令:

llamafactory-cli train examples/train_lora/[你的yaml文件名].yaml

此时终端会输出训练的各种信息,然后就开始微调了:

微调后使用 

在上面的微调训练完成后,会把lora模型文件存放在预设好的目录下,我们可以自己写一个加载lora模型的代码供封装使用,当然也可以用llama-factory自带的来使用,同时这里也给出批量调用执行预测的一个案例:

正常单次循环调用

 打开终端,执行:

llamafactory-cli chat --model_name_or_path C:/lds/LLaMA-Factory/Qwen/Qwen2.5-7B-Instruct --adapter_name_or_path C:/lds/LLaMA-Factory/output_model/checkpoint-2421

注意,这里都是我的绝对路径,需要替换为实际的模型路径以及lora模型路径,然后等加载完毕就会提示输入了:

按数据集预测 

 按上面数据集准备的操作批量准备输入,此时的answer可以是任意值,因为用不到,然后准备如下的yaml文件(参考):

### model
model_name_or_path: C:/lds/LLaMA-Factory/Qwen/Qwen2.5-7B-Instruct
adapter_name_or_path: C:/lda/LLaMA-Factory/output_model/checkpoint-2000

### method
stage: sft
do_predict: true
finetuning_type: lora

### dataset
dataset: data_test
template: qwen
cutoff_len: 1024
max_samples: 2000
overwrite_cache: true
preprocessing_num_workers: 16

### output
output_dir: C:/lds/LLaMA-Factory/output_result
overwrite_output_dir: true

### eval
per_device_eval_batch_size: 1
predict_with_generate: true
ddp_timeout: 180000000

然后同上面微调大模型的方法执行,即可在output_result文件夹下的generate_predictions.jsonl文件中看到结果了,包括原始的大模型信息与输入信息,还有大模型的回答(key为predict)以及前面设置的没用的answer(key为label)。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐