赞
踩
该代码仅适用于特定PEFT版本,运行脚本前请从源码安装commit id为13e53fc的Peft。
如果使用其他版本的PEFT或修改部分训练参数设置(如不使用deepspeed),不能保证模型可以正常训练。
运行前确保拉取仓库最新版代码:git pull
进入项目的scripts/training
目录,运行bash run_sft.sh
进行指令精调,默认使用单卡。运行前用户应先修改脚本并指定相关参数,脚本中的相关参数值仅供调试参考。run_sft.sh的内容如下:
########参数部分######## lr=1e-4 lora_rank=64 lora_alpha=128 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-2/or/merged/llama-2/dir/or/model_id chinese_tokenizer_path=path/to/chinese/llama-2/tokenizer/dir dataset_dir=path/to/sft/data/dir per_device_train_batch_size=1 per_device_eval_batch_size=1 gradient_accumulation_steps=1 output_dir=output_dir peft_model=path/to/peft/model/dir validation_file=validation_file_name max_seq_length=1024 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 \ --num_train_epochs 2 \ --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 ${max_seq_length} \ --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-LLaMA-2 tokenizer所在的目录。⚠️ 本项目中LLaMA-2模型与Alpaca-2模型使用相同的tokenizer,不再进行区分。--dataset_dir
: 指令精调数据的目录,包含一个或多个以json
结尾的Stanford Alpaca格式的指令精调数据文件--validation_file
: 用作验证集的单个指令精调文件,以json
结尾,同样遵循Stanford Alpaca格式--flash_attn
: 启用FlashAttention-2加速训练Stanford Alpaca格式如下:
- [
- {"instruction" : ...,
- "input" : ...,
- "output" : ...},
- ...
- ]
该脚本支持以下训练模式。不支持未在表格中的模式,如要修改请自行debug。
模型 | model_name_or_path | peft_path | lora params |
---|---|---|---|
基于Chinese-LLaMA-2 LoRA进行指令精调 | 原版HF格式的LLaMA-2 | Chinese-LLaMA-2 LoRA | 无需指定 |
基于Chinese-Alpaca-2 LoRA进行指令精调 | 原版HF格式的LLaMA-2 | Chinese-Alpaca-2 LoRA | 无需指定 |
基于Chinese-LLaMA-2训练全新的指令精调LoRA权重 | 完整(合并Chinese-LLaMA-2-LoRA后)的HF格式Chinese-LLaMA-2模型 | 勿提供此参数,并且从脚本中删除 --peft_path | 需设置--lora_rank 、--lora_alpha 、--lora_dropout 、--trainable 和--modules_to_save 参数 |
基于Chinese-Alpaca-2训练全新的指令精调LoRA权重 | 完整(合并Chinese-Alapca-2-LoRA后)的HF格式Chinese-Alpaca-2模型 | 勿提供此参数,并且从脚本中删除 --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 \
再尝试max_seq_length
也可降低训练时显存占用,如可将block_size
设置为512。请参考以下启动方式:
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
,可用于后续的合并流程。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。