AGI 是数据 x 算法 x 算力的完美实践,是科研 + 工程 + 组织的优雅艺术。而在大模型训练的前置阶段,大数据的清洗是数据处理的基础。
以 Common Crawl 数据集为例,它可以轻松地在 Amazon 上获取到,是一个免费的、规模达到 PB 级别的网络爬虫数据集,其包括了超过 12 年间收集到的数据:原始网页数据(WARC)、元数据提取(WAT)和文本提取(WET)。如何对庞杂的原始数据进行清洗,得到高质量的数据集是一个值得研究的问题。本文将为大家介绍幻方深度求索实践优化后的数据清洗流程: cc_cleaner。
概述
FaceBook 在《CCNet: Extracting High Quality Monolingual Datasets from Web Crawl》工作中提出了从 WET 数据出发,清洗得到高质量数据集的流程。我们在此基础上做出了一些改进,提出了一种更为灵活、高效、强可拓展性的数据清洗流程,实现了更适合萤火集群的 cc_cleaner,其主要流程如下图所示:
相较于 cc_net,幻方 cc_cleaner 具有以下优点/特点:
-
更为完整的流程
- 相较于从 WET 出发的 cc_net,幻方 cc_cleaner 从原始的 WARC 文件出发,提供了更加完整的数据 pipeline
-
扩展性更高、流程配置化
- 数据清洗步骤中的算法、模型均可进行配置(如图所示),采用模块化方案,用户要自定义算法也只需继承原有函数,给定一个配置文件即可定义整个数据清洗流程
-
任务流程无感知
- 适配了萤火集群,任务被打断重启之后,不会重复处理数据,无需额外异常处理
- 自动进行任务分配,能方便地进行水平扩容
-
速度更快
- 基于高速文件系统 3fs(高达 7TB/s 读取,500GB/s 写入),大大提高了文件处理的效率
文本预处理
不同于 cc_net,我们的 cc_cleaner 从原始的 warc 数据开始做处理,通过 URL 过滤、文本抽取两步之后,生成对应的 WET 文件。其中 URL 过滤我们使用了一个包含 4.6M 个域名的黑名单,去除了包含欺诈/色情内容的网页。
清洗之后的 WET 文件在之后流程的使用中并不方便,为了更快、更方便地处理数据,我们为每一个 WET 文件生成了对应的 meta 文件,用于存储 WET 的信息摘要,其中包括:
- 原网页 URL
- 标题
- 对应 WET 文件路径
- Data index(指明该 meta 对应的文件内容位置、长度等)
- …
可以看到,meta 文件是 WET 的索引,通过更新 meta 中的内容,我们就可以实现对原始 WET 文件的修改、删除等操作。在生成 meta 文件时,我们会顺便生成文本的 minhash 用于去重,对于每一个文本,会生成一个 128 位的 int64 hash 值。
去重
对于文本预处理中生成的每一个 meta 文件,有一个 128 位的 int64 hash 值,我们利用这个 hash 值进行去重。另外,cc_cleaner 的预处理内置了按行去重的功能,开启后将在处理 meta 时就把重复的行提前去掉。
对于 url page 的去重,首先按照去重率要求对 128 位 hash 进行分块,对于每一块 hash 的去重都是一个独立的任务,可以并行进行操作。cc_cleaner 会将每一块 hash 按照资源总量再次进行分配(例如 10 节点 * 256 核,就模 2560 进行二次分片),从前向后遍历数据,hash 相同的数据认为是重复的,并记录重复数据 index。之后将每块中记录的重复 index 从 meta 中删除,生成新的 meta,就实现了全局的去重。
语言分类
语言分类是对 WET 数据使用语言分类器进行分类,cc_cleaner 内置了 cc_net 使用的 fastText 分类器,用户也可以指定其他的分类器。通过遍历 meta 可以读取到原始的网页内容,对网页内容进行 lid 打分后,保留得分最高且大于 0.5 的 3 个分类,记录进 meta。如果没有语言得分超过 0.5,那这个数据将会被丢弃。
质量清洗
在抽取文本数据、去重并确定了网页数据的语言之后,仍然需要对文本进行一定的清洗来提高质量,称为质量清洗。幻方 cc_cleaner 内置了 cc_net 使用的 perplexity,这是一个在高质量数据上训练好的打分器,用来对 tokenize 之后的数据进行困惑度打分。
除此之外,cc_cleaner 还提供了以下清洗流程:
-
Document-level 过滤规则,例如:
- 丢弃单词数不在 50~100000 之间的文档
- 丢弃平均单词长度不在 3~10 之间的文档
- 丢弃“符号-单词”比例大于 0.1 的 (’#’ 和 ’…’ 符号)文档
- 丢弃超过90%的行以 ‘•’ 开头或超过 30% 的行以 ’…’ 结尾的文档
- …
-
line-level 过滤规则,例如:
- 丢弃主要包含大写字母的行
- 丢弃只包含数字的行
- 如果行的内容是一个计数(例如:转发 12次 评论 5条 点赞 30个)就丢弃
- 丢弃只包含一个单词的行
- …
小结
通过上述流程,我们就生成了可以最终的 meta 数据,只需要通过 meta 数据读取原本的 wet 数据,进行 tokenize 之后就可以生成用于大语言模型训练的数据。可以发现,我们除了生成 wet 数据的文本提取步骤,其余的步骤都是对远小于原始数据的 meta 文件进行操作,用到的分类器、语言模型等均可以进行配置,这大大降低了研究人员修改数据清洗流程生成数据集的难度、时间。