• [NLP] LLM---<训练中文LLama2(三)>对LLama2进行中文预料预训练


    预训练

    预训练部分可以为两个阶段:

    • 第一阶段:冻结transformer参数,仅训练embedding,在尽量不干扰原模型的情况下适配新增的中文词向量。
    • 第二阶段:使用 LoRA 技术,为模型添加LoRA权重(adapter),训练embedding的同时也更新LoRA参数。

    第一阶段预训练

    由于第一阶段预训练会冻结transformer参数,仅训练embedding模型,因此,收敛速度较慢,如果不是有特别充裕的时间和计算资源,建议跳过该阶段。

    第二阶段预训练

    第二阶段预训练使用LoRA技术,为模型添加LoRA权重(adapter),训练embedding的同时也更新LoRA参数。

    本文将分享Chinese-LLaMA-Alpaca  Chinese-LLaMA-Alpaca-2是如何从0到1进行中文词表扩充、模型预训练和微调的整个过程 

    代码、模型、数据集准备

    代码准备

    下载代码。

    1. git clone https://github.com/ymcui/Chinese-LLaMA-Alpaca.git
    2. git clone https://github.com/ymcui/Chinese-LLaMA-Alpaca-2.git

    模型权重 及 Tokenizer 准备

    下载LLaMA2原始权重HF

    数据集准备

    本文预训练数据集使用一些开源书籍,需预先执行下载其中一部分数据用于预训练或者使用其进行词表扩充训练。下载完之后,对其中的数据进行数据清洗,去除一些空行等。

    词表扩充

    可以参考

    [NLP] LLM---<训练中文LLama2(二)>扩充LLama2词表构建中文tokenization_舒克与贝克的博客-CSDN博客

    训练开始

    首先,修改运行脚本run_pt.sh,需要修改的部分参数如下:

    • --model_name_or_path: 原版HF格式的LLaMA模型所在目录
    • --tokenizer_name_or_path: Chinese-LLaMA tokenizer所在的目录
    • --dataset_dir: 预训练数据的目录,可包含多个以txt结尾的纯文本文件
    • --data_cache_dir: 指定一个存放数据缓存文件的目录
    • --output_dir: 模型权重输出路径

    其他参数(如:per_device_train_batch_size、training_steps等)是否修改视自身情况而定。

    1. # 运行脚本前请仔细阅读wiki(https://github.com/ymcui/Chinese-LLaMA-Alpaca-2/wiki/pt_scripts_zh)
    2. # Read the wiki(https://github.com/ymcui/Chinese-LLaMA-Alpaca-2/wiki/pt_scripts_zh) carefully before running the script
    3. lr=2e-4
    4. lora_rank=64
    5. lora_alpha=128
    6. lora_trainable="q_proj,v_proj,k_proj,o_proj,gate_proj,down_proj,up_proj"
    7. modules_to_save="embed_tokens,lm_head"
    8. lora_dropout=0.05
    9. pretrained_model=../llama-2-7b
    10. chinese_tokenizer_path=./llama2_chinese3
    11. dataset_dir=./pt_dataset
    12. data_cache=./pt_dataset_cache
    13. per_device_train_batch_size=1
    14. gradient_accumulation_steps=8
    15. block_size=512
    16. output_dir=./output_dir
    17. deepspeed_config_file=ds_zero2_no_offload.json
    18. torchrun --nnodes 1 --nproc_per_node 1 run_clm_pt_with_peft.py \
    19. --deepspeed ${deepspeed_config_file} \
    20. --model_name_or_path ${pretrained_model} \
    21. --tokenizer_name_or_path ${chinese_tokenizer_path} \
    22. --dataset_dir ${dataset_dir} \
    23. --data_cache_dir ${data_cache} \
    24. --validation_split_percentage 0.001 \
    25. --per_device_train_batch_size ${per_device_train_batch_size} \
    26. --do_train \
    27. --seed $RANDOM \
    28. --fp16 \
    29. --num_train_epochs 1 \
    30. --lr_scheduler_type cosine \
    31. --learning_rate ${lr} \
    32. --warmup_ratio 0.05 \
    33. --weight_decay 0.01 \
    34. --logging_strategy steps \
    35. --logging_steps 10 \
    36. --save_strategy steps \
    37. --save_total_limit 3 \
    38. --save_steps 200 \
    39. --gradient_accumulation_steps ${gradient_accumulation_steps} \
    40. --preprocessing_num_workers 8 \
    41. --block_size ${block_size} \
    42. --output_dir ${output_dir} \
    43. --overwrite_output_dir \
    44. --ddp_timeout 30000 \
    45. --logging_first_step True \
    46. --lora_rank ${lora_rank} \
    47. --lora_alpha ${lora_alpha} \
    48. --trainable ${lora_trainable} \
    49. --lora_dropout ${lora_dropout} \
    50. --modules_to_save ${modules_to_save} \
    51. --torch_dtype float16 \
    52. --load_in_kbits 16 \
    53. --gradient_checkpointing \
    54. --ddp_find_unused_parameters False

    这里为了测试:只在pt_dataset下放了一个只有5000行的文本语料

    root@llm:/home/work/training-llama2# wc -l pt_dataset/*
    5000 pt_dataset/corpus.txt

    具体执行过程如下所示:

    模型输出文件:

    将 LoRA 权重与基础模型合并

    修改权重合并脚本merge_llama2_with_chinese_lora_low_mem.py,新增一个tokenizer_path参数接收分词器目录,同lora_model一样可以传入多个目录,中间用逗号,分割。

    run_merge_pt_chinese.sh

    • --base_model:存放HF格式的LLaMA模型权重和配置文件的目录
    • --lora_model:中文LLaMA/Alpaca LoRA解压后文件所在目录
    • --tokenizer_path:分词器所在目录
    • --output_type: 指定输出格式,可为pth或huggingface。若不指定,默认为pth
    • --output_dir:指定保存全量模型权重的目录,默认为./
    1. pretrained_model=../llama-2-7b
    2. chinese_tokenizer_path=./llama2_chinese3
    3. lora_model=./output_dir/pt_lora_model
    4. output_dir=./merged_output_dir
    5. python merge_llama2_with_chinese_lora_low_mem.py \
    6. --base_model ${pretrained_model} \
    7. --tokenizer_path ${chinese_tokenizer_path} \
    8. --lora_model ${lora_model} \
    9. --output_type huggingface \
    10. --output_dir ${output_dir}

    合并输出如下:

    权重合并前后的对比:

    1.合并后的

    2.原始的

    到现在已经使用扩充的中文词表,对LLama2进行了预训练,生成lora模型,并合并成最后的hf模型

  • 相关阅读:
    数据存储——存储图像
    Vue系列(二)之 基础语法上篇【插值,指令,过滤器,计算属性监听属性】以及购物车实现
    C# 使用Newtonsoft.Json解析嵌套json
    Refractive index contrast of optical waveguide(光波导的折射率对比度)
    Autosar MCAL MCU配置时钟-基于cfg
    QGIS:使用QGIS进行矢量和栅格数据的裁剪
    内核进程的调度与进程切换
    QoS服务质量六拥塞管理原理
    二手物品交易管理系统
    TCP的三次挥手、四次握手
  • 原文地址:https://blog.csdn.net/zwqjoy/article/details/132914341