问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Deepseek的一种丝滑高效且易扩展的数据清洗流程

创作时间:
作者:
@小白创作中心

Deepseek的一种丝滑高效且易扩展的数据清洗流程

引用
1
来源
1.
https://fyzai.com/?p=3915

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 具有以下优点/特点:
2. 更为完整的流程

  • 相较于从 WET 出发的 cc_net,幻方 cc_cleaner 从原始的 WARC 文件出发,提供了更加完整的数据 pipeline
  1. 扩展性更高、流程配置化
  • 数据清洗步骤中的算法、模型均可进行配置(如图所示),采用模块化方案,用户要自定义算法也只需继承原有函数,给定一个配置文件即可定义整个数据清洗流程
  1. 任务流程无感知
  • 适配了萤火集群,任务被打断重启之后,不会重复处理数据,无需额外异常处理
  • 自动进行任务分配,能方便地进行水平扩容
  1. 速度更快
  • 基于高速文件系统 3fs(高达 7TB/s 读取,500GB/s 写入),大大提高了文件处理的效率

文本预处理

不同于 cc_net,幻方 cc_cleaner 从原始的 warc 数据开始做处理,通过 URL 过滤、文本抽取两步之后,生成对应的 WET 文件。其中 URL 过滤使用了一个包含 4.6M 个域名的黑名单,去除了包含欺诈/色情内容的网页。
清洗之后的 WET 文件在之后流程的使用中并不方便,为了更快、更方便地处理数据,为每一个 WET 文件生成了对应的 meta 文件,用于存储 WET 的信息摘要,其中包括:
2. 原网页 URL
4. 标题
6. 对应 WET 文件路径
8. Data index(指明该 meta 对应的文件内容位置、长度等)
10. …
可以看到,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 还提供了以下清洗流程:
2. Document-level 过滤规则,例如:

  • 丢弃单词数不在 50~100000 之间的文档
  • 丢弃平均单词长度不在 3~10 之间的文档
  • 丢弃“符号-单词”比例大于 0.1 的 (’#’ 和 ’…’ 符号)文档
  • 丢弃超过90%的行以 ‘•’ 开头或超过 30% 的行以 ’…’ 结尾的文档
  1. line-level 过滤规则,例如:
  • 丢弃主要包含大写字母的行
  • 丢弃只包含数字的行
  • 如果行的内容是一个计数(例如:转发 12次 评论 5条 点赞 30个)就丢弃
  • 丢弃只包含一个单词的行

小结

通过上述流程,就生成了可以最终的 meta 数据,只需要通过 meta 数据读取原本的 wet 数据,进行 tokenize 之后就可以生成用于大语言模型训练的数据。可以发现,除了生成 wet 数据的文本提取步骤,其余的步骤都是对远小于原始数据的 meta 文件进行操作,用到的分类器、语言模型等均可以进行配置,这大大降低了研究人员修改数据清洗流程生成数据集的难度、时间。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号