searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Chinese LLaMA2预训练和指令精调实战-预训练

2023-09-05 08:11:09
334
0

一、离线环境搭建

参考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加速训练

 

  • 模型合并,参考二训练前准备中模型合并部分

四、精调

0条评论
0 / 1000
l****n
28文章数
5粉丝数
l****n
28 文章 | 5 粉丝
原创

Chinese LLaMA2预训练和指令精调实战-预训练

2023-09-05 08:11:09
334
0

一、离线环境搭建

参考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加速训练

 

  • 模型合并,参考二训练前准备中模型合并部分

四、精调

文章来自个人专栏
AI-llama大模型,go语言开发
28 文章 | 2 订阅
0条评论
0 / 1000
请输入你的评论
1
1