Skip to content

pt_scripts_zh

Xin Yao edited this page Jan 18, 2024 · 10 revisions

预训练脚本

⚠️重要提示⚠️

  • 该代码仅适用于特定PEFT版本,运行脚本前请依照requirements安装要求的依赖版本

  • 运行前确保拉取仓库最新版代码:git pull

训练步骤

训练脚本:scripts/training/run_clm_pt_with_peft.py

进入项目的scripts/training目录,运行bash run_pt.sh进行指令精调,默认使用单卡。运行前用户应先修改脚本并指定相关参数,脚本中的相关参数值仅供调试参考run_pt.sh的内容如下:

########参数设置########
lr=2e-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/dir
chinese_tokenizer_path=path/to/chinese/llama-2/tokenizer/dir
dataset_dir=path/to/pt/data/dir
data_cache=temp_data_cache_dir
per_device_train_batch_size=1
gradient_accumulation_steps=1
output_dir=output_dir
block_size=512

deepspeed_config_file=ds_zero2_no_offload.json

########启动命令########
torchrun --nnodes 1 --nproc_per_node 1 run_clm_pt_with_peft.py \
    --deepspeed ${deepspeed_config_file} \
    --model_name_or_path ${pretrained_model} \
    --tokenizer_name_or_path ${chinese_tokenizer_path} \
    --dataset_dir ${dataset_dir} \
    --data_cache_dir ${data_cache} \
    --per_device_train_batch_size ${per_device_train_batch_size} \
    --do_train \
    --seed $RANDOM \
    --fp16 \
    --num_train_epochs 1 \
    --lr_scheduler_type cosine \
    --learning_rate ${lr} \
    --warmup_ratio 0.05 \
    --weight_decay 0.01 \
    --logging_strategy steps \
    --logging_steps 10 \
    --save_strategy steps \
    --save_total_limit 3 \
    --save_steps 500 \
    --gradient_accumulation_steps ${gradient_accumulation_steps} \
    --preprocessing_num_workers 8 \
    --block_size ${block_size} \
    --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 \
    --save_safetensors False \
    --load_in_kbits 16 \
    --gradient_checkpointing \
    --ddp_find_unused_parameters False

部分参数的解释如下:

  • --dataset_dir: 预训练数据的目录,可包含多个以txt结尾的纯文本文件
  • --data_cache_dir: 指定一个存放数据缓存文件的目录
  • --use_flash_attention_2: 启用FlashAttention-2加速训练
  • --load_in_kbits: 可选择参数为16/8/4,即使用fp16或8bit/4bit量化进行模型训练,默认fp16训练。

这里列出的其他训练相关超参数,尤其是学习率以及和total batch size大小相关参数仅供参考。请在实际使用时根据数据情况以及硬件条件进行配置。

支持的训练模式

【务必仔细核对】 以下是脚本支持的训练模式,请根据相应情况传入model_name_or_path。本项目中LLaMA-2模型与Alpaca-2模型使用相同的tokenizer,不再进行区分。不支持未在表格中的模式,如要修改请自行debug。

用途 model_name_or_path tokenizer_name_or_path 最终模型词表大小
基于原版LLaMA-2训练中文LLaMA-2 LoRA 原版HF格式的LLaMA-2 中文LLaMA-2的tokenizer(55296) 55296
基于中文LLaMA-2,在新的LoRA上继续预训练 HF格式的完整中文LLaMA-2 中文LLaMA-2的tokenizer(55296) 55296
基于中文Alpaca-2,在新的LoRA上继续预训练 HF格式的完整中文Alpaca-2 中文LLaMA-2的tokenizer(55296) 55296

关于显存占用

  • 如果机器的显存比较紧张,可以删去脚本中的--modules_to_save ${modules_to_save} \, 即不训练embed_tokens和lm_head(这两部分参数量较大),只训练LoRA参数。
    • 仅可在基于中文LLaMA-2或Alpaca-2的基础上训练时进行此操作
  • 减小block_size也可降低训练时显存占用,如可将block_size设置为256。
  • 开启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_pt_with_peft.py \
    --deepspeed ${deepspeed_config_file} \
    ...

训练后文件整理

训练后的LoRA权重和配置存放于${output_dir}/pt_lora_model,可用于后续的合并流程。

Clone this wiki locally