LLama-Factory 实战:基于自建数据集微调 Qwen7B 模型
本文介绍了使用 LLaMA-Factory 框架微调 Qwen7B 模型的完整流程。内容包括环境安装、自定义数据集构建与注册、YAML 配置文件详解、训练命令执行、LoRA 权重合并及模型推理测试。文章还深入分析了超参数调节策略、数据质量对效果的影响、灾难性遗忘的规避方法以及多任务学习的注意事项,为大模型垂直领域应用提供技术参考。

本文介绍了使用 LLaMA-Factory 框架微调 Qwen7B 模型的完整流程。内容包括环境安装、自定义数据集构建与注册、YAML 配置文件详解、训练命令执行、LoRA 权重合并及模型推理测试。文章还深入分析了超参数调节策略、数据质量对效果的影响、灾难性遗忘的规避方法以及多任务学习的注意事项,为大模型垂直领域应用提供技术参考。

LLaMA-Factory 是一个高效的大模型训练框架,支持多种主流大模型的微调与推理。它提供了丰富的训练方法、精度选项及算法支持,旨在降低大模型应用的门槛。
以下是不同微调方法及模型规模下的显存估算值(仅供参考):
| 方法 | 精度 | 7B | 13B | 30B | 70B |
|---|---|---|---|---|---|
| Full | AMP | 120GB | 240GB | 600GB | 1200GB |
| Full | 16bit | 60GB | 120GB | 300GB | 600GB |
| Freeze | 16bit | 20GB | 40GB | 80GB | 200GB |
| LoRA | 16bit | 16GB | 32GB | 64GB | 160GB |
| QLoRA | 8bit | 10GB | 20GB | 40GB | 80GB |
| QLoRA | 4bit | 6GB | 12GB | 24GB | 48GB |
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
根据需求安装 PyTorch 及相关指标库:
pip install -e ".[torch,metrics]"
若需使用特定加速库(如 Unsloth),可额外安装对应插件。
在指令监督微调(SFT)中,数据格式通常遵循以下 JSON 结构:
[
{
"instruction": "你是一个舆情分析专家,擅长分析一段文字的舆情类型。现在请你判断下述语句,任务 1,是否与负面新闻,你的回答只能从是或不是选择一个,任务 2,是否与负面情绪,你的回答只能从是或不是中选择一个。例如:待判断语句:今天合肥的天气真好。你的回复:1,不是,2,不是。现在待判断语句为:{}",
"input": "2023 年 3 月 16 日 14 时 55 分许,鄂温克族自治旗伊敏河镇发生一起一般事故,造成一人死亡,直接经济损失人民币 200 万元。",
"output": "任务 1:是,原文中提到了负面新闻,这些词汇与负面新闻相关。任务 2:不是,由于原文没有提到负面情绪,这和没有关系,因此不是。"
}
]
字段说明:
instruction:必填。人类指令模板,包含占位符 {} 用于拼接 input。input:选填。用户输入内容,与 instruction 拼接后作为完整指令。output:必填。模型期望的回答。system:选填。系统提示词,用于设定角色或约束。history:选填。多轮对话历史,格式为 ["指令", "回答"] 列表。将准备好的数据集文件(如 my_train_data.json)放入 data 目录下,并编辑 data/dataset_info.json 添加配置:
{
"my_train_data": {
"file_name": "my_train_data.json",
"columns": {
"prompt": "instruction",
"query": "input",
"response": "output"
}
}
}
注意记录数据集名称(如 my_train_data),后续训练时需指定。
创建训练配置文件 examples/train_lora/mytrain_lora_sft.yaml:
### model
model_name_or_path: /path/to/qwen-7b-chat
### method
stage: sft
do_train: true
finetuning_type: lora
lora_target: all
### dataset
dataset: my_train_data
template: qwen
cutoff_len: 4096
max_samples: 1000
overwrite_cache: true
preprocessing_num_workers: 16
### output
output_dir: saves/qwen/lora/sft
logging_steps: 10
save_steps: 100
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: 3.0
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: 500
关键参数解析:
stage: 设置为 sft 进行指令微调。finetuning_type: 选择 lora 进行参数高效微调。lora_target: 设置 all 表示对所有线性层应用 LoRA,也可指定如 q_proj,v_proj。cutoff_len: 最大上下文长度,根据显存调整。learning_rate: 学习率建议从 1e-4 开始,根据 Loss 曲线调整。bf16: 启用 BF16 混合精度训练以节省显存并提高稳定性。llamafactory-cli train examples/train_lora/mytrain_lora_sft.yaml
CUDA_VISIBLE_DEVICES=0,1,2,3 python src/train_bash.py \
--stage sft \
--do_train \
--model_name_or_path /app/model \
--dataset my_train_data \
--finetuning_type lora \
--lora_target q_proj,v_proj \
--output_dir /app/output \
--overwrite_cache \
--per_device_train_batch_size 1 \
--gradient_accumulation_steps 1 \
--lr_scheduler_type cosine \
--logging_steps 10 \
--save_steps 1000 \
--learning_rate 5e-5 \
--num_train_epochs 3.0 \
--template qwen
训练完成后,需要将 LoRA 权重合并到基座模型中以便部署:
llamafactory-cli export examples/merge_lora/my_lora_sft.yaml
配置文件示例:
### model
model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
adapter_name_or_path: saves/llama3-8b/lora/sft
template: llama3
finetuning_type: lora
### export
export_dir: models/llama3_lora_sft
export_size: 2
export_device: cpu
export_legacy_format: false
或使用命令行:
CUDA_VISIBLE_DEVICES=0 python /app/src/export_model.py \
--model_name_or_path /app/model/ \
--adapter_name_or_path /app/output/checkpoint-3000/ \
--template default \
--finetuning_type lora \
--export_dir /app/lora_result/20240422_1519/ \
--export_size 2 \
--export_legacy_format False
修改 inference/yaml 中的路径后运行:
llamafactory-cli chat examples/inference/llama3_lora_sft.yaml
python /app/src/cli_demo.py \
--model_name_or_path /app/lora_result/20240422_1519/ \
--template=qwen
1e-4。观察 Loss 曲线,若震荡剧烈则调低,若收敛过慢则调高。微调可能导致模型原有能力下降。解决方法:
若需模型同时掌握多个能力,需注意数据集的相关性和比例分配。通过精心设计的 Prompt 和混合数据,可实现单一模型的多任务处理。
本文详细介绍了使用 LLaMA-Factory 框架对 Qwen7B 模型进行基于自建数据集的微调全流程。从环境搭建、数据准备、配置编写到训练、合并及推理,涵盖了核心步骤。在实际应用中,请根据具体业务场景调整超参数和数据质量,以获得最佳效果。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online