大模型面试准备(十):大模型数据处理方法及优秀的开源数据介绍-SlimPajama

时间:2024-04-08 11:53:55

SlimPajama[11] 是由 CerebrasAI 公司针对 RedPajama 进行清洗和去重后得到的开源数据集合。原始 RedPajama 包含 1.21 万亿词元(1.21T Token),经过处理后的 SlimPajama 数据集包含 6270 亿词元(627B Token)。SlimPajama 还开源了用于对数据集进行端到端预处理的脚本。

RedPajama 是由 TOGETHER 联合多家公司发起的开源大语言模型项目,试图严格按照 LLaMA 模型论文中的方法构造大语言模型训练所需数据。虽然 RedPajama 数据质量较好,但是 CerebrasAI 的研究人员发现 RedPajama 数据集还是存在两个问题:1)一些语料中缺少数据文件;
2)数据集中包含大量重复数据。
为此,CerebrasAI 的研究人员开始针对 RedPajama 数据集开展进一步的处理。

SlimPajama 的整体处理过程如下图所示。整体处理包括多个阶段:NFC 正规化、清理、去重、文档交错、文档重排、训练集和保留集拆分,以及训练集与保留集中相似数据去重等步骤。所有步骤都假定整个数据集无法全部装载到内存中,并分布在多个进程中进行处理。使用 64 个 CPU,大约花费 60 多个小时就是完成 1.21 万亿词元处理。在整个处理过程中所需要内存峰值为 1.4TB。

图片

SlimPajama 处理详细流程如下:

(1) NFC 正则化(NFC Normalization)

目标是去除非 Unicode 字符,SlimPajama 遵循 GPT-2 的规范,采用 NFC(Normalization Form C)正则化方法。NFC 正则化的命令示例如下:

python preprocessing/normalize_text.py \
    --data_dir <prefix_path>/RedPajama/arxiv/ \
    --target_dir <prefix_path>/RedPajama_norm/arxiv/

(2) 过滤短文档(Filter Short Documents)

RedPajama 的源文件中有 1.86% 包含了下载错误或长度较非常短的内容,这些内容对于模型训练没有作用。在去除标点、空格、换行和制表符后,过滤了长度少于 200 个字符的文档。查找需要过滤的文档的命令示例如下:

python preprocessing/filter.py \
    <prefix_path>/RedPajama_norm/<dataset_name>/ \
    <prefix_path>/RedPajama_filtered.pickle <n_docs> \
    <dataset_name> <threshold>

(3) 去重(Deduplication)

为了对数据集进行全局去重(包括语料库内和语料库间的去重),SlimPajama 使用了 datasketch 库,并进行了一定的优化以减少内存消耗并增加并行性。采用了生产者-消费者模式,可以将运行时占主导地位的 I/O 操作进行有效的并行。整个去重过程包括多个阶段:(a)构建 MinHashLSH 索引、(b)在索引中进行查询以定位重复项、(c)构建图表示以确定重复连通域、(d)最后过滤每个成分中的重复项。

(a) MinHash 生成(MinHash Generation):

为了计算每个文档的 MinHash 对象,首先从每个文档中去除标点、连续空格、换行和制表符,并将其转换为小写。接下来,构建了13-gram 的列表,这些 n-gram 作为特征用于创建文档签名,并添加到 MinHashLSH 索引中。MinHash 生成的命令示例如下:

python dedup/to_hash.py <dataset_name> \
    <prefix_path>/RedPajama_norm/<dataset_name>/\
    <prefix_path>/RedPajama_minhash/<dataset_name>/ \
    <n_docs> <iter> <index_start> <index_end> \
    -w <ngram_size> -k <buffer_size>

(b) 重复对生成(Duplicate Pairs Generation)

使用 Jaccard 相似度计算文档之间相似度,设置阈值为 0.8 来确定一对文档是否应被视为重复。SlimPajama 的实现使用了 –range 和 –bands 参数,可在给定 Jaccard 阈值的情况下使用 datasketch/lsh.py 进行计算。重复对生成的命令示例如下:

python dedup/generate_duplicate_pairs.py \
    --input_dir <prefix_path>/RedPajama_minhash/ \
    --out_file <prefix_path>/redpj_duplicates/duplicate_pairs.txt \
    --range <range> --bands <bands> --processes <n_processes>

© 重复图构建以及连通域查找(Duplicate Graph Construction & Search for Connected Components)

确定了重复的文档对之后,需要找到包含彼此重复文档的连通域。例如根据以下文档对:(A, B)、(A, C)、(A, E),可以形成一个 (A, B, C, E) 的组,并仅保留该组中的一个文档。可以使用如下命令构建重复图:

python dedup/generate_connected_components.py \
    --input_dir <prefix_path>/redpj_duplicates \
    --out_file <prefix_path>/redpj_duplicates/connected_components.pickle

(d) 生成最终重复列表(Generate Final List of Duplicates)

根据连通域构建创建一个查找表,以便稍后过滤出重复项。以下是生成重复项列表的命令示例:

python preprocessing/shuffle_holdout.py pass1 \
    --input_dir <prefix_path>/RedPajama_norm/ \
    --duplicates <prefix_path>/redpj_duplicates/duplicates.pickle \
    --short_docs <prefix_path>/RedPajama_filtered.pickle\
    --out_dir <prefix_path>/SlimPajama/pass1

(4) 交错和重排(Interleave & Shuffle)

大语言模型训练大都是在多源数据集上进行,需要使用指定的权重混合这些数据源。SlimPajama 数据集中默认从每个语料库中采样 1 轮,但是可以 通过 preprocessing/datasets.py 中更新采样权重。除了混合数据源外,还要执行随机重排操作以避免任何顺序偏差。交错和重排的命令示例如下:

python preprocessing/shuffle_holdout.py pass1 \
    --input_dir <prefix_path>/RedPajama_norm/ \
    --duplicates <prefix_path>/redpj_duplicates/duplicates.pickle \
    --short_docs <prefix_path>/RedPajama_filtered.pickle \
    --out_dir <prefix_path>/SlimPajama/pass1

(5) 训练和保留集合切分(Split Dataset into Train and Holdout)

这一步主要是完成第二次随机重拍并创建了保留集。为了加快处理速度,将源数据分成块并行处理。以下是命令示例:

for j in {1..20}
    do
        python preprocessing/shuffle_holdout.py pass2 "$((j-1))" "$j" "$j" \
            --input_dir <prefix_path>/SlimPajama/pass1 \
            --train_dir <prefix_path>/SlimPajama/train \
            --holdout_dir <prefix_path>/SlimPajama/holdout > $j.log 2>&1 &
    done

(6) 训练集与保留集中重复去除(Deduplicate Train against Holdout)

最后一步是确保训练集和保留集之间没有重叠。为了去除训练集的污染,应用了 SHA256 哈希算法来查找训练集和保留集之间的精确匹配项。然后,从训练集中过滤出这些精确匹配项。以下是命令示例:

python dedup/dedup_train.py 1 \
    --src_dir <prefix_path>/SlimPajama/train \
    --tgt_dir <prefix_path>/SlimPajama/holdout \
    --out_dir <prefix_path>/SlimPajama/train_deduped
for j in {2..20}
do
    python dedup/dedup_train.py "$j" \
        --src_dir <prefix_path>/SlimPajama/train \
        --tgt_dir <prefix_path>/SlimPajama/holdout \
        --out_dir <prefix_path>/SlimPajama/train_deduped > $j.log 2>&1 &
done

相关文献:
[1] Gao L, Biderman S, Black S, et al. The pile: An 800gb dataset of diverse text for language modeling[J]. arXiv preprint arXiv:2101.00027, 2020.
[2] Endrédy I, Novák A. More effective boilerplate removal-the goldminer algorithm[J]. Polibits, 2013 (48):79-83. [3] Laurenccon H, Saulnier L, Wang T, et al. The bigscience roots corpus: A 1.6 tb composite multilingual dataset[J]. Advances in Neural Information Processing Systems, 2022, 35:31809-31826.
[4] McMillan-Major A, Alyafeai Z, Biderman S, et al. Documenting geographically and contextually diverse data sources: The bigscience catalogue of language data and resources[J]. arXiv preprint arXiv:2201.10066, 2022.
[5] Charikar M S. Similarity estimation techniques from rounding algorithms[C]//Proceedings of the thiry-fourth annual ACM symposium on Theory of computing. 2002: 380-388.
[6] Penedo G, Malartic Q, Hesslow D, et al. The refinedweb dataset for falcon llm: outperforming curated corpora with web data, and web data only[J]. arXiv preprint arXiv:2306.01116, 2023.
[7] Barbaresi A. Trafilatura: A web scraping library and command-line tool for text discovery and extraction[C]//Proceedings of the 59th Annual Meeting of the Association for Computational Linguistics and the 11th International Joint Conference on Natural Language Processing: System Demonstrations. 2021: 122-131.
[8] Wenzek G, Lachaux M A, Conneau A, et al. Ccnet: Extracting high quality monolingual datasets from web crawl data[C]//Proceedings of the Twelfth Language Resources and Evaluation Conference. 2020: 4003-4012.
[9] Rae J W, Borgeaud S, Cai T, et al. Scaling language models: Methods, analysis & insights from training gopher[J]. arXiv preprint arXiv:2112.11446, 2021.
[10] Broder A Z. On the resemblance and containment of documents[C]//Proceedings. Compression and Complexity of SEQUENCES 1997 (Cat. No. 97TB100171). IEEE, 1997: 21-29.
[11] Soboleva D, Al-Khateeb F, Myers R, et al. SlimPajama: A 627B token cleaned and deduplicated version of RedPajama[EB/OL]. 2023. https://huggingface.co/datasets/cerebras/SlimPajama-627B.
[12] 《大规模语言模型——从理论到实践》