Deepseek的一种丝滑高效且易扩展的数据清洗流程
Deepseek的一种丝滑高效且易扩展的数据清洗流程
AGI是数据、算法和算力完美结合的实践,也是科研、工程和组织管理的优雅艺术。在大模型训练的前期阶段,对大数据进行清洗是数据处理的基础。
以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文件进行操作,用到的分类器、语言模型等均可以进行配置,这大大降低了研究人员修改数据清洗流程生成数据集的难度、时间。