使用 LLaMA-Factory 微调 llama3 模型
1. LLaMA-Factory模型介绍
https://github.com/hiyouga/LLaMA-Factory
LLaMA-Factory 是一个用于大型语言模型(LLM)微调的工具,它旨在简化大型语言模型的微调过程, 使得用户可以快速地对模型进行训练和优化,以提高模型在特定任务上的性能。
这个工具支持多种预训练的大型语言模型,例如 LLaMA、LLaVA、Mistral、Mixtral-MoE、Qwen、Yi、 Gemma、Baichuan、ChatGLM 和 Phi 等。
LLaMA-Factory 的特点包括:
- 支持多种微调方法:它集成了连续预训练、有监督微调(SFT)、偏好对齐(RLHF)等多种微调方 法。
- 高效的微调技术:与 ChatGLM 官方的 P-Tuning 微调相比,LLaMA Factory 的 LoRA 微调提供了 显著的加速比,并且在特定任务上取得了更高的性能分数。
- 易用性:LLaMA-Factory 提供了高层次的抽象接口,使得开发者可以开箱即用,快速上手操作。
- WebUI 支持:借鉴 Stable Diffusion WebUI,该项目提供了基于 gradio 的网页版工作台,方便初 学者可以迅速上手操作。
- 模型导出和推理:支持模型的导出和推理,包括动态合并 LoRA 模型进行推理。
- API Server:支持启动 API Server,使得训练好的模型可以通过网络接口被远程访问和调用。
- 评测 benchmark:提供了主流评测 benchmark 支持,如 mmlu、cmmlu、ceval 等,用于评估 模型的泛化能力。
LLaMA-Factory 旨在降低大型语言模型微调的门槛,使得更多的研究者和开发者能够利用这些强大的模 型来解决具体的实际问题。
1.1 环境配置
/mnt/workspace路径下执行
git clone https://github.com/hiyouga/LLaMA-Factory.git
conda create -n llama_factory python=3.10
conda activate llama_factory
cd LLaMA-Factory
pip install -e .[metrics]
1.2 下载llama3模型
/mnt/workspace路径下执行
mkdir models
cd models
/mnt/workspace/models路径下执行
pip install modelscope
git clone https://www.modelscope.cn/LLM-Research/Meta-Llama-3-8B-Instruct.git
2 llama3中文增强大模型(lora微调)
使用预训练模型+LoRA适配器的方式, 可以在不重新训练整个模型的情况下, 快速且高效地将模型适应到 新的任务或领域, 如将英文模型适应到中文对话。这是一种常见且实用的微调方法。
2.1 模型训练
修改文件 /mnt/workspace/LLaMA-Factory/examples/train_lora/llama3_lora_sft.yaml
!上传配置文件
llama3_lora_sft.yaml
### model
model_name_or_path: /mnt/workspace/models/Meta-Llama-3-8B-Instruct### method
stage: sft
do_train: true
finetuning_type: lora
lora_target: all### dataset
dataset: alpaca_gpt4_zh
template: llama3
cutoff_len: 2048
max_samples: 1000
overwrite_cache: true
preprocessing_num_workers: 16### output
output_dir: /mnt/workspace/models/llama3-lora-zh
logging_steps: 10
save_steps: 500
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
yaml文件中的主要参数:
model
-
model_name_or_path: 指定预训练模型的路径或名称, 这里使用的是
/mnt/workspace/models/Meta-Llama-3-8B-Instruct 路径下的 Meta-Llama 3.8B 模型作为基础模 型。
-
method
- stage: 表示训练阶段, 这里是 sft(Supervised Fine-Tuning)。
- do_train: 表示要进行训练。
- finetuning_type: 微调方法, 这里使用 LoRA(Low-Rank Adaptation)。
- lora_target: LoRA 作用的对象, 这里是 attention 层的 query 和 value 映射矩阵。
-
dataset
- dataset: 训练数据集名称,这里用的是 alpaca_gpt4_zh 数据集。(注意:数据集可以选择多个 alpaca_zh,alpaca_gpt4_zh,oaast_sft_zh)
- template: 数据集的格式模板,这里是 llama3。
- cutoff_len: 输入序列的最大长度, 超过会截断, 这里设为1024。
- max_samples: 从数据集中取的最大样本数, 这里取前1000个样本。
- preprocessing_num_workers: 数据预处理的进程数, 这里用16个进程并行处理。
-
output
- output_dir: 训练日志和模型的保存路径。
- logging_steps: 每隔多少步记录一次日志, 这里每100步记录一次。
- save_steps: 每隔多少步保存一次模型, 这里每500步保存一次。
- plot_loss: 是否绘制loss曲线图。
-
train
- per_device_train_batch_size: 每个设备上的训练批大小, 这里设为1。
- gradient_accumulation_steps: 梯度累积的步数, 这里累积8步才更新一次模型参数。
- learning_rate: 学习率, 这里设为0.0001。
- num_train_epochs: 训练的epoch数, 这里训练1个epoch。(还可以指定max_steps 3000 : 训练 3000步。注意:真正项目训练增大总步数;注意:num_train_epochs和max_steps之中选择一 个)
- lr_scheduler_type: 学习率调度器类型, 这里用cosine, 即先warmup再降温。
- warmup_steps: 用初始学习率warmup的步数, 这里取总步数的10%。 fp16: 是否使用fp16混合精度训练, 以加速训练并减少显存占用。
-
eval
- val_size: 从训练集中划分出的验证集比例, 这里取10%作为验证集。
- per_device_eval_batch_size: 验证时每个设备的批大小,这里为1。
- evaluation_strategy: 验证策略, 这里根据steps数来验证。
- eval_steps: 每隔多少步验证一次, 这里每500步验证一次。
以上就是这个yaml配置文件的主要参数解释。这些参数设置了一个使用LoRA对Meta-Llama-3-8BInstruct模型在alpaca_gpt4_zh数据集上进行微调的训练过程。
2.2 克隆数据集
在/mnt/workspace/LLaMA-Factory/data路径下使用下面的命令克隆alpaca_gpt4_zh数据集
git clone https://www.modelscope.cn/datasets/llamafactory/alpaca_gpt4_zh.git
然后,修改dataset_info.json文件
!上传配置文件
data_info.json
上传alpaca_gpt4_data_zh.json到data目录下
2.3 训练
llamafactory-cli train examples/train_lora/llama3_lora_sft.yaml
1.4 推理
修改examples/inference/llama3_lora_sft.yaml
model_name_or_path: /mnt/workspace/models/Meta-Llama-3-8B-Instruct
adapter_name_or_path: /mnt/workspace/models/llama3-lora-zh
template: llama3
finetuning_type: lora
- –model_name_or_path /mnt/workspace/models/Meta-Llama-3-8B-Instruct : 这个参数指定了 预训练语言模型的名称或路径。在这个例子中, 使用的是位于 /mnt/workspace/models/MetaLlama-3-8B-Instruct 的Meta的Llama-3-8B-Instruct模型。这个模型将作为基础模型,在其上进行 微调。
- –adapter_name_or_path /mnt/workspace/models/llama3-lora-zh : 这个参数指定了用于微调 的适配器(Adapter)的名称或路径。在这个例子中, 使用的是位 于 /mnt/workspace/models/llama3-lora-zh 的适配器。这个适配器是通过LoRA技术在基础模型 上微调得到的。
- –template llama3 : 这个参数指定了对话模板的名称。模板定义了对话的格式和风格。在这个例 子中, 使用的是名为 llama3 的模板。
- –finetuning_type lora : 这个参数指定了微调的类型。在这个例子中, 使用的是LoRA技术进行微 调。
/mnt/workspace/LLaMA-Factory路径下执行
llamafactory-cli chat examples/inference/llama3_lora_sft.yaml