环境配置
本次使用的是windows11,Python为3.11,训练数据和model使用HuggingFace
1、安装基础环境
#安装包
pip install datasets transformers torch
2、安装LLaMA-Factory
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]"
构建数据集
1、生成数据文件
数据使用一个医疗诊断数据medical-o1-reasoning-SFT,先把数据转换为LLaMA-Factory支持的Alpaca数据格式,并划分数据集,4060显卡只有8G,这里取2000个样本训练,200个样本验证。
from datasets import load_dataset
import json, os
dataset = load_dataset('FreedomIntelligence/medical-o1-reasoning-SFT', 'zh')
dataset = {"train": dataset['train'][:2000], 'val': dataset['train'][-200:]}
root = r'D:\LeStoreDownload\LLaMA-Factory-0.9.2\LLaMA-Factory-0.9.2\data'
for key in ['train', 'val']:
list_r = []
for q, r in zip(dataset[key]["Question"], dataset[key]["Response"]):
list_r.append({"instruction": "你是一个经验丰富的医生", "input": q, "output": r})
fpath = os.path.join(root, f'medical_{key}_zh.json')
json.dump(list_r, open(fpath, 'w', encoding='utf-8'), ensure_ascii=False, indent=3)
运行上面代码后,会在LLaMA-Factory-0.9.2/data
下生成medical_train_zh.json和medical_val_zh.json
train的内容内容如下
2、注册数据文件
编辑LLaMA-Factory-0.9.2/data/dataset_info.json
文件,添加之前生成的2个json文件
启动UI界面
在LLaMA-Factory的安装目录下运行如下目录,方便后面选择数据集,比如我的目录为D:\LeStoreDownload\LLaMA-Factory-0.9.2\LLaMA-Factory-0.9.2
llamafactory-cli webui
加载模型
这里使用千问的0.5B进行训练,点击加载模型后,会自动下载模型
加载数据
选择我们对应的数据文件,这里只选择train文件
模型训练
大多参数使用默认即可,我这里把学习率设置为2e-4,训练8个epoch,如下是开始训练的过程
模型评估
首先使用验证集medical_val_zh.json测试下基座模型的效果
评测结果如下,在2000个样本上训练了8个epoch,还是有提升效果的。人工评测可以查看输出的generated_predictions.jsonl文件,有具体的模型输出内容和label
{
"predict_bleu-4": 16.561837,
"predict_model_preparation_time": 0.003,
"predict_rouge-1": 35.744373,
"predict_rouge-2": 14.5082895,
"predict_rouge-l": 22.9553675,
"predict_runtime": 773.3625,
"predict_samples_per_second": 0.259,
"predict_steps_per_second": 0.129
}
然后添加上对应的检查点路径
(lora训练权重)
重新进行预测
{
"predict_bleu-4": 22.958406,
"predict_model_preparation_time": 0.0038,
"predict_rouge-1": 43.19669,
"predict_rouge-2": 18.544107,
"predict_rouge-l": 30.117725499999995,
"predict_runtime": 643.3882,
"predict_samples_per_second": 0.311,
"predict_steps_per_second": 0.155
}
模型合并
因为我们是基于lora训练的,所以训练完成后,要把基座模型和检查点的权重进行合并
导出后