Pretrain 预训练
数据下载
首先我们要收集海量的预训练数据,然后我们要把数据集统一变成这种格式:
{
"prompt": "对于花园街,你有什么了解或看法吗?",
"response": "花园街(是香港油尖旺区的一条富有特色的街道,位于九龙旺角东部,北至界限街,南至登打士街,与通菜街及洗衣街等街道平行。现时这条街道是香港著名的购物区之一。位于亚皆老街以南的一段花园街,也就是\"波鞋街\"整条街约150米长,有50多间售卖运动鞋和运动用品的店舖。旺角道至太子道西一段则为排档区,售卖成衣、蔬菜和水果等。花园街一共分成三段。明清时代,花园街是芒角村栽种花卉的地方。此外,根据历史专家郑宝鸿的考证:花园街曾是1910年代东方殷琴拿烟厂的花园。纵火案。自2005年起,花园街一带最少发生5宗纵火案,当中4宗涉及排档起火。2010年。2010年12月6日,花园街222号一个卖鞋的排档于凌晨5时许首先起火,浓烟涌往旁边住宅大厦,消防接报4"
}
注意,我们的项目是一个 Chat LLM,所以全都是问答数据
我们把数据集全部放到 data/raw_data
目录下:
数据集包括:
社区问答 json 版 webtext2019zh-大规模高质量数据集
见:nlp_chinese_corpus-webtext2019zh
共410万,清洗后剩余260万。
这个数据集放在 Google Drive 上,我可不希望本地下载之后再上传到服务器上,所以我使用 gdown 来下载,这个地方可以开个 tmux 挂在后台慢慢下
gdown
gdown
是一个 Python 库,用于下载 Google Drive 的文件。它是一个命令行工具,可以从 Google Drive 下载大文件,而无需进行复杂的身份验证过程。gdown 的主要优点是它可以下载大文件,并且可以处理 Google Drive 的配额限制。
安装 gdown
:
pip install gdown
下载 Google Drive 文件:
gdown https://drive.google.com/uc?id=1u2yW_XohbYL2YAK6Bzc5XrngHstQTf0v
baike_qa2018 百科类问答
共140万,清洗后剩余130万。
注:这里原项目用的是 baike_qa2019,但是写的数据来源是这个 GitHub,又不说具体有什么区别,感觉可能就是直接复制过来的,为了下载方便我们还是用 Google Drive 来进行下载
gdown https://drive.google.com/uc?id=1_vgGQZpfSxN_Ng9iTAvE7hM3Z7NVwXP2
中国医药领域问答数据集
见:Chinese medical dialogue data 中文医疗问答数据集
这个就直接 git clone 下载了:
git clone https://github.com/Toyhom/Chinese-medical-dialogue-data.git
共79万,清洗后剩余79万。
知乎问答数据
这是一个 huggingface 数据集,可以用 hf-mirror 镜像下载:
wget https://hf-mirror.com/hfd/hfd.sh
chmod a+x hfd.sh
export HF_ENDPOINT=https://hf-mirror.com
./hfd.sh wangrui6/Zhihu-KOL --dataset --tool aria2c -x 4
这个工具有个好处就是可以断点重下,如果中间有文件下载失败了,可以再运行一遍,工具会自动跳过已经下载好的文件,遇到网络不好的情况,你只要坚持不懈的重新运行下载就行了
共100万行,清洗后剩余97万行。
belle开源的指令训练数据
介绍:BELLE
下载:BelleGroup
我们选取其中的Belle_open_source_1M、train_2M_CN、train_3.5M_CN 中部分回答较短、不含复杂表格结构、翻译任务(没做英文词表)的数据,共370万行,清洗后剩余338万行。
export HF_ENDPOINT=https://hf-mirror.com
./hfd.sh BelleGroup/train_1M_CN --dataset --tool aria2c -x 4
./hfd.sh BelleGroup/train_2M_CN --dataset --tool aria2c -x 4
./hfd.sh BelleGroup/train_3.5M_CN --dataset --tool aria2c -x 4
维基百科(Wikipedia)词条数据
将词条拼凑为提示语,百科的前N个词为回答,使用202309的百科数据,清洗后剩余119万的词条提示语和回答
这个就是之前 Tokenizer 部分的数据,不需要额外下载了
数据处理
数据处理使用 utils/raw_data_process.py
上面下载下来的数据照着代码里面的路径放即可,该解压的解压,该改名的改名,该移动位置的移动位置
训练部分
因为预训练时间很长,首先开一个 tmux 窗口:
tmux new -s train
mamba activate MiniChatLM
如果要开启 DeepSpeed 来预训练:
pip install deepspeed
运行 accelerate config
来进行单机多卡的配置
(MiniChatLM) mengzhuo.chen@dsw-2939-6b55ccb46d-9rwqv:/maindata/data/shared/Security-SFT/cmz/ChatLM-mini-Chinese$ accelerate config----------------------------------------------------------------------------------------------------------------------------------------------------------In which compute environment are you running?
This machine ----------------------------------------------------------------------------------------------------------------------------------------------------------Which type of machine are you using?
multi-GPU
How many different machines will you use (use more than 1 for multi-node training)? [1]:
Should distributed operations be checked while running for errors? This can avoid timeout issues but will be slower. [yes/NO]: yes
Do you wish to optimize your script with torch dynamo?[yes/NO]:yes ----------------------------------------------------------------------------------------------------------------------------------------------------------Which dynamo backend would you like to use?
inductor
Do you want to customize the defaults sent to torch.compile? [yes/NO]:
Do you want to use DeepSpeed? [yes/NO]: yes
Do you want to specify a json file to a DeepSpeed config? [yes/NO]: ----------------------------------------------------------------------------------------------------------------------------------------------------------What should be your DeepSpeed's ZeRO optimization stage?
2 ----------------------------------------------------------------------------------------------------------------------------------------------------------Where to offload optimizer states?
cpu ----------------------------------------------------------------------------------------------------------------------------------------------------------Where to offload parameters?
cpu
How many gradient accumulation steps you're passing in your script? [1]: 8
Do you want to use gradient clipping? [yes/NO]: yes
What is the gradient clipping value? [1.0]:
Do you want to enable `deepspeed.zero.Init` when using ZeRO Stage-3 for constructing massive models? [yes/NO]:
How many GPU(s) should be used for distributed training? [1]:8
----------------------------------------------------------------------------------------------------------------------------------------------------------Do you wish to use FP16 or BF16 (mixed precision)?
bf16
accelerate configuration saved at /home/mengzhuo.chen/.cache/huggingface/accelerate/default_config.yaml
得到对应这个 default_config.yaml
文件的内容:
compute_environment: LOCAL_MACHINE
debug: true
deepspeed_config:
gradient_accumulation_steps: 8
gradient_clipping: 1.0
offload_optimizer_device: cpu
offload_param_device: cpu
zero3_init_flag: false
zero_stage: 2
distributed_type: DEEPSPEED
downcast_bf16: 'no'
dynamo_config:
dynamo_backend: INDUCTOR
machine_rank: 0
main_training_function: main
mixed_precision: bf16
num_machines: 1
num_processes: 8
rdzv_backend: static
same_network: true
tpu_env: []
tpu_use_cluster: false
tpu_use_sudo: false
use_cpu: false
然后使用项目实现的 train.py
来进行训练:
accelerate launch --multi_gpu --num_processes 8 ./train.py train
从断点处继续训练:
accelerate launch --multi_gpu --num_processes 8 ./train.py train --is_keep_training=True
但是此时直接运行报了错:
FileNotFoundErrorFileNotFoundError: /maindata/data/shared/Security-SFT/cmz/ChatLM-mini-Chinese/data/my_train_dataset.parquet