一,项目简介
使用LLama-Factory大模型训练框架微调DeepSeek-R1-Distill实战
LLama-Factory项目github地址:link
项目特色
- 多种模型:LLaMA、LLaVA、Mistral、Mixtral-MoE、Qwen、Yi、Gemma、Baichuan、ChatGLM、Phi 等等。
- 集成方法:(增量)预训练、(多模态)指令监督微调、奖励模型训练、PPO 训练、DPO 训练、KTO 训练、ORPO 训练等等。
- 多种精度:16 比特全参数微调、冻结微调、LoRA 微调和基于 AQLM/AWQ/GPTQ/LLM.int8/HQQ/EETQ 的 2/3/4/5/6/8 比特 QLoRA 微调。
- 先进算法:GaLore、BAdam、DoRA、LongLoRA、LLaMA Pro、Mixture-of-Depths、LoRA+、LoftQ、PiSSA 和 Agent 微调。
- 实用技巧:FlashAttention-2、Unsloth、RoPE scaling、NEFTune 和 rsLoRA。
- 实验监控:LlamaBoard、TensorBoard、Wandb、MLflow 等等。
- 极速推理:基于 vLLM 的 OpenAI 风格 API、浏览器界面和命令行接口。
二,DeepSeek-R1-Distill 模型下载
1.点击链接进入魔搭社区下载
2.搜索DeepSeek-R1-Distill,选择自己服务器显存可以训练大小的模型,
点击模型文件,下载模型
三,硬件依赖
* 估算值
方法 | 精度 | 7B | 13B | 30B | 70B | 110B | 8x7B | 8x22B |
---|---|---|---|---|---|---|---|---|
Full | AMP | 120GB | 240GB | 600GB | 1200GB | 2000GB | 900GB | 2400GB |
Full | 16 | 60GB | 120GB | 300GB | 600GB | 900GB | 400GB | 1200GB |
Freeze | 16 | 20GB | 40GB | 80GB | 200GB | 360GB | 160GB | 400GB |
LoRA/GaLore/BAdam | 16 | 16GB | 32GB | 64GB | 160GB | 240GB | 120GB | 320GB |
QLoRA | 8 | 10GB | 20GB | 40GB | 80GB | 140GB | 60GB | 160GB |
QLoRA | 4 | 6GB | 12GB | 24GB | 48GB | 72GB | 30GB | 96GB |
QLoRA | 2 | 4GB | 8GB | 16GB | 24GB | 48GB | 18GB | 48GB |
四,安装环境和训练实战
4.1 环境安装
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]"
4.2 构建自己的数据集
注册自己的数据集
将自己的数据集放到data目录下
vim data/dataset_info.json
### 第352行,找到chinese_r1_distill ,只留下ms_hub_url
"chinese_r1_distill ": {
"ms_hub_url": "XXXXX"
},
记着名字,一会训练要指定数据集名称
五,修改对应的yaml文件
### model
model_name_or_path: /home/ai-developer/data/llamaModelFiles/DeepSeek-R1-Distill-Qwen-1.5B
trust_remote_code: true
### method
stage: sft
do_train: true
finetuning_type: lora
lora_rank: 8
lora_target: all
### dataset
dataset: chinese_r1_distill
template: deepseek
cutoff_len: 2048
max_samples: 1000
overwrite_cache: true
preprocessing_num_workers: 16
### output
output_dir: saves/deepseek/lora/sft
logging_steps: 10
save_steps: 500
plot_loss: true
overwrite_output_dir: true
### train
per_device_train_batch_size: 1
gradient_accumulation_steps: 4 # 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
开始训练
lora 指令微调
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 yi
合并模型
llamafactory-cli export examples/merge_lora/my_lora_sft.yaml
### model
model_name_or_path: /home/ai-developer/data/llamaModelFiles/DeepSeek-R1-Distill-Qwen-1.5B
adapter_name_or_path: /home/ai-developer/LLaMA-Factory/saves/deepseek/lora/sft
template: deepseek
trust_remote_code: true
### export
export_dir: output/deepseek_lora_sft
export_size: 5
export_device: cpu
export_legacy_format: false
或者
CUDA_VISBLE_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_resul
t/20240422_1519 --export_size 2 --export_legacy_format False
模型推理
vi inference/yam.py,修改对应路径
model_name_or_path: output/deepseek_lora_sft
template: deepseek
infer_backend: huggingface # choices: [huggingface, vllm]
trust_remote_code: true
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
名称
描述
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
1.训练过程中超参数如何限定
简单任务rank=16,alpha=32一般就ok了,
2.学习率如何调整
一般lora微调学习率都设定为1e-4,其实很多时候,你要根据loss的情况,调高,或者调低,震荡比较大就调低,太慢就调高。根据任务酌情设定。
3.总是学不会,怎么办
如果你在各种超参数后,效果还是不理想。你第一个反思的应该是你的数据集和你想要的结果是否真的匹配,或者你的指令是否是模型友好的(困惑度比较低),或者你的数据存在不平衡。对,没错大模型时代数据平衡也还是很重要的。所以所谓高质量数据集并不是客户场景,或者业务场景有很多数据就够了。最后一公里其实是针对任务模型友好的数据集,能让模型快速学会。这就像一个好老师,一点就通。而差老师怎么教,你还是不会。
4.sft微调需要多少数据
一般难度100-300条数据就ok了,中等,困难问题一般需要1000以上,这个以上可能是3000,8000,1w或者10w加。
5.sft微调的越多,遗忘的越多
对于小任务,rank比较低(例如8,16)的任务,影响还是有限的,可以混合一些你想保留的原子能力的数据进去
6.如何才能一次性微调想要模型学习到多个能力
注意相关性和比例,数据集必须是一个好老师,然后还要注意到我提到的以上内容。另外你也可以通过多阶段sft的方式学习多个能力
未完待续·…