-
Notifications
You must be signed in to change notification settings - Fork 1.9k
指令精调脚本
-
因为Peft库变动频繁,该代码仅适用于特定Peft版本,运行脚本前请从源码安装commit id为13e53fc的Peft。
-
如果使用其他版本的Peft或修改部分训练参数设置(如不使用deepspeed),不能保证模型可以正常训练。
-
运行前确保拉取仓库最新版代码:
git pull
进入项目的scripts/training
目录,运行bash run_sft.sh
进行指令精调,默认使用单卡。运行前用户应先修改脚本并指定相关参数,脚本中的相关参数值仅供调试参考。run_sft.sh的内容如下:
########参数部分########
lr=1e-4
lora_rank=8
lora_alpha=32
lora_trainable="q_proj,v_proj,k_proj,o_proj,gate_proj,down_proj,up_proj"
modules_to_save="embed_tokens,lm_head"
lora_dropout=0.05
pretrained_model=path/to/hf/llama/or/merged/llama/dir/or/model_id
chinese_tokenizer_path=path/to/chinese/alpaca/tokenizer/dir
dataset_dir=path/to/sft/data/dir
per_device_train_batch_size=1
per_device_eval_batch_size=1
training_steps=100
gradient_accumulation_steps=1
output_dir=output_dir
peft_model=path/to/peft/model/dir
validation_file=validation_file_name
deepspeed_config_file=ds_zero2_no_offload.json
########启动命令########
torchrun --nnodes 1 --nproc_per_node 1 run_clm_sft_with_peft.py \
--deepspeed ${deepspeed_config_file} \
--model_name_or_path ${pretrained_model} \
--tokenizer_name_or_path ${chinese_tokenizer_path} \
--dataset_dir ${dataset_dir} \
--validation_split_percentage 0.001 \
--per_device_train_batch_size ${per_device_train_batch_size} \
--per_device_eval_batch_size ${per_device_eval_batch_size} \
--do_train \
--do_eval \
--seed $RANDOM \
--fp16 \
--max_steps ${training_steps} \
--lr_scheduler_type cosine \
--learning_rate ${lr} \
--warmup_ratio 0.03 \
--weight_decay 0 \
--logging_strategy steps \
--logging_steps 10 \
--save_strategy steps \
--save_total_limit 3 \
--evaluation_strategy steps \
--eval_steps 250 \
--save_steps 500 \
--gradient_accumulation_steps ${gradient_accumulation_steps} \
--preprocessing_num_workers 8 \
--max_seq_length 512 \
--output_dir ${output_dir} \
--overwrite_output_dir \
--ddp_timeout 30000 \
--logging_first_step True \
--lora_rank ${lora_rank} \
--lora_alpha ${lora_alpha} \
--trainable ${lora_trainable} \
--modules_to_save ${modules_to_save} \
--lora_dropout ${lora_dropout} \
--torch_dtype float16 \
--validation_file ${validation_file} \
--peft_path ${peft_model} \
--gradient_checkpointing \
--ddp_find_unused_parameters False
其中一些参数的含义不言自明。部分参数的解释如下:
-
--tokenizer_name_or_path
: Chinese-Alpaca tokenizer所在的目录。⚠️ 注意此处只能传入Alpaca词表(49954),其余会报错。 -
--dataset_dir
: 指令精调数据的目录,包含一个或多个以json
结尾的Stanford Alpaca格式的指令精调数据文件 -
--validation_file
: 用作验证集的单个指令精调文件,以json
结尾,同样遵循Stanford Alpaca格式
所谓Stanford Alpaca格式即:
[
{"instruction" : ...,
"input" : ...,
"output" : ...},
...
]
配置说明:
-
如果想继续训练Chinese-Alpaca模型的LoRA权重:
-
--model_name_or_path
: 原版HF格式LLaMA模型(如果继续训练非Plus Alpaca模型)或合并Chinese-LLaMA-Plus-LoRA后的Chinese-LLaMA模型(如果继续训练Plus模型) -
--peft_path
: Chinese-Alpaca的LoRA权重目录 - 无需指定
--lora_rank
、--lora_alpha
、--lora_dropout
、--trainable
和--modules_to_save
参数
-
-
如果想基于中文Chinese-LLaMA训练全新的指令精调LoRA权重:
-
--model_name_or_path
: 合并对应Chinese-LLaMA-LoRA后的HF格式Chinese-LLaMA模型(无论是否是Plus模型) -
--peft_path
: 勿提供此参数,并且从脚本中删除--peft_path
- 需指定
--lora_rank
、--lora_alpha
、--lora_dropout
、--trainable
和--modules_to_save
参数
-
这里列出的其他训练相关超参数(尤其是学习率,以及和total batch size大小相关的参数)仅供参考。请在实际使用时根据数据情况以及硬件条件进行配置。
- 如果机器的显存比较紧张,可以删去脚本中的
--modules_to_save ${modules_to_save} \
, 即不训练embed_tokens和lm_head(这两部分参数量较大),只训练LoRA参数,以节省显存- 如果是在Alpaca-LoRA基础上继续微调,需要修改
peft_path
下的adapter_config.json
文件,改为"modules_to_save": null
- 如果是在Alpaca-LoRA基础上继续微调,需要修改
- 如果执行上一步操作后程序有报错,请删除
--gradient_checkpointing \
再尝试
请参考以下启动方式:
torchrun \
--nnodes ${num_nodes} \
--nproc_per_node ${num_gpu_per_node}
--node_rank ${node_rank} \
--master_addr ${master_addr} \
--master_port ${master_port} \
run_clm_sft_with_peft.py \
...
训练后的LoRA权重和配置存放${output_dir}/sft_lora_model
,可用于后续的合并流程。
(以下文件整理步骤已被整合到训练脚本,无需执行,此处仅供留存参考,并将在之后的更新中删除)
-
创建一个文件夹
${lora_model}
,用于存放LoRA模型 -
将
${output_dir}
中训练好的pytorch_model.bin
移动到${lora_model}
,并命名为adapter_model.bin
mv ${output_dir}/pytorch_model.bin ${lora_model}/adapter_model.bin
-
将Chinese-Alpaca-LoRA(7B、13B、是否是Plus均可)中的tokenizer相关文件复制到
${lora_model}
cp chinese-alpaca-plus-lora-7b/*token* ${lora_model}/
-
将Chinese-Alpaca-LoRA中的
adapter_config.json
复制到${lora_model}
cp chinese-alpaca-plus-lora-7b/adapter_config.json ${lora_model}/
- 最后,编辑
${lora_model}/adapter_config.json
文件,修改其中的参数,确认其中的lora_alpha
,r
,modules_to_save
,target_modules
等参数与实际训练用的参数一致。
完成!现在${lora_model}
可以用于后续的合并流程了。
- 模型合并与转换
- 模型量化、推理、部署
- 效果与评测
- 训练细节
- 常见问题
- Model Reconstruction
- Model Quantization, Inference and Deployment
- System Performance
- Training Details
- FAQ