一、离线环境搭建
参考llama2大模型训练实战连载文《Chinese LLaMA2预训练和指令精调实战-离线环境搭建》
二、训练前准备
参考llama2大模型训练实战连载文《Chinese LLaMA2预训练和指令精调实战-训练前准备》
三、预训练
(一)、词表扩充-chinese tokenizer
- chinese llama2没有提供词表扩充步骤,可以参考chinese llama训练细节中的github.com/ymcui/Chinese-LLaMA-Alpaca/wiki/
- 为什么进行词表扩充?
- LLaMA2模型的词表大小是32K,主要针对英语进行训练,对中文的支持不理想,仅包含很少的中文字符,所以需要多个byte token才能拼成一个完整的汉字,编解码效率很低。
- 具体实现
- 在通用中文语料上训练了基于github.com/google/sentencepiece的中文词表并与原版LLaMA2模型的32K词表进行合并得到新的tokenizer.model
python merge_tokenizers.py \
--llama_tokenizer_dir llama_tokenizer_dir \
--chinese_sp_model_file chinese_sp_model_file
# 参数解释
llama_tokenizer_dir:指向存放原版LLaMA tokenizer的目录
chinese_sp_model_file:指向用sentencepiece训练的中文词表文件
-
- chinese llama中所使用的在中文通用语料上训练的20K中文词表可以在github.com/ymcui/Chinese-LLaMA-Alpaca/tree/main/scripts/merge_tokenizer/chinese_sp.model下载。
- 使用上述词表进行扩充或者基于特有领域的语料训练词表对llama tokenizer进行扩充,代码github.com/ymcui/Chinese-LLaMA-Alpaca/blob/main/scripts/merge_tokenizer/merge_tokenizers.py供参考
- 词表训练可以参考sentencepiece。
(二)、中文预训练数据集
git clone github.com/shjwudp/shu.gi
- 数据集格式,.txt结尾
(三)、基于LoRA的二次预训练
- 第一阶段(llama有第一阶段,但是成本很高已经跳过该阶段,llama2没有给出该阶段)
- 第二阶段(llama2基于LoRA进行二次预训练)
- 训练脚本:github.com/ymcui/Chinese-LLaMA-Alpaca-2/blob/main/scripts/training/run_clm_pt_with_peft.py
- 选择
用途 | 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 |
-
- 预训练脚本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=/root/llama/all_transformer
chinese_tokenizer_path=/root/llama/all_transformer
dataset_dir=/root/llama/data
data_cache=./cache/
per_device_train_batch_size=1
gradient_accumulation_steps=1
output_dir=output_dir
block_size=512
resume_from=output_dir/checkpoint-24000
training_steps=25000
deepspeed_config_file=scripts/training/ds_zero2_no_offload.json
########启动命令########
torchrun --nnodes 1 --nproc_per_node 1 scripts/training/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} \
--validation_split_percentage 0.001 \
--per_device_train_batch_size ${per_device_train_batch_size} \
--do_train \
--seed $RANDOM \
--fp16 \
--max_steps ${training_steps} \
--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 \
--resume True \
--resume_from_checkpoint ${resume_from} \
--gradient_checkpointing \
--ddp_find_unused_parameters False
# 参数解释
dataset_dir: 预训练数据的目录,可包含多个以txt结尾的纯文本文件
data_cache_dir: 指定一个存放数据缓存文件的目录
flash_attn: 启用FlashAttention-2加速训练
- 模型合并,参考二训练前准备中模型合并部分