参考:https://huggingface.co/spaces/HuggingFaceFW/blogpost-fineweb-v1
本文涉及到的详细测试代码和代码复现放置于:
https://github.com/davidsajare/david-share.git
下的:DeepLearning/Make-High-Quality-Dataset,本文中不再赘述代码实现。
大型语言模型(LLM)的性能在很大程度上依赖于其预训练数据集的质量和规模。然而,最先进的开源LLM如Llama 3和Mixtral的预训练数据集并未公开,关于它们的创建方式知之甚少。
最近,HF发布了FineWeb,这是一个新的大规模(15万亿标记,44TB磁盘空间)LLM预训练数据集。FineWeb源自96个CommonCrawl快照,并且比其他开源预训练数据集生成的LLM性能更好。为了在机器学习领域带来更多的透明度并推进对如何训练高质量大型语言模型的公开理解,HF仔细记录并剖析了FineWeb中使用的所有设计选择,包括对去重和过滤策略的深入研究。
FineWeb-Edu是FineWeb的一个子集,使用可扩展的自动高质量注释构建,具有教育价值,并且在MMLU、ARC和OpenBookQA等多个教育基准上表现优于所有公开可访问的网络数据集。FineWeb-Edu有两种规模/过滤级别:1.3万亿(非常高的教育内容)和5.4万亿(高教育内容)标记(所有标记均使用GPT2 tokenizer)。
https://huggingface.co/datasets/HuggingFaceFW/fineweb-edu?row=24
一、数据集的源头在哪?
找到原始数据
关于用于训练LLM的网络数据集,人们经常问的一个常见问题是“他们到底从哪里获得所有这些数据?”通常有两种选择:
自己抓取数据,就像OpenAI或Anthropic等公司所做的那样。
使用公共的抓取网页存储库,如非营利组织CommonCrawl维护的存储库。
为了构建FineWeb,遵循过去许多LLM训练团队的做法,HF使用了CommonCrawl(CC)作为起点。Common Crawl非营利组织自2007年以来一直在抓取网络,并通常每1到2个月发布一个包含200到400 TiB通过自动网络抓取获得的文本内容的新抓取。例如,最新的CC抓取(2024年4月)包含27亿个网页,总计386 TiB未压缩的HTML文本内容。自2013年以来已发布了96次抓取,从2008年到2012年发布了3次抓取,这些抓取采用不同(较旧)的格式。
大规模处理
鉴于涉及的数据量巨大,HF必须克服的主要挑战之一是拥有一个模块化、可扩展的代码库,使其能够快速迭代处理决策并轻松尝试新想法,同时适当地并行化工作负载并提供对数据的清晰洞察。为此,HF开发了datatrove,这是一个开源数据处理库,使其能够将过滤和去重任务无缝扩展到数千个CPU核心。FineWeb创建过程中涉及的所有数据处理步骤都使用了该库。
https://github.com/huggingface/datatrove/blob/main/examples/fineweb.py
二、什么是好数据?
在创建数据集时,有几个主要问题需要牢记。特别是在大型语言模型预训练的情况下,“高质量”并不是一个非常明确的术语,甚至通过直接人类观察也难以清晰感知文档的质量。通常的做法是使用一个被认为“干净”的语料库(例如维基百科)来训练一个模型,并用它来检查待整理数据集的困惑度。然而,这种方法并不总是能在一组感兴趣的下游任务上带来性能提升。
例如,假设我们有一个新的网络爬取数据集,我们可以用维基百科训练的模型来计算这个新数据集的困惑度。如果困惑度较低,我们可能会认为这个数据集质量较高。然而,实际应用中,这种方法并不总是有效,因为困惑度低并不一定意味着在特定任务上的性能会更好。
因此,另一种常用的方法是从数据集中抽取代表性子集,训练小模型,并在一组评估任务上进行测试。使用小模型是因为训练成本和时间与模型大小成正比。在这种方法中,选择一组多样且具有代表性的评估任务非常重要,同时要避免过度拟合任何单一基准,因为这会影响预训练后获得的LLM的通用性。
例如,我们可以从新数据集中抽取一部分数据,训练一个小型语言模型,并在常见的评估任务(如SQuAD、GLUE等)上进行测试。如果模型在这些任务上的表现优异,我们可以认为这个数据集质量较高。
另一种比较不同数据集的方法是用每个数据集训练一个模型,并让人类对模型的生成进行评分和比较(例如在LMSYS Chatbot Arena上)。这种方法可能提供最可靠的结果,反映实际的模型使用情况,但这种方式获得消融结果既昂贵又缓慢。此外,这通常需要模型经过指令微调阶段以获得对话能力,因为预训练模型并非直接设计用于遵循指令,因此对提示细节更加敏感。
例如,我们可以用不同的数据集训练多个模型,然后让人类评审员在LMSYS Chatbot Arena上对这些模型的对话生成进行评分。虽然这种方法成本高且耗时,但它能提供最接近实际使用情况的反馈。
在这项工作中,HF采用了训练小模型并在一组“早期信号”基准任务上评估它们的方法。HF认为这是评估用于训练这些模型的数据质量的合理代理,同时牢记在评估基准上过度拟合的风险。
例如,HF可能会用新数据集训练一个小型模型,并在一些早期信号任务(如文本分类、情感分析等)上进行测试。如果模型在这些任务上的表现良好,HF会认为这个数据集质量较高,但同时也会注意不要过度优化某一个特定任务,以保持模型的通用性。
“早期信号”指的是在模型训练的早期阶段,通过一些初步的评估任务来快速判断数据集质量和模型性能的指标。这些任务通常是相对简单且快速的,可以在短时间内提供关于模型表现的初步反馈。以下是一些具体的例子:
文本分类:例如,情感分析任务,判断一段文本是正面还是负面情感。这类任务通常数据量大且标注明确,适合作为早期信号。
命名实体识别(NER):识别文本中的实体(如人名、地名、组织名等)。这类任务可以快速评估模型对语言理解的基本能力。
问答任务:例如,SQuAD数据集中的问答任务,模型需要从一段文本中抽取出答案。这类任务可以评估模型的阅读理解能力。
语言建模困惑度:计算模型在新数据集上的困惑度(Perplexity),这是衡量语言模型预测下一个词的准确性的指标。困惑度越低,表示模型对数据的理解越好。
文本生成:让模型生成一段文本,并通过自动化指标(如BLEU、ROUGE)或人类评审来评估生成质量。
通过这些早期信号任务,可以快速判断数据集的质量和模型的初步性能,从而决定是否需要进一步调整数据集或模型参数。
具体案例
假设我们有一个新的网络爬取数据集,我们可以通过以下步骤来利用早期信号评估其质量:
文本分类任务:从新数据集中抽取一部分数据,训练一个小型情感分析模型,并在IMDB电影评论数据集上进行测试。如果模型在这个任务上的表现优异,我们可以初步认为新数据集的质量较高。
命名实体识别任务:用新数据集训练一个NER模型,并在CoNLL-2003数据集上进行测试。如果模型在识别实体方面表现良好,这也是一个积极的信号。
问答任务:用新数据集训练一个问答模型,并在SQuAD数据集上进行测试。如果模型能够准确回答问题,这表明新数据集在阅读理解方面具有较高的质量。
语言建模困惑度:计算新数据集上的困惑度。如果困惑度较低,表示模型对新数据集的理解较好。
文本生成任务:让模型生成一段文本,并通过BLEU或ROUGE等自动化指标评估生成质量。如果生成文本质量高,这也是一个积极的信号。
通过这些早期信号任务,我们可以快速评估新数据集的质量,并决定是否需要进一步调整数据集或模型参数。
三、消融与评估设置
什么是消融?
消融(Ablation)在机器学习和深度学习中是指通过移除或修改模型的某些部分或处理步骤,来研究这些部分或步骤对模型性能的影响。通过这种方法,可以更好地理解模型的工作机制以及不同组件的重要性。
消融(Ablations)和评估设置
为了比较特定处理步骤的影响,HF在数据集的两个版本上训练了两个模型。一个版本使用了额外的处理步骤(the one we wish to evaluate),另一个版本则去除了该步骤(cut/removed)。除了数据处理的不同,这两个模型在其他方面完全相同:相同的参数数量、架构超参数,并在每个版本的数据中随机抽取的相同数量的标记上训练一个周期——唯一的区别是训练数据。然后,HF在相同的一组任务上评估每个模型并比较平均分数。
HF的消融模型使用nanotron进行训练。消融模型有1.82B参数(包括嵌入),使用Llama架构,序列长度为2048,全局批量大小约为200万标记,使用GPT2标记器。对于大多数消融实验,HF在约28B标记上进行训练(大致是Chinchilla对于此模型大小的最佳训练规模)。为了确认每个过滤步骤后的相对性能改进,HF在3500亿标记上进行了更长时间的训练,如下文所述。HF将很快在Nanotron中提供重现这些消融模型的配置。
HF使用lighteval评估模型。为了仔细选择消融的基准,HF选择了在相对较小规模上提供良好信号的基准(“小”模型仅在“几十亿”标记上训练)。HF通常使用以下标准在lighteval中可用的所有基准中选择这些基准:
在不同数据集抽样上训练的运行之间的方差较小:希望在数据子集上的运行能代表整个数据集,并且在可能的范围内,结果分数对确切的数据点选择的敏感性小于对过滤器效果的敏感性。
在训练运行中性能单调增加(或接近):理想情况下,随着看到的标记数量增加,在高信号基准上的性能不应下降(这将表明在小规模上结果不可靠)。
该任务的性能高于随机基线至少几个标准差:鉴于消融模型和训练通常不会在任何基准上达到极高的分数,但希望确保得到的分数高于随机噪声。
经过考虑,HF选择了以下基准列表:
CommonSense QA
HellaSwag
OpenBook QA
PIQA
SIQA
WinoGrande
ARC
MMLU
为了确保检查点评估在有限的时间范围内,HF将较长的基准限制在1000个样本(在8个GPU的单节点上进行的墙钟评估时间少于5分钟 - 与训练并行进行)、
四、 FineWeb制作流程
在接下来的小节中,我们将解释生成FineWeb数据集的每一步骤。
https://github.com/huggingface/datatrove/blob/main/examples/fineweb.py
4.1 起点:文本提取
CommonCrawl数据有两种主要格式:WARC和WET。WARC(Web ARChive格式)文件包含抓取的原始数据,包括完整的页面HTML和请求元数据。WET(WARC Encapsulated Text)文件则提供这些网站的纯文本版本。
许多数据集以WET文件为起点。根据我们的经验,Common Crawl用于创建这些WET文件的默认文本提取对于LLM预训练的目标来说并不理想,而且有多种开源库可以提供更好的文本提取效果。我们使用trafilatura库从WARC文件中提取文本内容,通过视觉检查结果发现,与其他库相比,trafilatura提供了高质量的提取效果。
为了验证这一决定,我们直接使用WET文件和从WARC文件中使用trafilatura提取的文本处理了2019-18的dump。我们对每个文件应用了相同的处理(我们的基本过滤+minhash,详见下文)并训练了两个模型。虽然WET数据集的结果大约大25%(约2540亿标记),但其质量远不如使用trafilatura从WARC文件中提取文本的数据集(约2000亿标记)。对一些样本的视觉检查证实,WET文件中的许多额外标记是不必要的页面模板内容。
然而,值得注意的是,文本提取是我们处理过程中最昂贵的步骤之一,因此我们认为,对于预算较低的团队来说,使用现成的WET数据可能是一个合理的折衷。
4.2 基本过滤
过滤是数据集整理过程中的重要步骤。它包括删除那些可能会降低模型性能的数据(无论是单词、行还是整个文档)。在我们的评估驱动的数据集制作过程中,这些数据被视为“低质量”,因此需要被过滤掉。
作为过滤的基础,我们使用了RefinedWeb的一部分设置。具体来说,我们:
使用黑名单进行URL过滤以移除成人内容
使用fastText语言分类器仅保留得分≥0.65的英文文本
应用了MassiveText的质量和重复过滤器(使用默认阈值)
在对每个提取的文本转储应用这些过滤后(目前有96个 dump),我们获得了大约36万亿标记的数据。
4.3 数据去重
去重是创建用于大型语言模型(LLM)预训练的大型网络数据集时最重要的步骤之一。去重方法试图识别并删除数据集中冗余或重复的数据。那么,为什么要进行去重呢?
网络上有许多聚合器、镜像、模板页面或其他在不同域名和网页上传播的重复内容。有时,这些重复页面甚至可能是由抓取器本身引入的,当不同的链接指向同一页面时。删除这些重复内容(去重)有助于提升模型性能,并减少预训练数据的记忆效应,从而允许模型更好地泛化。此外,通过去重获得的性能提升可以等同于提高训练效率:通过删除重复内容,模型可以在更少的训练迭代中达到相同的性能水平——或者等效地,对于给定数量的训练标记,模型将看到更多样化的数据。
有不同的方法来识别甚至定义重复数据。常见的方法依赖于哈希技术来加速过程,或构建高效的数据结构来索引数据(如后缀数组)。这些方法可以是“模糊的”,通过使用某种相似性度量来标记文档为重复,或“精确的”,通过检查两个文档(或行、段落或其他粒度级别)之间的精确匹配。
我们的去重参数遵循RefinedWeb,我们决定应用MinHash,这是一种基于模糊哈希的去重技术,可以高效地扩展到许多CPU节点,并允许我们调整相似性阈值(通过控制桶的数量和大小)以及考虑的子序列长度(通过控制n-gram大小)。我们选择收集每个文档的5-gram,并使用总共112个哈希函数计算minhash,分为14个桶,每个桶8个哈希——目标是至少75%相似的文档。任何桶中具有相同8个minhash的文档被视为彼此重复。
这意味着,对于两个相似度(s)为0.7、0.75、0.8和0.85的文档,它们被识别为重复的概率分别为56%、77%、92%和98.8%(1-(1-s8)14)。请参见下图,比较我们使用112个哈希和RefinedWeb使用9000个哈希(分为450个桶,每个桶20个哈希)的匹配概率(这需要大量的计算资源,因为每个单独的哈希必须计算、存储,然后与其他文档的哈希进行比较):
虽然RefinedWeb中使用大量哈希函数可以实现更精确的去重(即相似度接近阈值的文档更有可能被正确识别),但我们认为节省计算和存储资源是一个合理的折衷。需要注意的是,文档内部的去重已经由我们的重复过滤器处理,该过滤器删除了包含许多重复行和段落的文档。
那么,更多的去重总是更好吗?最初,我们认为更多的去重总是更好,所以我们尝试将整个数据集(所有90多个dump)作为一个大数据集一起使用MinHash进行去重。我们以迭代的方式进行:从最新的dump开始(当时是2023-50),按时间顺序处理,直到最早的抓取。我们不仅在每个dump内部进行去重,还删除了与之前处理过的dump中的任何文档匹配的文档。例如,对于第二新的dump(当时是2023-40),我们不仅在其内部进行去重,还与最新的dump进行去重。因此,dump越旧,它与之去重的dump数量越多,我们从中删除的数据也越多(实际上,在最旧的dump中,去重步骤删除了超过90%的基础过滤数据)。
以这种方式去重数据集后,我们得到了4万亿标记的数据。但令我们惊讶的是,当在随机抽取的3500亿标记子集上进行训练时,我们的消融模型几乎没有显示出比未去重数据训练的模型更好的改进,在我们的任务综合评分中远低于其前身RefinedWeb(见下图)。
这挑战了我们关于更多去重会不可避免地导致更高基准分数的假设。因此,我们决定仔细查看其中一个最早的dump,即2013-48 dump。去重前,这个dump有约4900亿标记,经过我们的迭代MinHash处理后,剩下约310亿标记(94%的数据被删除)。
作为实验,我们尝试在2013-48 dump中的以下数据上训练两个模型,每个模型使用280亿标记:
完全去重后剩下的约310亿标记(原始保留数据)。
通过单独去重(不考虑其他dump)从迭代去重过程中删除的约4600亿标记中获得的1710亿标记(原始删除数据)。
这些结果表明,对于这个单独处理的较旧dump来说,保留的数据(原始数据的10%)实际上比我们删除的90%的数据质量更差。通过视觉检查也证实了这一点:原始保留的数据包含了更多的广告、关键词列表和一般格式不佳的文本,而原始删除的数据质量更高。
退一步:单独dump去重
我们决定尝试一种替代方法:使用MinHash对每个dump单独进行去重(独立于其他dump)。这产生了20万亿标记的数据。在这个数据集的随机样本上进行训练时,我们发现其性能现在与RefinedWeb相匹配(见下图曲线)。
我们假设,从去重中获得的主要改进是移除存在于每个dump中的非常大的集群(您可以在RefinedWeb论文中找到这些集群的一些例子,每个集群包含数十万份文档),而对重复数量较少的集群(少于约100,即dump的数量)进行进一步去重实际上会损害性能:在任何其他dump中找不到重复匹配的数据可能实际上质量更差/更偏离分布(如2013-48数据的结果所示)。虽然在一起去重几个dump时可能会看到一些性能提升,但在整个数据集(所有dump)的规模上,这种低质量数据的上采样副作用似乎更具影响力。
需要考虑的一种可能性是,随着过滤质量的提高,这种效果可能不会那么普遍,因为过滤可能能够去除一些低质量数据。我们还尝试在单独去重的dump上应用不同且通常“更轻”的去重方法。您可以在下文中进一步了解这些方法。
关于衡量去重效果的说明
鉴于去重的性质,其效果在数据集的较小切片中(如我们用于过滤消融的28B标记)并不总是非常明显。此外,必须考虑到在所有CommonCrawl dump中进行去重时存在的特定影响,因为一些URL/页面会从一个dump到下一个dump重新抓取。
为了可视化训练标记数量扩展对衡量去重影响的效果,我们考虑了以下(关于观察到的重复程度非常极端且不现实的)理论场景:
有100个CommonCrawl dump(大致准确)。
每个dump都已完美单独去重(每个文档在该dump中都是唯一的)。
每个dump都是彼此的完美副本(跨dump的最大可能重复,实际上是最坏的情况)。
每个dump有2000亿标记(总共20万亿,这是我们上面单独去重的结果大小)。
每个dump由1k标记的文档组成(每个dump有2亿份文档)。
然后我们模拟从这个20万亿标记的整个数据集中均匀抽样文档,以获得1B、10B、100B、350B和1T标记的子集。在下图中,您可以看到每个文档会被重复的频率。
对于1B标记,几乎所有文档都是唯一的(#重复=1),尽管在整个数据集中每个文档被重复了100次(每个dump一次)。在100B规模(总数据集的0.5%)时,我们开始看到一些变化,大量文档被重复两次,少数甚至被重复4-8次。在更大规模的1T(总数据集的5%)时,大多数文档被重复最多8次,有些甚至被重复多达16次。
我们在350B规模上对去重数据进行了性能评估,在这个理论场景下,这将由大量被重复多达8次的文档组成。这种模拟说明了在移除最大的重复集群后,测量去重对LLM训练影响的固有困难。
对于1B标记,几乎所有文档都是唯一的(#重复=1),尽管在整个数据集中每个文档被重复了100次(每个dump一次)。在100B规模(总数据集的0.5%)时,我们开始看到一些变化,大量文档被重复两次,少数甚至被重复4-8次。在更大规模的1T(总数据集的5%)时,大多数文档被重复最多8次,有些甚至被重复多达16次。
我们在350B规模上对去重数据进行了性能评估,在这个理论场景下,这将由大量被重复多达8次的文档组成。这种模拟说明了在移除最大的重复集群后,测量去重对LLM训练影响的固有困难。
其他(失败的)全局方法
为了在我们新发现的方法(独立去重每个dump)基础上进一步改进性能,我们尝试通过替代的全局(跨所有dump)去重方法对独立MinHash去重的20万亿标记数据进行进一步去重。我们探索了以下方法:
URL去重:我们只保留每个规范化(小写)URL的一个文档(71.5%的标记被删除,剩下5.6T)——FineWeb URL去重。
行去重:删除每个重复行的所有但保留一个(随机选择)的出现(77.8%的标记被删除,剩下4.4T)——FineWeb行去重。
行去重带最少单词限制:同上,但仅删除至少包含10个单词的重复行,并在去重后删除少于3个句子的文档(85%的标记被删除,剩下2.9T)——FineWeb行去重带最少单词限制。
3行去重:删除每个重复的3行片段的所有但保留一个出现,并在查找重复时将每个数字视为0(80.9%的标记被删除,剩下3.7T)——FineWeb 3行去重。
在这些方法上训练的模型性能始终比原始独立去重数据的性能更差(即使程度不同)。
应用“所有过滤器”(删除不以标点符号结尾的行,包含JavaScript代码或cookie通知的行,以及删除长度不在阈值范围内的文档,包含“lorem ipsum”或大括号“{”的文档)使我们能够匹敌C4在HellaSwag上的表现(分别为“所有过滤器”与“C4”曲线)。大括号过滤器和词长过滤器仅提供了小幅提升,分别删除了2.8%和4.3%的标记。终端标点过滤器本身提供了最大的单独提升,但删除了大约30%的所有标记。lorem_ipsum、JavaScript和政策规则各自删除了不到0.5%的训练标记,因此我们没有单独对它们进行训练。“除终端标点外的所有过滤器”比单独使用终端标点过滤器表现更好,同时总共删除的标记更少(约7%)。我们决定应用上述所有C4过滤器,除了终端标点过滤器。我们通过更长时间的运行验证了这些结果,您将在下一节的图表中看到这些结果。
开发启发式过滤器的统计方法
为了开发新的启发式过滤器并选择其阈值,我们设计了一个系统化的过程:
收集统计数据:我们收集了数据集的高级统计数据(超过五十种不同的指标),从常见的文档级别指标(例如行数、平均行/词长度等)到文档间重复指标(受MassiveText启发),在高质量和低质量的网页数据集上进行。
选择指标:我们选择了Wasserstein距离在两个分布(在每个数据集上计算的指标)之间较大的指标。
设定阈值:我们检查了两个分布的直方图,并经验性地选择了一个阈值,使低质量数据集在该指标上更接近高质量数据集。
验证结果:我们通过在参考数据集上使用结果过滤器(指标-阈值对)并运行小规模消融来验证结果。
由于我们假设全局MinHash在最旧的dump中大大上采样了低质量数据,我们在独立MinHash和全局MinHash版本的2013-48和2015-22抓取(两个较旧的抓取)上计算了指标。然后我们通过查看每个指标的分布在宏观层面上比较了统计数据。我们发现两种去重方法在大多数指标上存在显著差异。例如,行字符重复指标(重复行中的字符数/字符总数)从独立去重(2015-22为0.0053,2013-48为0.0058)大约翻倍到全局去重(2015-22为0.011,2013-48为0.01),表明后者具有更高的文档间重复。
按照上述过程对这些数据集进行处理,得出了十七个候选指标-阈值对。在下图中,您可以看到其中三个直方图:
例如,我们检查了“以标点符号结尾的行的比例”的直方图(见上图),并观察到全局MinHash在大约0.12处的文档密度增加。然后我们使用这个阈值进行过滤,发现被移除的数据包含更多的短列表或仅由文档布局文本组成(如“首页”、“注册”等)。
接着,我们通过在2019-18抓取数据上进行多次28亿标记的消融运行,评估了这十七个新创建的过滤器的有效性。在所有这些运行中,我们确定了三个过滤器在综合评分上表现出最显著的改进:
删除以标点符号结尾的行比例≤0.12的文档(删除了10.14%的标记)——相比原始C4终端标点过滤器的30%。
删除重复行中字符比例≥0.1的文档(删除了12.47%的标记)——原始MassiveText对此比例的阈值为≥0.2。
删除行长度少于30个字符的比例≥0.67的文档(删除了3.73%的标记)。
当同时应用这三个过滤器时,约22%的标记被删除。
这些过滤器使我们能够进一步提高性能,显著地超越C4数据集的性能,同时提供了一个更大的数据集。
最终的 FineWeb数据集
最终的 FineWeb数据集包含15万亿标记,并包括以下按顺序进行的步骤,每一步都在我们的基准任务组上提供了性能提升:
基础过滤
每个转储的独立MinHash去重
选择的C4过滤器
我们自定义的过滤器(在上一节中提到)
与其他网络规模数据集的比较
我们将 FineWeb与以下通常被认为是最高质量的公开可访问网络规模数据集进行了比较(每个数据集的公共版本大致标记数量如下):
RefinedWeb(5000亿标记)[22]
C4(1720亿标记)[30]
Dolma v1.6(3万亿标记)(CommonCrawl部分)[32]
The Pile(3400亿标记)[33]
SlimPajama(6270亿标记)[34]
RedPajama2(20万亿标记)[35](去重)
我们的新FineWeb(15万亿标记)(本报告)
您可以在这个集合中找到3500亿标记训练的消融模型,这些模型是公开可访问的。我们在每1000个训练步骤上传了检查点。您还可以在此处找到我们的完整评估结果。
因此,据我们所知,FineWeb 是目前模型性能最高的开放数据集,同时可以在数万亿代币上进行训练。