因为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参数,以节省显存
peft_path
下的adapter_config.json
文件,改为"modules_to_save": null
--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}
可以用于后续的合并流程了。
Deleting the wiki page '指令精调脚本' cannot be undone. Continue?
Dear OpenI User
Thank you for your continuous support to the Openl Qizhi Community AI Collaboration Platform. In order to protect your usage rights and ensure network security, we updated the Openl Qizhi Community AI Collaboration Platform Usage Agreement in January 2024. The updated agreement specifies that users are prohibited from using intranet penetration tools. After you click "Agree and continue", you can continue to use our services. Thank you for your cooperation and understanding.
For more agreement content, please refer to the《Openl Qizhi Community AI Collaboration Platform Usage Agreement》