| ## 数据预处理 |
| 建议在PAI灵骏智算服务中的DSW实例中准备预训练数据,以下以中文wudao2.0数据集的准备流程为例,给出数据预处理指引: |
| 下载WuDaoCorpora2.0开源数据集到/mnt/workspace/llama3-datasets工作目录下,我们提供了部分样例数据作为示例,用户可通过以下命令下载和解压: |
| ```shell |
| wget https://atp-modelzoo.oss-cn-hangzhou.aliyuncs.com/release/datasets/WuDaoCorpus2.0_base_sample.tgz |
| tar zxvf WuDaoCorpus2.0_base_sample.tgz |
| ``` |
| 假设解压后的文件夹命名为wudao_200g,该文件夹中的**原始**wudao数据集的格式和大小如下截图所示: |
|  |
| 我们为Megatron-LM训练准备了数据预处理流程,您可以根据自己的需要选择不同的处理方式。 |
| #### Megatron-LM训练数据准备 |
| mmap数据是一种预先执行tokenize处理的数据格式,可以极大减少训练微调过程中等待数据读入的时间,当数据量极大时,优势显著。 |
| |
| 1. 对Wudao数据执行数据集清洗并进行文件格式转换,具体流程可参考如下的bash脚本,最终生成汇总的**merged_wudao_cleaned.json**。 |
| ```bash |
| #! /bin/bash |
| set -ex |
| # 请在此处设置原始数据所在路径 |
| data_dir=/mnt/workspace/llama3-datasets/wudao_200g |
| |
| #开始数据清洗流程 |
| dataset_dir=$(dirname $data_dir) |
| mkdir -p ${dataset_dir}/cleaned_wudao_dataset |
| cd ${dataset_dir}/cleaned_wudao_dataset |
| wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/llama2-codes/preprocess_wudao2.py |
| # 此处与上一节不同,增加了key参数设为text |
| python preprocess_wudao2.py -i ${data_dir} -o ${dataset_dir}/cleaned_wudao_dataset -k text -p 32 |
| |
| # 合并清洗后的数据 |
| mkdir ${dataset_dir}/wudao |
| cd ${dataset_dir}/wudao |
| find ${dataset_dir}/cleaned_wudao_dataset -name "*.json" -exec cat {} + > ${dataset_dir}/wudao/merged_wudao_cleaned.json |
| rm -rf ${dataset_dir}/cleaned_wudao_dataset |
| |
| ``` |
| 脚本执行完成后,llama3-datasets内部文件结构如下,新增一个wudao文件夹: |
| ```bash |
| llama3-datasets |
| ├── wudao_200g |
| └── wudao |
| └── merged_wudao_cleaned.json |
| ``` |
| |
| 2. 利用第一节生成的**merged_wudao_cleaned.json**文件,将数据拆分成若干组并压缩,便于后续实现多线程处理: |
| ```bash |
| apt-get update |
| apt-get install zstd |
| |
| # 此处设置分块数为10,如数据处理慢可设置稍大 |
| NUM_PIECE=10 |
| |
| # 对merged_wudao_cleaned.json文件进行处理 |
| mkdir -p ${dataset_dir}/cleaned_zst/ |
| # 查询数据总长度,对数据进行拆分 |
| NUM=$(sed -n '$=' ${dataset_dir}/wudao/merged_wudao_cleaned.json) |
| echo "total line of dataset is $NUM, data will be split into $NUM_PIECE pieces for processing" |
| NUM=`expr $NUM / $NUM_PIECE` |
| echo "each group is processing $NUM sample" |
| split_dir=${dataset_dir}/split |
| mkdir $split_dir |
| split -l $NUM --numeric-suffixes --additional-suffix=.jsonl ${dataset_dir}/wudao/merged_wudao_cleaned.json $split_dir/ |
| |
| # 数据压缩 |
| o_path=${dataset_dir}/cleaned_zst/ |
| mkdir -p $o_path |
| files=$(ls $split_dir/*.jsonl) |
| for filename in $files |
| do |
| f=$(basename $filename) |
| zstd -z $filename -o $o_path/$f.zst & |
| done |
| rm -rf $split_dir |
| rm ${dataset_dir}/wudao/merged_wudao_cleaned.json |
| |
| ``` |
| 脚本执行完成后,llama3-datasets内部文件结构如下,新增一个cleaned_zst文件夹,每个子文件夹里有10个压缩文件: |
| ```bash |
| llama3-datasets |
| ├── wudao_200g |
| ├── wudao |
| └── cleaned_zst |
| ├── 00.jsonl.zst |
| │ ... |
| └── 09.jsonl.zst |
| ``` |
|
|
| 3. 制作MMAP格式预训练数据集。 |
|
|
| 前往[Pai-Megatron-Patch](https://github.com/alibaba/Pai-Megatron-Patch)开源网站获取Megatron模型训练工具Pai-Megatron-Patch源代码并拷贝到工作目录/mnt/workspace/下。 |
| ```bash |
| # 开源网站获取训练代码 |
| git clone --recurse-submodules https://github.com/alibaba/Pai-Megatron-Patch.git |
| ``` |
|
|
| 在DSW的Terminal中进入代码目录:/mnt/workspace/Pai-Megatron-Patch/toolkits/pretrain_data_preprocessing。查看run_make_pretraining_dataset.sh脚本内容。里面有5个启动参数需要在运行时输入,具体参数列表如下: |
| ``` |
| MEGATRON_PATCH_PATH=$1 # 设置Megatron Patch的代码路径 |
| input_data_dir=$2 # 打包后的wudao数据集的文件夹路径 |
| tokenizer=$3 # llamabpe |
| output_data_dir=$4 # 输出到bin和idx文件目录 |
| load_dir=$5 # tokenizer_config.json文件路径 |
| ``` |
| 运行示例如下所示: |
| ```bash |
| |
| # 请在此处设置数据集路径和工作路径 |
| export dataset_dir=/mnt/workspace/llama3-datasets |
| export WORK_DIR=/mnt/workspace |
| |
| # 分别为训练集、验证集生成mmap格式预训练数据集 |
| cd ${WORK_DIR}/Pai-Megatron-Patch/toolkits/pretrain_data_preprocessing |
| bash run_make_pretraining_dataset.sh \ |
| ../.. \ |
| ${dataset_dir}/cleaned_zst/ \ |
| llamabpe \ |
| ${dataset_dir}/ \ |
| ${WORK_DIR}/llama3-ckpts/Meta-Llama-3-8B |
| rm -rf ${dataset_dir}/cleaned_zst |
| ``` |
| 脚本执行完成后,llama3-datasets内部文件结构如下,wudao文件夹里有2个名字相同后缀不同的mmap文件: |
| ```bash |
| llama3-datasets |
| ├── wudao_200g |
| └── wudao |
| ├── wudao_llama3bpe_content_document.bin |
| └── wudao_llama3bpe_content_document.idx |
| ``` |
| #### 小规模预处理数据下载试用 |
| 为方便用户试用,我们也提供了已经处理好的小规模数据,可直接下载使用 |
| ```bash |
| cd /mnt/workspace/llama3-datasets |
| wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/llama3-datasets/wudao_llama3bpe_content_document.bin |
| wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/llama3-datasets/wudao_llama3bpe_content_document.idx |
| wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/llama3-datasets/alpaca_zh-llama3-train.json |
| wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/llama3-datasets/alpaca_zh-llama3-valid.json |
| ``` |