使用 LLaMA-Factory 微调 LLaMA3
官网
https://llamafactory.readthedocs.io/zh-cn/latest/
快速开始:
https://zhuanlan.zhihu.com/p/695287607
1. 实验环境
1.1 机器
- Ubuntu
- PyTorch 2.1.0
- Python 3.12 (Ubuntu 22.04)
- Cuda 12.2
- A800 * 8
1.2 基座模型
基于原版的 LLaMA3 8B 模型:
https://www.modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B/files
(可选)配置 hf 国内镜像站:
pip install -U huggingface_hub
pip install huggingface-cli
export HF_ENDPOINT=https://hf-mirror.com
huggingface-cli download --resume-download /Llama3-8B --local-dir /root/autodl-tmp/models/Llama3-8B
2. LLaMA-Factory 框架
2.1 安装
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e .
2.2 准备训练数据
训练数据:
将训练数据放在 LLaMA-Factory/data/fintech.json
并且修改数据注册文件:LLaMA-Factory/data/dataset_info.json
"fintech": {
"file_name": "fintech.json",
"columns": {
"prompt": "instruction",
"query": "input",
"response": "output",
"history": "history"
}
}
2.3 启动 Web UI
cd LLaMA-Factory
llamafactory-cli webui
2.4 微调模型
sft微调参数
| 名称 | 描述 |
|---|---|
| model_name_or_path | 模型名称或路径 |
| stage | 训练阶段,可选: rm(reward modeling), pt(pretrain), sft(Supervised Fine-Tuning), PPO, DPO, KTO, ORPO |
| do_train | true用于训练, false用于评估 |
| finetuning_type | 微调方式。可选: freeze, lora, full |
| lora_target | 采取LoRA方法的目标模块,默认值为 all。 |
| dataset | 使用的数据集,使用”,”分隔多个数据集 |
| template | 数据集模板,请保证数据集模板与模型相对应。 |
| output_dir | 输出路径 |
| logging_steps | 日志输出步数间隔 |
| save_steps | 模型断点保存间隔 |
| overwrite_output_dir | 是否允许覆盖输出目录 |
| per_device_train_batch_size | 每个设备上训练的批次大小 |
| gradient_accumulation_steps | 梯度积累步数 |
| max_grad_norm | 梯度裁剪阈值 |
| learning_rate | 学习率 |
| lr_scheduler_type | 学习率曲线,可选 linear, cosine, polynomial, constant 等。 |
| num_train_epochs | 训练周期数 |
| bf16 | 是否使用 bf16 格式 |
| warmup_ratio | 学习率预热比例 |
| warmup_steps | 学习率预热步数 |
| push_to_hub | 是否推送模型到 Huggingface |
参数详解
模型配置
model_name_or_path:
指定基础模型的名称或存储路径。可以是预训练模型的名称(如llama-7b)或者一个本地路径(如./models/llama)。
作用:加载指定的基础模型用于微调。
训练阶段
-
stage:
指定训练的阶段,主要有以下几种:rm(Reward Modeling): 训练奖励模型,用于评估生成的文本质量。pt(Pretrain): 对模型进行额外的预训练。sft(Supervised Fine-Tuning): 使用标注数据对模型进行监督微调。PPO(Proximal Policy Optimization): 强化学习阶段,优化生成质量。DPO: 一种强化学习技术。KTO/ORPO: 其他高级训练技术。
作用:决定训练任务的具体目标。
是否训练
-
do_train:- 设置为
true:执行训练。 - 设置为
false:仅进行模型评估。
作用:区分训练和评估模式。
- 设置为
微调类型
finetuning_type:
决定微调方式,有以下选项:freeze: 冻结模型大部分参数,仅训练特定层或模块。lora: 使用 LoRA(低秩适配器),仅调整少量参数,计算资源效率更高。full: 对整个模型进行全量微调。
作用:影响训练的效率与性能。
lora_target:
当选择lora微调方式时,指定目标模块(如transformer.h.10)或者选择all来应用于所有模块。
作用:细化 LoRA 微调的范围。
数据集相关
dataset:
指定训练使用的数据集名称,可以通过逗号分隔多个数据集。例如,dataset1,dataset2。
作用:加载训练或评估所需的数据。template:
数据集模板,用于将数据集格式化为模型的输入/输出格式。
例如,如果模型需要问答数据格式,模板会确保数据集按该格式提供数据。
作用:保证数据与模型结构匹配。
输出路径
-
output_dir:
设置训练结果的保存路径,包括模型权重、日志、配置文件等。
作用:保存训练后的模型及相关信息。 -
overwrite_output_dir:
是否允许覆盖output_dir的内容:- 设置为
true:允许覆盖。 - 设置为
false:避免覆盖已有数据。
- 设置为
日志与保存
logging_steps:
每隔多少步输出一次训练日志。例如,设置为50时,每隔 50 个训练步骤记录一次日志。
作用:控制日志记录的频率,方便监控训练。save_steps:
每隔多少步保存一次模型。例如,设置为1000,模型将在每 1000 步时保存一个断点。
作用:在长时间训练时保存中间成果,防止意外中断丢失进度。
训练参数
per_device_train_batch_size:
每个设备上使用的批次大小。
例如,设置为8时,单张 GPU 每次会处理 8 个样本。
作用:影响显存占用和训练速度。gradient_accumulation_steps:
梯度累积步数。例如,设置为4时,每计算 4 次梯度后才更新模型权重。
作用:在显存有限的情况下通过累积模拟更大的批次大小。max_grad_norm:
梯度裁剪阈值,用于防止梯度爆炸。例如,设置为1.0时,所有梯度值会被裁剪到不超过 1.0。
作用:保证训练稳定性。learning_rate:
学习率,控制模型参数的更新幅度。较高的学习率加快收敛,但可能导致震荡,较低的学习率稳定但收敛慢。
作用:影响训练效率和性能。lr_scheduler_type:
学习率调整策略:linear: 线性递减。cosine: 余弦衰减。polynomial: 多项式衰减。constant: 固定学习率。
作用:动态调整学习率以提升训练效果。
num_train_epochs:
指定训练的总轮数。例如,设置为3时,数据集会被遍历 3 次。
作用:决定训练时长和模型最终精度。
硬件加速
bf16:
是否使用bf16(半精度浮点数)格式。
设置为true时,节省显存并加速训练,但要求 GPU 支持(如 A100)。
作用:提升硬件资源利用效率。warmup_ratio和warmup_steps:warmup_ratio:学习率预热的比例,例如0.1表示前 10% 的训练步骤进行预热。warmup_steps:直接指定预热步数。
作用:缓慢增加学习率,避免训练初期不稳定。
推送到模型仓库
push_to_hub:
是否将模型推送到 Huggingface Hub,用于共享和管理模型。- 设置为
true:训练完成后自动上传。 - 设置为
false:仅本地保存。
- 设置为
- 如果显存有限,可以使用
lora微调,并减小per_device_train_batch_size。 - 对于学习率,通常从
5e-5或1e-4开始调试。 - 使用
bf16和gradient_accumulation_steps可以充分利用硬件资源。
命令
训练
CUDA_VISIBLE_DEVICES=0,1 指定显卡1和2
UDA_VISIBLE_DEVICES=0,1 llamafactory-cli train cust/train_llama3_lora_sft.yaml
对话
CUDA_VISIBLE_DEVICES=0 llamafactory-cli chat cust/chat_train_llama3_lora_sft.yaml
模型合并
将 base model 与训练好的 LoRA Adapter 合并成一个新的模型。
⚠️ 不要使用量化后的模型或 quantization_bit 参数来合并 LoRA 适配器。
llamafactory-cli export cust/merge_llama3_lora_sft.yaml
使用合并后的模型进行预测,就不需要再加载 LoRA 适配器。