LLaMA-Factory 模型微调基础教程
LLaMA-Factory 概述
使用 LLaMA-Factory 进行模型微调具有多方面的好处。首先,它简化了大模型微调的过程,使得即使是没有深厚技术功底的用户也能轻松进行模型的优化和改进。此外,LLaMA-Factory 支持多种训练方法,如全量调参、LoRA 等,以及不同的对齐方案,如 DPO、PPO 等。这为用户提供了灵活性,可以根据具体需求选择合适的微调策略。
LLaMA-Factory 还提供了一站式服务,从模型微调到量化处理,再到运行,整个过程一气呵成,无需在不同的工具和流程之间来回切换。此外,它支持多种流行的语言模型,如 LLaMA、BLOOM、Mistral、Baichuan 等,涵盖了广泛的应用场景。
在模型量化方面,LLaMA-Factory 能够有效地压缩模型规模,减少模型运行所需的计算量和存储空间,使得模型能够在性能稍弱的设备上也能流畅运行。这不仅提高了模型的可访问性,也降低了运行成本。
此外,LLaMA-Factory 的训练过程中记录的内容比较全面,除了同步输出 loss 曲线图以外,还自带 BLEU 等评测指标,这有助于用户更好地监控和评估模型的性能。
LLaMA-Factory 下载
GitHub: LLaMA-Factory
- 进入 LLaMA-Factory 仓库页面,点击 Code 按钮下载源码包(推荐 ZIP 格式)。
- 解压完成之后记录一下解压路径。
Anaconda 环境创建
软硬件依赖详情
- 创建虚拟环境:官方给出的是 Python 至少 3.9,推荐 3.10。
- 打开终端。
- 导航到刚才解压的地址,例如:
cd <project_path>。
LLaMA-Factory 依赖安装
# 依赖下载
pip install -r requirements.txt
# 安装依赖最好都执行一遍
pip install -e ".[torch,metrics]"
CUDA 安装
# CUDA 安装
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
# 记得输入 y 继续安装
量化 BitsAndBytes 安装
如果要在 Windows 平台上开启量化 LoRA(QLoRA),需要安装预编译的 bitsandbytes 库。支持 CUDA 11.1 到 12.2,请根据您的 CUDA 版本情况选择适合的发布版本。
pip install https://github.com/jllllll/bitsandbytes-windows-webui/releases/download/wheels/bitsandbytes-0.41.2.post2-py3-none-win_amd64.whl
可视化微调启动
# 启动命令
llamafactory-cli webui
如果出现无法访问 localhost 的错误,说明 Gradio share 为 false 而无法正确响应,需要更改 interface.py 代码。
- 找到
interface.py存在路径,例如:LLaMA-Factory/src/llamafactory/webui。 - 找到
run_web_ui()和run_web_demo()方法,把share=gradio_share修改成share=True。 - 然后再次运行即可成功。注意此时不要使用代理工具,否则界面可能一直加载不出来。
数据集准备
所需工具下载
可以使用微信风格化工具或其他数据导出工具(如 finetune_dataset_maker)。参考相关论文了解个性化对话生成的最新趋势及数据集构建方法。
- 下载并解压工具。
- 双击执行工具程序。
- 登录账号,点击解析数据。
- 选择 AI 对话 txt 和 json 格式按需导出。
- 记录导出目录的相对路径。
所需数据合并
在聊天记录文件夹建立一个 merge.py 的文件,主要作用是合并所有的聊天记录。
import os
import json
folder_path = r'<data_path>'
json_files = []
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.endswith('.json'):
json_files.append(os.path.join(root, file))
merged_data = []
for file in json_files:
with open(file, 'r', encoding='utf-8') as f:
try:
data = json.load(f)
merged_data.append(data)
except json.JSONDecodeError:
print(f"Error decoding {file}. Skipping.")
merged_file_path = os.path.join(folder_path, 'merged_data.json')
with open(merged_file_path, 'w', encoding='utf-8') as merged_file:
json.dump(merged_data, merged_file, indent=4, ensure_ascii=False)
print(f"合并后的文件已保存至:{merged_file_path}")
在命令行中键入 python merge.py 执行。
数据集预处理
数据集预处理是机器学习和人工智能中不可或缺的环节,其重要性体现在多个方面。首先,预处理能够提升数据质量,通过清洗噪声、去除重复和无关信息,以及标准化格式,为模型训练提供纯净且一致的输入。其次,它有助于优化模型性能,例如通过分词、去除停用词等操作,让模型更容易理解和学习数据中的关键信息,同时减少过拟合的风险。
在聊天记录文件夹建立一个 Data_Preprocessing.py 的文件,主要作用是数据清洗、脱敏、去重以及规则化成 sharegpt 格式。
import json
import re
with open('merged_data.json', 'r', encoding='utf-8') as file:
data = json.load(file)
converted_data = []
def clean_data(dataset):
cleaned_data = []
for example in dataset:
messages = example['messages']
cleaned_messages = []
for message in messages:
if not message['content'].strip():
continue
message['content'] = message['content'].replace("\n", " ").strip()
cleaned_messages.append(message)
if cleaned_messages:
cleaned_data.append({'messages': cleaned_messages})
return cleaned_data
def replace_sensitive_info(text):
text = re.sub(r'\d{3}[-]?\d{4}[-]?\d{4}', '[PHONE_NUMBER]', text)
text = re.sub(r'\S+@\S+', '[EMAIL]', text)
text = re.sub(r'\d{4}-\d{2}-\d{2}', '[DATE]', text)
return text
def anonymize_data(dataset):
anonymized_data = []
for example in dataset:
messages = example['messages']
anonymized_messages = []
for message in messages:
if message['role'] == 'user':
message['content'] = message['content'].replace("用户", "用户 X")
message['content'] = replace_sensitive_info(message['content'])
anonymized_messages.append(message)
anonymized_data.append({'messages': anonymized_messages})
return anonymized_data
for item_list in data:
for item in item_list:
if 'messages' not in item:
continue
conversation = {"conversations": []}
for message in item['messages']:
role = message['role']
content = message['content']
content = replace_sensitive_info(content)
if role == "system":
continue
elif role == "user":
from_role = "human"
elif role == "assistant":
from_role = "gpt"
conversation['conversations'].append({"from": from_role, "value": content})
converted_data.append(conversation)
with open('converted_data.json', 'w', encoding='utf-8') as file:
json.dump(converted_data, file, ensure_ascii=False, indent=2)
print("数据转换完成,结果已保存为 converted_data.json")
在命令行中键入 python Data_Preprocessing.py 执行。
DeepSeek-R1 可视化微调
数据集处理
- 将
converted_data.json数据集存放在 LLaMA-Factory 相对路径下的data文件夹中。 - 编辑
dataset_info.json文件。 - 添加以下内容以便 LLaMA-Factory 识别训练:
"converted_data": {
"file_name": "converted_data.json",
"formatting": "sharegpt",
"columns": {
"messages": "conversations"
}
},
数据详解
在 data 文件夹有个 README_zh.md 的文件,记录了 alpaca 和 sharegpt 格式数据集如何配置。使用的是 sharegpt 数据集,所以在 dataset_info.json 文件需要填充的内容如上所示。不需要 tools(工具描述)可以直接删除,如有需求可参照样例数据集修改。
LLaMA-Factory 基础设置
模型下载地址:deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B
- LLaMA-Factory 运行起来之后把语言更改成中文,模型更改为 DeepSeek-R1-1.5B-Distill,模型路径就是你下载好存放的模型路径。
- 选择我们添加的数据集。
- 简单预览一下看看有没有错误,然后关闭。
- 按照默认参数填写,或者根据硬件情况调整。
- 点击预览命令,可以看到训练参数配置详情。
- 开始训练。
- 训练详情可以在 Gradio UI 查看损失函数,也可以后台查看详细信息。
- epoch:表示训练过程中数据集被完整地通过模型一次的次数。
- num_input_tokens_seen:表示在训练过程中模型已经看到的输入标记总数。
- total_flos:表示训练过程中执行的浮点运算次数。
- train_loss:表示训练集上的损失函数值。
- train_runtime:表示训练过程的总运行时间。
- train_samples_per_second:表示模型每秒可以处理的样本数。
- train_steps_per_second:表示模型每秒可以执行的训练步骤数。
- 模型存放位置默认为
saves/<model_name>/lora。
模型评估与预测
- 点击 Evaluate&Predict。
- 选择需要使用到的数据集。
- 预览一下评估命令。
- 评估结束之后会给一个评估指标:
- predict_bleu-4:用于评估机器翻译模型输出质量的一个指标。
- predict_rouge-1/2/l:衡量生成文本与参考文本之间的相似度。
- predict_runtime:模型运行的总时间。
- 可以点击具体链接查看模型评估具体信息。
训练模型对话
- 选择你想要对话并训练好的模型。
- 点击加载模型,提示模型已加载,可以开始聊天了。
- 然后就可以开始对话,这个对话就是根据你的风格进行训练出来的。
训练模型导出
- 点击 Export 切换到模型导出界面。
- 这些参数按需调节吧,导出设备最好选择自动,导出目录需要填写一下。
- 模型正在导出和导出成功都有提示。
- 所有模型文件就在你填写的导出路径文件夹内。
- 建议写一个
requirements.txt文件,也就是依赖安装文件,方便后期快速部署。
transformers>=4.41.2,<=4.48.3,!=4.46.*,!=4.47.*,!=4.48.0,!=4.48.1,!=4.48.2;python_version<'3.10'
transformers>=4.41.2,<=4.48.3,!=4.46.*,!=4.47.*,!=4.48.0;python_version>='3.10'
datasets>=2.16.0,<=3.2.0
accelerate>=0.34.0,<=1.2.1
peft>=0.11.1,<=0.12.0
trl>=0.8.6,<=0.9.6
tokenizers>=0.19.0,<=0.21.0
gradio>=4.38.0,<=5.12.0
pandas>=2.0.0
scipy
einops
sentencepiece
tiktoken
protobuf
uvicorn
pydantic
fastapi
sse-starlette
matplotlib>=3.7.0
fire
packaging
pyyaml
numpy<2.0.0
av
librosa
tyro<0.9.0

