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

2023-09-16 12:06:25

预训练

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

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

第一阶段预训练

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

第二阶段预训练

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

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

代码、模型、数据集准备

代码准备

下载代码。

git clone https://github.com/ymcui/Chinese-LLaMA-Alpaca.git
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等)是否修改视自身情况而定。

# 运行脚本前请仔细阅读wiki(https://github.com/ymcui/Chinese-LLaMA-Alpaca-2/wiki/pt_scripts_zh)
# Read the wiki(https://github.com/ymcui/Chinese-LLaMA-Alpaca-2/wiki/pt_scripts_zh) carefully before running the script
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=../llama-2-7b
chinese_tokenizer_path=./llama2_chinese3
dataset_dir=./pt_dataset
data_cache=./pt_dataset_cache
per_device_train_batch_size=1
gradient_accumulation_steps=8
block_size=512
output_dir=./output_dir

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} \
    --validation_split_percentage 0.001 \
    --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 200 \
    --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} \
    --lora_dropout ${lora_dropout} \
    --modules_to_save ${modules_to_save} \
    --torch_dtype float16 \
    --load_in_kbits 16 \
    --gradient_checkpointing \
    --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:指定保存全量模型权重的目录,默认为./
pretrained_model=../llama-2-7b
chinese_tokenizer_path=./llama2_chinese3
lora_model=./output_dir/pt_lora_model
output_dir=./merged_output_dir

python merge_llama2_with_chinese_lora_low_mem.py \
    --base_model ${pretrained_model} \
    --tokenizer_path ${chinese_tokenizer_path} \
    --lora_model ${lora_model} \
    --output_type huggingface \
    --output_dir ${output_dir}

合并输出如下:

权重合并前后的对比:

1.合并后的

2.原始的

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

更多推荐

Linux 共享内存

#include<sys/ipc.h>#include<sys/shm.h>intshmget(key_tkey,size_tsize,intshmflg);功能:创建一个新的内存段或者获得一个既有的共享内存段的标识。新创建的内存段中的数据都会被初始化为0参数:-key:key_t类型是一个整型,通过这个创建或者找到一

Linux查看程序和动态库依赖的动态库

一.前言在一些时候,我们需要知道一个程序或者动态库所依赖的动态库有哪些。比如,当我们运行一个程序的时候,发现可能会报错,提示找不到某个符号,这时我们就需要知道程序依赖了什么库,从而添加对应需要的动态库。等等,接下来介绍两种方法查看程序和动态库所依赖的动态库。二.方法介绍1.使用objdump命令objdump-pFIL

Toaster - Android 吐司框架,专治 Toast 各种疑难杂症

官网https://github.com/getActivity/Toaster这可能是性能优、使用简单,支持自定义,不需要通知栏权限的吐司想了解实现原理的可以点击此链接查看:Toaster源码集成步骤如果你的项目Gradle配置是在7.0以下,需要在build.gradle文件中加入allprojects{repos

(总目录)springboot - 实现zip文件上传并对zip文件解压, 包含上传oss

全文目录,一步到位1.本文概述1.1本文简介2.功能实现2.1统一文件校验2.2普通(多)文件上传[服务器]2.2.1controller层2.2.2service层2.2.3业务impl实现类2.2.4FileIOUtils工具包代码2.3zip文件的解压2.4图片文件的压缩2.5oss文件后端上传2.6oss文件前

九、【漏洞复现】Struts 2 远程代码执行漏洞s2-046(CVE-2017-5638)

九、【漏洞复现】Struts2远程代码执行漏洞s2-046(CVE-2017-5638)9.1、漏洞原理Struts2是一个基于MVC设计模式的Web应用框架,本质上相当于一个Servlet,在MVC设计模式中,Struts2作为控制器来建立模型与视图进行数据交互。攻击者通过发送恶意构造的HTTP数据包利用该漏洞(通过

vue 把echarts封装成一个方法 并且从后端读取数据 +转换数据格式 =动态echarts 联动echarts表

1.把echarts在methods封装成一个方法mounted在中调用折线图和柱状图mounted调用下边两个方法mounted(){//最早获取DOM元素的生命周期函数挂载完毕console.log('mounted-id',document.getElementById('charts'))this.line()

Comparator 接口使用方法,结合java8新特性及源码分析

目录1Comparator介绍1.1函数式声明1.2简单的小案例2.Comparator中的方法2.1compare抽象方法例子2.2comparing方法源码参考解释详细解释<?superT,?extendsU>讲解comparing代码样例例子comparing中的方法源码分析<T,UextendsComparab

安防视频/视频汇聚平台EasyCVR使用onvif探测添加设备通道详细步骤来啦!

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.2

Nginx

概念nginx什么是nginxnginx是一个高性能的HTTP和正、反向代理的服务器nginx可以干什么可以作为web服务器,可以实现反向代理,可以实现基于反向代理的负载均衡,可以作为静态资源服务器(类似于七牛云)什么时候使用nginx后台搭建集群的时候,访问量较大,使用使用nginx作为静态资源的web服务器-部署前

vue3 自定义Hooks

文章目录前言一、Hooks是什么?二、图片转换Base641.Hooks2.使用三、监听元素宽高(自定义指令+Hooks)1.Hooks2.使用总结前言本文主要记录了vue3学习中自定义Hooks和vue2中Mixins的使用与案例。一、Hooks是什么?Hooks用来处理复用代码逻辑的一些封装,Hooks与Mixin

Python+selenium自动化生成测试报告

批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的。unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLTestRunner一、导入HTMLTestRunner1.这个模块下载不能通过pip安装了,只能下载后手动导入,下载地址:htt

热文推荐