在参与得物大语言模型(Large Language Model, LLM)项目的深度实践中,笔者亲历了预训练数据的搜集与清洗全过程。这篇文章通过详细梳理现有预训练数据集以及其清洗框架,旨在提供一个全面而实用的参考,以便为 LLM 训练提供快速有效的数据集落地方案。
一、内容概要
- 梳理中英文训练数据集。
- 整理文本清洗框架。
- 总结现有框架的优点、问题和初步解决方案。
二、预训练数据集
大规模的高质量语料是训练大语言模型的关键“养料”。这些语料提供了世界性的知识体系,能够提升语言模型的理解能力和生成质量,同时也能够支持多样化的应用场景。事实上,高质量的文本对于大语言模型的训练和能力表现具有非常重要的影响。一些学者甚至认为:“GPT、PaLM 等模型的领先优势在很大程度上源于它们使用的超大规模且高质量的专有数据。”(Touvron et al, 2023)
英文数据集
图片
RefinedWeb
概况
阿联酋阿布扎比技术创新研究所(Technology Innovation Institute, TII)精心构建了一个用于大模型预训练的数据集——RefinedWeb。这个数据集是通过对 Common Crawl(CC)网页数据进行细致且深入的清洗和过滤得来的。令人惊讶的是,LLM 仅使用经过精细处理的网页数据,就能达到甚至超越使用专有数据集的模型效果。RefinedWeb 的全量数据规模达到了 5T Tokens,其中,已经向公众开源的数据规模则达到了 600B Tokens。
依据 Penedo et al.(2023)的研究,如下图所示,即使只使用经过严密清洗和过滤的网页数据,模型的效果也能与使用多种专有数据的混合方案相媲美。另外,RefinedWeb 数据集已成功训练出了 Falcon-7B、40B 和 180B 等模型。值得一提的是,目前 Falcon-180B 在 Huggingface 开源模型排行榜 OpenLLM Leaderboard 上名列前茅。同时,Shen et al.(2023)分析中指出,RefinedWeb 数据集的质量优于 RedPajama-1T 和 SlimPajama。
图片
清洗规则
虽然 CC 网页数据的规模达到 PB 级,但其质量却相对较低,必须经过深度的清洗和过滤才能满足模型训练的需要。RefinedWeb 的清洗过程包括以下几个步骤:
- 溯源处理:对原始 HTML 网页格式(使用的是 WARC 格式,而不是常见的 WET 格式)进行处理,包括去除广告、网页导航等无效内容。
- URL 过滤:利用黑名单过滤掉包含不健康内容的域名,同时也使用训练关键词过滤工具对 URL 进行过滤。
- 英文文本提取:通过语种鉴别工具从原始数据中提取出英文文本。
- 文本校正与规范化:修正文本中的拼写错误和 Unicode 乱码。
- 文本去重:包括基于 HashLSH 的模糊去重和基于 N-Gram 的精确去重,以降低文本的重复率。
经过深度清洗后,CC 文本的淘汰率接近 90%。尽管如此,TII 团队仍然从近 180TB 的 CC 数据集中清洗出了大约 5T Tokens 的数据,并向公众开源了其中的 600B Tokens 数据。
图片
RedPajama-1T
概况
RedPajama-1T 是由 Together 开源社区发起的项目,它的目标是复现 MetaAI 的 LLaMA 预训练,以推动大语言模型(LLM)开源社区的发展。
- 数据集规模
RedPajama-1T 数据集包含了 1.2T Tokens 的英文数据,未经压缩的数据大小约为 5TB,而经过压缩后的下载大小约为 3TB。
- 数据集来源
RedPajama-1T 数据集的收集方式参照了 LLaMA 论文公开的思路,可从 Hugging Face 官网下载。
- 数据集组成
RedPajama-1T 数据集包含了来自多个不同来源的数据,包括 CommonCrawl、C4、GitHub、Books、ArXiv、Wikipedia 以及 StackExchange 等。
图片
清洗规则
RedPajama-1T 数据集的清洗过程相对简单,主要的去重操作仅限于子集或文档内部。因此,这个数据集的去重并不彻底,在子集之间存在明显重复文本(Shen et al, 2023)。
- Common Crawl 利用开源 CC-NET 框架清洗了五个 Common Crawl 快照(Dumps)数据,主要包括文本提取、去重、语种分类、过滤低质量语料以及结构化输出等步骤。
- C4 数据集直接从 Huggingface 下载,只进行了数据格式的转换。
- GitHub 数据从 Google BigQuery 下载,仅在文件级别进行了去重。此外,仅保留了在 MIT、BSD 或 Apache 许可下分发的项目。
- Wikipedia 可用的 Wikipedia 数据集直接从 Huggingface 下载,数据截止至2023 年 3 月 20 日,包含 20 种不同的语言。已删除了超链接、注释以及其他格式化的文本内容。
- Gutenberg 和 Books3 Gutenberg 和 Books3 PG19 子集直接从 Huggingface 下载,使用 Simhash 算法进行去重处理。
- ArXiv 数据从 Amazon S3 的 Arxiv Requester Pays 存储桶中下载。仅保留了 LaTeX 源文件,同时删除了导言、注释、宏和参考文献。
- StackExchange 仅保留了 28 个访问量最大的帖子,并删除了 HTML 标记。帖子内容被分割成问题-回答,并按照回答的点赞数量进行排序。
SlimPajama
概况
SlimPajama 数据集是由 Cerebras 基于 RedPajama-1T 数据集通过深度去重得到的英文数据集。该团队通过过滤低质量和重复性文本,从 RedPajama-1T 数据集中过滤掉了 49.6% 的 Tokens,从而将数据集规模从 1210B Tokens 缩减为了 627B Tokens。实验结果表明,使用 SlimPajama 训练的模型性能优于使用 RedPajama-1T 数据集训练的模型。
清洗规则
为了提升数据质量,Cerebras开发了一个包含精确和模糊算法的全量去重框架,用于产生 SlimPajama 数据集。处理流程包括以下两个步骤:
- 删除短小且质量较低的文档:首先去除标点符号、空格符号、换行符和制表符,然后删除少于 200 个字符的文档。该步骤淘汰了 1.86% 的文档。
- 利用精确和模糊去重方法:具体来说,这包括 13-Grams 的精确去重方法和 MinHashLSH 的模糊去重方法。通过分布式并行和内存池优化方法,实现了对 1.2T Tokens 的全量去重,滤掉了 49.6% 的重复 Tokens。这个步骤使用了 64 核的 CPU,耗时 2.5 天,内存消耗 1.2TB,最终得到了包含 627B Tokens 的 SlimPajama 数据集。
图片
MassiveText
概况
MassiveText 是由 DeepMind 构建的大规模英文数据集,包含约 23.5 亿个文档,总共约 10.5TB 的文本(Rae et al, 2021)。这个数据集并未开源,其数据来源包括了网页、书籍、新闻文章以及代码等多个领域。MassiveText 数据集被用于训练 Gopher 模型,该模型最大参数规模达到了 280B。
清洗规则
为了确保数据的质量,DeepMind 对 MassiveText 数据集进行了一系列的处理,包括:
- 内容过滤:使用 Google's SafeSearch filter 来过滤非英语文档,以确保数据集的语言统一性。
- 文本提取:该步骤仅针对网页数据源。通过对 HTML 标记的树结构进行分析,识别出在相同级别的语义标签组中出现的自包含、连贯的重要文本块。这些标签组被转换成纯文本,并保留那些在格式上有意义的信息,如缩进、换行和项目符号。
- 低质量过滤:仅针对网页数据源。低质量文本包括网页自动生成的内容或非人类阅读的文本(如用于搜索引擎优化的关键词),以及缺乏上下文、连贯性或实质意义的社交媒体内容。为了过滤低质量文本,采用了以下的启发式算法:
- 移除词数少于 50 或大于 100,000、平均词长小于 3 或大于 10 个字符的文档。
- 移除哈希符号或省略号占比超过 10% 的文档。
- 移除超过 90% 的行以项目符号开头或超过 30% 的行以省略号结尾的文档。
- 过滤停用词后,确保文档中 80% 的单词至少包含一个字母字符。
- 文档内去重:这一步骤仅针对网页数据源。Rae et al.(2021)认为模型生成重复文本可能源于重复的训练数据。为了降低重复率,移除具有高重复率的行、段落或 N-Gram 的文档。
- 文档间去重:使用MinHash算法计算 13-Gram 的 Jaccard 相似度,过滤相似度超过阈值(通常为0.8)的文档。
- 测试数据过滤:确保训练数据和测试数据之间不存在重叠,以保证模型训练和测试的公正性。
The Pile
概况
The Pile 是由 Eleuther AI 社区构建的大规模英文数据集,其规模达到 825GB,包含约 1.4 亿份文档,平均每个文档大小为 5.9 KB(Gao et al, 2020)。这个数据集的优势在于其广泛的数据覆盖范围和详细的分类,由 22 个不同的高质量子集组成。
图片
The Pile 数据集被分为五个主要类别:学术材料、网页、书籍、对话和代码,并被进一步细分为 22 个子集。以下是其中的一些主要子集:
- Pile-CC:基于 CC WARC 格式数据,包括原始网页、元数据和文本提取。这些附属信息有助于过滤掉有害、暴力、煽动犯罪等低质量的网页内容。
- PubMed Central:这是 PubMed 生物医学在线资源库的一个子集,提供近 500 万份出版物的全文。
- Books3:这是一个图书数据集,包含来自 Bibliotik 的内容副本。书籍数据有助于模型学习长距离的上下文关系。
- OpenWebText2:包括自 2020 年起从 Reddit 收集的多语种内容、文档元数据和开源代码。
- ArXiv:这是全球知名的研究论文预印本服务器,主要集中在数学、计算机科学和物理学领域。
- Github:这是一个大型的开源代码库,提供丰富的软件开发代码及相关文本。
- FreeLaw:提供多种形式的法律程序文本,包括摘要、法官书目信息和其他元数据,来自公共领域的自由法。
- Stack Exchange:包含用户在 Stack Exchange 上贡献的内容,涵盖了许多主题,如编程、园艺、佛教等。
- USPTO Backgrounds:这是美国专利商标局授予的专利数据集,包括发明专利背景和技术概述。
- Wikipedia (English):维基百科提供了高质量的文本数据,涵盖了各种领域。
- PubMed Abstracts:来自 PubMed 的 3000 万份出版物的摘要,覆盖生物、医学等领域。
- Project Gutenberg:这是一个经典西方文学的数据集,包含了 1 万多本著名文学作品。
清洗规则
各个子集在构建过程中采用了“分治”思想,根据数据特征定制清洗规则。
- Pile-CC:基于 Common Crawl 的 WARC 格式数据,处理步骤包括文本提取、语言识别(采用 Pycld2 算法,而非 JusText),以及低质量文本过滤(参考Brown et al. 2020,使用训练的分类器来筛选低质量文本)。
- OpenWebText2:根据 Reddit 的投票数据,滤除投票数少于 3 的网页,并采用 MinHashLSH 算法进行去重处理。
- ArXiv:截止到 2020 年 7 月,总计收集了 126 万篇文章。在数据清洗过程中,移除了以:::开头的行。
- GitHub:淘汰了获得 Star 数量少于 100 或大小超过 1GB 的仓库。
- Stack Exchange:仅选择了收到超过 3 个赞的前 3 个回答,并只提取了问答中的纯文本,排除了元数据。问题和答案的格式分别被格式化为 Q:\n\n 和 A:\n\n。
- PubMed Abstracts:仅保留了标题和摘要,一共包含了 15,518,009 个标题和摘要。在处理过程中,将标题和摘要拼接在一起,并删除了所有的版权信息。
- BookCorpus2:这个子集包含了 17868 本书籍。清洗规则包括:
- 保留文档的结构,使其与章节保持一致,与目录非常接近;
- 正确呈现数据表格,因为默认的 Html 2txt 处理对表格的处理结果质量较差;
- 正确保留代码的结构,使源代码在视觉上连贯;
- 将编号列表从“1.”转换为“1.”;
- 对全文进行了 ftfy.fix_text() 处理,将 Unicode 的撇号替换为 ASCII 的撇号,并将 Unicode 的省略号扩展为“...”(三个独立的 ASCII 字符)。
C4
概况
C4 (Colossal Clean Crawled Corpus) 是 Google 提出的一个大规模英文语料库。这个数据集源自 Common Crawl,包含了约 3.65 亿份文档(156B Tokens)(Raffel et al, 2020)。Google 使用该数据集来训练 T5 和 Switch Transformer 模型(Dodge et al, 2021)。
启发式清洗规则
在构建 C4 数据集的过程中,研究者们制定了一系列启发式的数据清洗规则。
- 仅保留以终止标点符号(如句号、感叹号、问号、结束引号、省略号)结尾的文本行。
- 丢弃包含少于 5 个句子的网页,且要求每个句子至少包含 3 个单词。
- 删除包含“List of Dirty, Naughty, Obscene or Otherwise Bad Words”中任何词汇的网页。
- 由于网页警告可能启用 Javascript,因此删除了包含“Javascript”词汇的所有文本行。
- 删除了包含“lorem ipsum”占位符短语的网页。
- 删除了包含大括号“{}”的网页。
- 删除了重复出现的内容。
中文数据集
尽管如此,目前仍有一些规模超过 100GB 的中文数据集已经开源,包括 MNBVC、SkyPile-150B、Wanjuan 1.0、WuDao 和 CLUECorpus2020。这些数据集的存在为中文 LLM 训练提供了资源。
MNBVC
MNBVC 数据集涵盖了各种形式的纯文本中文数据,包括新闻、作文、小说、书籍、杂志、论文、台词、帖子、Wiki、古诗、歌词、商品介绍、笑话、糗事、聊天记录等。所有的数据均收集自互联网。
在 HuggingFace 上,MNBVC 数据集公布的数据类别包括公司年报、Wiki、问答(含知乎最高点赞、Wikihow、Stackexchage、外交部答记者问)、新闻、法律(判决书)、政府文章(如学习强国,政府工作报告)和代码,共 7 个类别。未经压缩的纯中文数据总量达到了 5.4 TB。
图片
图片
MNBVC 数据集提供的文档内容是经过初步清洗的版本,整体来说,数据质量属于中等水平。在数据集中,存在大量的乱码、低质量文本和重复性文本。这些问题会影响 LLM 训练效果。因此在使用之前需要对数据进行精细清洗。以下是 MNBVC 数据集的主要子集:
新闻:
图片
知乎问答(仅包含最高赞1个回答):
外交部问答:
图片
公司财报:
图片
中文 Wiki:
图片
法律判决书:
图片
SkyPile-150B
SkyPile-150B 是昆仑万维专门为 LLM 预训练任务设计的中文数据集,数据源自可公开访问的中文网页。为了保证数据质量,数据集经过了初步的清洗处理,同时使用了 FastText 和 BERT 等工具来过滤低质量的文本。SkyPile-150B 包含 1.66 亿个中文网页,每个网页平均包含 1,000 多个汉字,总的数据规模达到了 592 GB(150B Tokens)。
然而,值得注意的是,该数据集的清洗工作并未达到完全彻底的程度。在数据集中,仍存在一定数量的乱码和不健康内容,同时也包含了一些敏感信息,如电子邮件地址、电话号码或IP地址等。以下是 SkyPile-150B 数据集的主要问题:
- Unicode 乱码:数据集中存在一些无法正确解码的 Unicode 字符。
图片
- 拼音汉字混搭。
图片
Wuanjuan 1.0
Wanjuan 1.0 是由上海 AI 实验室构建的混合数据集,包含三个主要部分:文本数据集、图文数据集和视频数据集。文本部分由各种来源的语料构成,包括网页、百科、书籍、专利、教材、考题等,中文规模达到了 552 GB。在 Wanjuan 1.0 的构建过程中,Html、Text、PDF、Epub 等多种格式的数据都被统一处理为 Jsonl 格式。此外,数据集还经过了细粒度的清洗、去重和价值对齐,从而形成了一份质量较高的预训练语料。
然而,需要注意的是,Wanjuan 1.0 与 MNBVC 有很多相同的主要子集,因此两者在内容上存在较大的重叠。使用前需要在数据集之间进行彻底去重。
图片
WuDaoCorpora
WuDaoCorpora 是由北京智源人工智能研究院(智源研究院)构建的复合数据集,由文本、对话、图文对三部分组成。其中,可申请使用的文本数据规模达到了 200GB。
在构建 WuDaoCorpora 数据集的过程中,该团队采用了 20 多种规则,从 100TB 的原始网页数据中清洗出了最终的数据集。此外,该数据集包含了教育、科技等50+个行业的数据标签,这使得它能够支持多领域预训练模型的训练。
CLUECorpus2020
CLUE 开源社区采用自定义的清洗方法从 2019 年 7 月至 12 月的 Common Crawl(CC)原始数据中提取出了 100 GB 的中文语料。该数据集已经通过了 CLUE Organization 团队的初步验证,以确认其质量和可用性。该数据集已被成功用于从零开始训练 Bert-base 模型。训练后的模型展示了与使用同类高质量数据集训练得到的模型相当的中文处理能力。
然而,需要注意的是,由于清洗过程的力度不够,CLUECorpus2020 中仍然存在一些低质量和不健康的文本。以下列出了一些需要进一步改进和完善的地方:
- 数据繁体转简体:
图片
- 精细化过滤,滤除广告弹窗文本内容:
图片
- 网站警报信息:
图片
- 编码乱码:
多语种
目前,已有多个开源的多语种训练数据集可供研究者使用。其中包括 CC100(由Conneau 等人于 2019 年发布)、OSCAR(由Suárez等人于2019年发布)、ROOTS(由 Laurençon 等人于 2022 年发布)、RedPajama-V2 等。
图片
CC100
CC100 是一个包含 100 种语言的开源数据集,总规模达到了 2.5TB。这份数据集是由 Meta AI 团队使用 CC-Net 框架清洗 2018 年 1 月-2018 年 12 月 的 CC Snapshot 得来。在 CC100 的数据格式中,每个文件都包含由双换行符分隔的文档以及同一文档中由换行符分隔的段落。这样的设计旨在方便数据的处理和使用。
CC100 数据集已被用于训练 XLM-R 模型,训练结果揭示了几个重要的发现:(1)扩大数据规模能显著提升下游任务的表现;(2)增加语种数量、扩大词汇表、增大模型参数规模,这些都有利于提升模型的表现,特别是对于小语种的迁移学习能力。
图片
OSCAR
OSCAR(Open Super-large Crawled Aggregated coRpus)是一个开源项目,其主要目标是处理 Common Crawl 的 WET 文件,以便为词嵌入模型和大型语言模型预训练提供基于网页的多语言数据集。该项目成功地开源了多语种的 OSCAR 数据集,总规模达到了 6.3TB。该数据集包含了 151 种不同的语言,最新版本为 OSCAR 23.01。通过基于 OSCAR 数据库训练的上下文词嵌入 ELMo 模型,研究人员发现,清洗算法能显著降低 Common Crawl 数据的噪声,使其接近 Wikipedia 的质量水平。
此外,OSCAR 项目还开发了一套专门用于分类和过滤 Common Crawl 数据的高性能并行框架(包括 Goclassy 和 Ungoliant)。这个框架重用了 FastText 的线性分类器和预训练的 FastText 模型进行语言识别。
ROOTS
ROOTS 是由 BigScience 团队构建的多语言数据集,其规模达到了 1.6TB。这个数据集被用来训练了一款拥有超过 1700 亿参数的大型模型,即 BLOOM 模型(Scao et al, 2022)。ROOTS 数据集涵盖了 59 种语言,这其中包括 46 种自然语言和 13 种编程语言,提供了丰富的多语种和多模态资源。在其数据来源上,62% 的数据由社区进行搜集和筛选;另外 38% 的数据则来自 OSCAR 数据集,并经过了精细的过滤和校验流程。
图片
为了确保数据集的质量,ROOTS 数据集的清洗过程采取了一系列严格的措施。清洗流程包括:
- 去除重复内容:通过识别和删除相同或几乎相同的文本,确保数据集中的每一份文档都是唯一的。
- 过滤页面代码和网页组件:通过分析和识别 HTML 等页面代码,将这类非自然语言文本从数据集中移除。
- 过滤 SEO 页面:SEO 页面通常包含了大量的关键词和短语,干扰模型训练。
- 过滤不适当的内容:这包括色情、暴力等可能引起不适的内容,这些内容不应被包含在数据集中。
此外,ROOTS 数据集也采用了 Simhash 算法对长文本进行去重,以进一步确保数据的独立性和多样性。同时,也对数据进行了个人信息的去除,以遵守数据隐私和保护的相关规定。
图片
RedPajama-V2
继 RedPajama-1T 之后,Together 开源社区于 2023 年 10 月底发布了多语种数据集 RedPajama-V2。该数据集源自于 84 个 CommonCrawl Dump 文件,包含英语(67%)、德语(10%)、法语(9%)、西班牙语(9%)和意大利语(5%)五种语言,文本规模达到 30T Tokens(约100TB),是迄今为止最完整的CommonCrawl 清洗数据。
RedPajama-V2 数据集采用了 CC-NET 清洗框架,主要包括 URL 过滤、敏感词过滤、语种分类、模糊+精确去重、启发式清洗、文本质量分类。Together 团队融合了多种文本质量评估方法,包括困惑度指标、文本打分模型等,并提供了 40 多种文本质量参考指标。其清洗方法详见(https://github.com/togethercomputer/RedPajama-Data)。
数据集对比和小结
- 英文语料所拥有的规模远超中文,其详细清洗和处理方式也更为完善。与万亿级 Token 的英文开源数据集相比,公开的大型中文数据集规模尚小。
- 多语种数据集越来越受到 LLM 社区的重视。
- 目前并无开源数据集能完全满足中文语言模型的训练需求,存在的问题包括清洗不彻底、规模不足、大量内容重复等。因此,构建一个高质量的大规模中文数据集,是当前的迫切需求。
三、文本清洗框架
文本语料清洗(Text Corpus Cleaning)是自然语言处理中的一项核心任务,该过程对确保数据质量和提高模型效果至关重要。语料清洗的主要步骤包括文本提取、语种分类、去重和过滤等。目前,开源语料清洗框架有 SlimPajama、MNBVC 和 CC-NET 等。
SlimPajama框架
SlimPajama 是由 Cerebras 团队推出的一个去重工具包,为清洗 RedPajama-1T 数据集而设计。它提供了一系列的功能,包括文本规范化、生成 Minhash、匹配重复数据、划分数据集和去重等。而且,通过采取分布式并行和内存池优化技术,该工具可以支持万亿级 Tokens 的同步去重。
SlimPajama 的数据清洗流程如下:
- 通过 Normalize_text 函数做文本规范化处理,包括小写化、去标点等。
- 通过 Filter 函数过滤掉少于 200 字符数的短文档。
- 通过 To_Hash 函数为每个文档生成 Minhash 签名。
- 通过 Generate_Duplicate_Pairs 函数基于 Minhash 签名生成候选重复对。
- 通过 Generate_Connected_Components 函数将候选重复对连接成连通图。
- 通过 Generate_Duplicates 函数从连通图中提取重复文档。
- 通过 Shuffle_Holdout 函数将数据集划分为训练和验证集。
- 通过 Dedup_Train 函数去除训练集中与验证集重复的文档。
MNBVC框架
MNBVC 是来自里屋社区的一款面向中文文本清洗的工具包,专门用于处理 MNBVC 数据。其核心功能包括文本提取、去重和质量评分等。
MNBVC 的数据清洗流程如下:
- 对外部输入的文件进行文件 MD5 和文件大小的重复检测,删除不同来源但实质相同的文件。
- 将大量文本文件(目前仅支持 txt 文件)转换为格式化的、易于查询的数据。
- 对百万级别的文件进行快速去重操作。
- 文件格式重整和输出。
格式化
功能
- 将大量文本txt转化成格式化和易查询 Jsonl 数据。
- 在文本内快速去重。
用法
运行 convert.py 程序,并设置源文件路径和目标路径,指定并发进程数量(--n_process)和重复率阈值(-- threshold)
python convert.py --src_dir /path/to/source/directory --dst_dir /path/to/destination/directory --n_process 4 --threshold 0.7
格式说明
文本内段落重复率高于阈值,被视为问题内容处理,全部保存在problem_*.jsonl,重复率低于阈值则保存在顺序编号 Jsonl 文件,例如1.jsonl。
每个正常文件大小为 500MB,可根据需要通过修改./utils.py 的 mas_size 值。
Jsonl 文件格式为:
{
'文件名': '文件.txt',
'是否待查文件': False,
'是否重复文件': False,
'文件大小': 1024,
'simhash': 0,
'最长段落长度': 0,
'段落数': 0,
'去重段落数': 0,
'低质量段落数': 0,
'段落': []
}
多进程文件去重
功能
对百万量级文件并行处理,在文件间快速去重。
核心函数
- convert_jsonl_to_csv.py
将 Jsonl 文件转化成对应 txt 元数据组成的 csv 文件,仅支持 Jsonl 格式输入文件;
python convert_jsonl_to_csv.py --src_dir /path/to/source/directory --dst_dir /path/to/destination/directory
- multiprocess_deduplication.py
依赖 convert_jsonl_to_csv.py 输出的 csv 文件。支持多进程并发处理,进程数至少为 2。
python multiprocess_deduplication.py --src_dir /path/to/source/directory --n_process 10 --simhash_threshold 3 --jaccard_thresold 0.8
参数说明:
--simhash_threshold 3:指定 Simhash 阈值,默认为 3,出重效果较好且速度较快。值越大运行速度越慢;
--jaccard_thresold 0.8:指定 jaccard 阈值;
--n_process 10:指定并行进程数。
- reset_csv.py
清除 csv 文件去重失败结果,multiprocess_deduplication.py 去重结果会写入 csv 文件,如果参数出错,可以通过 reset_csv.py 清除 csv 状态,从而再次进行去重。
python reset_csv.py --src_dir /path/to/source/directory
--src_dir 指定原始 csv 文件的路径
- write_output_to_jsonl.py
将 csv 去重后的结果再次保存到原始 Jsonl 文件中去。
python write_output_to_jsonl.py --csv_dir /path/to/source/csvdirectory --jsonl_dir /path/to/source/jsonldirectory
--csv_dir:csv 源文件夹路径;
--jsonl_dir:原始 Jsonl 的路径。
示例
python convert_jsonl_to_csv.py --src_dir ./mnbvcfiles --dst_dir ./output_csv
# 假如simhash参数设置错误,simhash_threshold设置成12,导致速度极慢
python multiprocess_deduplication.py --src_dir ./output_csv --n_process 15 --simhash_threshold 12 --jaccard_thresold 0.8
# 先强行结束,在运行reset
python reset_csv.py --src_dir ./output_csv
# 正常跑一遍
python multiprocess_deduplication.py --src_dir ./output_csv --n_process 15 --simhash_threshold 3 --jaccard_thresold 0.8
python write_output_to_jsonl.py --csv_dir ./output_csv --jsonl_dir ./mnbvcfiles
CC-NET框架
CC数据下载
CC 数据包含三种格式:
- WARC,网页原始数据,大约 70TB。
- WAT,重要元数据和记录,大约 17TB。
- WET,纯文本信息,超过 80000 个 WET 文件,大约 8TB。
大部分用户处理的是WET格式文本数据,数据并发批量下载方式:
- 选择 Screenshot。
- 下载 WET File List,解压。
- 逐行读取 WET File List 内容,添加 https://data.commoncrawl.org/ ,获得文件的完整 URL。
- 启动 WGET 命令下载文件。
#!/bin/bash
filename="wet.paths" # 源文件名称
prefix="https://data.commoncrawl.org/" # 前缀
outputfile="new-text-$1.txt" # 保存前缀添加后的数据的文件
let startline=$1*$2
let linenum=$2+2
tail -n +${startline} ${filename} | head -n ${linenum} | sed "s%^%${prefix}%" > $outputfile
# 下载数据
while read -r url; do
wget -c $url -P wet-data
done < $outputfile
echo "Successfully downloaded"
清洗流程和示例
CC-NET 的数据清洗流程主要包含以下三个步骤:
- 预处理:这一步主要从下载的数据中抽取段落,并计算每个段落的哈希值。
- 去重、分类和打分:这一步根据段落的哈希值删除重复的段落。接着,使用基于 Wikipedia 高质量数据训练的分类模型对语料进行语种分类,例如将语料分类为中文、英文、德文等。然后,利用语言模型对语料质量进行打分,并依据困惑度(Perplexity)值将语料划分为 Head、Middle 和 Tail 三种质量级别,其中 Head 级别的质量最高,约占所有语料的 15%。
- 重组:这一步将按语种和质量分类的语料数据重组,并保存为 Json 文件。
图片
清洗命令:
python -m cc_net --config ./config/segment.json
segment.json指定清洗文件数量、语种、清洗步骤和文件路径
{
"hash_in_mem": 2,
"dump": "2019-09",
"num_shards": 4,
"num_segments_per_shard": 1,
"mine_num_processes": 0,
"lang_whitelist": ["en", "zh"],
"pipeline": [
"dedup",
"lid",
"keep_lang",
"sp",
"lm",
"pp_bucket",
"minify",
"split_by_segment"
],
"execution": "debug",
"output_dir": "test_data_4shards",
"mined_dir": "mined_by_segment",
"target_size": "32M",
"cache_dir": "test_data/wet_cache"
}
文本清洗框架对比和小结
- SlimPajama 框架专注于大规模数据集的去重,整套方案支持并行和内存优化,可处理万亿级数据。但目前仅针对英文数据。
- MNBVC 框架面向中文语料清洗,支持文本提取、去重和质量评分。但仅支持文档级别的去重,去重粒度有待细化。
- CC-NET 支持多语种清洗,实现了完整的文本清洗链路,包括语种分类、启发式规则过滤、质量评分和重组输出。但安装较复杂,也缺乏多粒度去重功能。
- 当前清洗框架多局限于特定语种或数据源,没有通用的多语种清洗系统。理想的清洗框架应支持多语种多格式输入,具备大规模并行和可扩展能力,针对不同类型数据提供自定义规则和功能,支持段落、章节、文档等多粒度去重功能等。融合前人方法的优势,建立一个模块化、可配置、可扩展的清洗框架,并提供丰富的规则库,是值得探索的方向。
四、总结和展望
本文从快速构建大型语言模型(LLM)训练数据集的角度出发,全面梳理了中文、英文和多语种数据集及其清洗规则,介绍了常用的数据清洗框架和主要流程,指出现有数据集存在的问题及其初步解决方案。站在开源数据集的肩膀上,通过数据整合和精细治理,我们能快速产出落地方案和结果,从而推动 LLM 的训练和优化任务。
以下是已落地的数据集及其反思:
- 数据类别:已覆盖了所有常见的类别,包括网页、书籍、企业年报、法律文书、问答、新闻、百科、考试、专利、评论、博客、歌词、古诗文、中英平行语料等。
- 训练语种:训练集包含中英双语。大型语言模型如 GPT 系列、PaLM 2、QWEN、BaiChuan2 等,已经从单语种(或双语种)转变为多语种。多语种训练可以通过迁移学习和词表扩容来提升大型语言模型的性能,尤其是对于小语种。
- 数据规模:现有中英高质量文本规模和多样性已初步对齐开源模型。当前全球的中英文高质量语料上限约为 20T Tokens,而开源模型的预训练语料通常在 1~5T Tokens 的规模之间。
- 训练数据采样方式:目前缺乏统一的标准。GPT、Gopher、T5 模型采用的是不均匀采样方式,而 Llama 2、Falcon、PaLM、LaMDA、GLaM 采用的是均匀采样方式(所有数据 Epoch=1)。
- 数据清洗:追求高质量、低重复率已成为共识。我们优先采用精确去重和模糊去重的结合策略。启发式过滤方法存在主观性、片面性和低效性等问题。为改进现有的启发式方法,我们一方面收集和汇总现有的规则,提炼并吸收,以形成更全面的统一规则,提高命中率;另一方面,我们将启发式规则的落地和实现,通过工程化手段提升清洗效率。
- 数据质量评估和校验:当前缺乏统一的标准。常用的方法包括:(1)训练质量分类器,通过阈值滤掉低质量文本,并通过对比方法定量评估文本质量;(2)利用文本困惑度(PPL)指标;(3)多轮人工校验。
参考资料:
- Anil R, Dai A M, Firat O, et al. Palm 2 technical report[J]. arXiv preprint arXiv:2305.10403, 2023.
- Conneau A, Khandelwal K, Goyal N, et al. Unsupervised cross-lingual representation learning at scale[J]. arXiv preprint arXiv:1911.02116, 2019.
- Dodge J, Sap M, Marasović A, et al. Documenting large webtext corpora: A case study on the colossal clean crawled corpus[J]. arXiv preprint arXiv:2104.08758, 2021.
- 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.
- Laurençon 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.
- Suárez P J O, Sagot B, Romary L. Asynchronous pipeline for processing huge corpora on medium to low resource infrastructures[C]//7th Workshop on the Challenges in the Management of Large Corpora (CMLC-7). Leibniz-Institut für Deutsche Sprache, 2019.
- 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.
- 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.
- Raffel C, Shazeer N, Roberts A, et al. Exploring the limits of transfer learning with a unified text-to-text transformer[J]. The Journal of Machine Learning Research, 2020, 21(1): 5485-5551.
- Scao T L, Fan A, Akiki C, et al. Bloom: A 176b-parameter open-access multilingual language model[J]. arXiv preprint arXiv:2211.05100, 2022.
- Shen Z, Tao T, Ma L, et al. SlimPajama-DC: Understanding Data Combinations for LLM Training[J]. arXiv preprint arXiv:2309.10818, 2023.
- Touvron H, Martin L, Stone K, et al. Llama 2: Open foundation and fine-tuned chat models[J]. arXiv preprint arXiv:2307.09288, 2023.
- https://huggingface.co/datasets/tiiuae/falcon-refinedweb.
- https://huggingface.co/datasets/EleutherAI/pile.