数据科学

使用 NVIDIA NeMo Curator 构建 Nemotron-CC:一个高质量万亿令牌数据集,用于大型语言模型预训练,源自 Common Crawl

对于想要训练先进的 大语言模型 (LLM) 的企业开发者而言,整理高质量的预训练数据集至关重要。为了让开发者能够构建高度准确的 LLM,NVIDIA 之前发布了 Nemotron-CC ,这是一个价值 6.3 万亿个 token 的英语语言 Common Crawl (CC) 数据集。今天,NVIDIA NeMo Curator 团队很高兴地与大家分享,用于构建 Nemotron-CC 数据集的 pipeline 现已合并到 NeMo Curator GitHub 存储库 中。

Nemotron-CC 工作流现已集成到 NeMo Curator 中,为平衡大规模准确性和数据量之间的权衡提供了一种新颖的解决方案。Nemotron-CC 工作流结合使用分类器集成和合成数据重述,提供了一种可扩展的方法,可从原始数据集中生成高质量的合成数据,以扩展原始数据集。

Nemotron-CC 数据管护工作流的优势

由于大量使用无法评估语义质量的启发式过滤,传统的数据管护方法受到了限制,导致原本可以改用的低质量文本被丢弃。因此,在此类次优数据上训练的模型达到了准确性的稳定水平,尤其是在 MMLU 等复杂的推理任务中。

Nemotron-CC 工作流现已集成到 NeMo Curator 中,引入了一种在准确性和数据量之间实现权衡的创新方法。Nemotron-CC 工作流结合使用分类器集成和合成数据重述,提供了一种可扩展的方法,可从原始数据集中生成高质量的合成数据,以扩展原始数据集。

使用此工作流,您可以生成 2 万亿个高质量合成数据 token,以扩展最终数据集,这是开源领域的首个方法。这种合成数据有助于恢复通过过滤消除的大部分内容,在 DCLM 和 FineWebEdu 等数据集中,这一比例高达 90%。这种程度的数据丢失使得它们不适合长距预训练任务,例如 Llama 3.1 等模型需要 15 万亿个 token 的任务。

深入了解:Nemotron-CC 数据管护工作流

如图 1 所示,Nemotron-CC 工作流将 Perplexity 评分、Ensemble 质量标记和 Synthetic 数据生成相结合,将原始的 Common Crawl (CC) 数据集转换为经过优化的多任务就绪型语料库,从而填补了传统数据管护中的空白。

Architecture diagram showing the various processing steps involved in the curation of the Nemotron-CC dataset, now merged into NeMo Curator.
图 1。将 Nemotron-CC 数据管护工作流中的不同步骤合并到 NeMo Curator

数据管护工作流包含几个步骤,首先是获取 CC 数据集,然后应用各种过滤器和处理步骤。总的来说,数据管护工作流包含三个阶段。

  1. HTML 到文本的提取和过滤
  2. 基于模型的质量标记
  3. 合成数据生成 (Synthetic Data Generation)

我们来深入了解 pipeline 中的每个阶段。

HTML-to-text 提取器和过滤器

该工作流使用 jusText 进行 HTML 提取,使用 FastText 识别英语语言数据并对 Unicode 字符进行格式化。提取文本后,我们应用精确和模糊的重复数据删除算法从文本中删除重复和近乎重复的文档。

NeMo Curator 的 精确重复数据删除 模块可对每个文档进行哈希处理,并且每个哈希仅保留一个文档,从而高效识别并从数据集中删除相同文档。另一方面, 模糊重复数据删除 模块通过计算 MinHash 签名和使用局部敏感哈希 (LSH) 来检测具有高 Jaccard 相似度分数的文档,从而识别和删除近乎重复的文档。

NeMo Curator 重复数据删除模块利用 NVIDIA RAPIDS 库,如 cuDF、cuML 和 cuGraph,以及 Dask ,在多节点、多 GPU 环境中扩展工作负载,从而大幅缩短数据处理时间。与替代方案相比,借助 NeMo Curator,您可以将文本处理速度提高 16 倍。

然后,我们应用了 28 种不同的启发式过滤器(涵盖非字母数字内容、数字和 URL 比率、空格不一致以及通过各种 n-gram 分析的重复模式),以确保只保留最优质、最相关的数据。NeMo Curator 通过接受具有所需过滤器的配置文件,并自动为数据集中的所有文档设置过滤工作流,以及可选的 GPU 加速来增强性能,从而简化了这一过程。

最后,如下方代码块所示,我们使用预训练的 KenLM 模型创建 `PerplexityFilter` 模块,生成 perplexity 分数,并根据 perplexity 阈值过滤文档。perplexity 分数较低意味着文本可预测且流畅,而 perplexity 分数较高意味着文本奇怪或不连贯。

class PerplexityFilter(DocumentFilter):

  def __init__(self, threshold):
    self._kenlm_model = KenlmModel(model_path=models_dir, language="en")
    self._threshold = threshold

  def score_document(self, text: str):
    return self._kenlm_model.get_perplexity(text, normalize=True)

  def keep_document(self, score: int):
    return score <= self._threshold

基于模型的质量标记

我们使用了三个质量分类器模型的集合: FastText Quality Classifier 、NeMo Curator – FineWeb Mixtral Edu Classifier FineWeb Nemotron-4 Edu Classifier

这三个质量分类器经过训练,可根据不同的质量偏好生成分数。我们在每个样本上运行这些分类器,并汇总其分数 (0–5) ,对所有文档进行排序,并存储语料库。然后,将这些存储桶分为五个质量级别,以便在下一个 Synthetic Data Generation 步骤中进行适当处理。

每个分类器模型都会生成浮点分数,这些分数会映射到从 0 (最差质量) 到 19 (最佳质量) 的整数类别,并使用基于百分位的阈值创建 20 个 bins 以进行比较。然后,通过对所有分类器取所有整数分数中的最大值,将多个分类器的预测结果合并为单个代表性分数 (即 ensemble 分数) 。

NeMo Curator 已支持这些质量分类器模型,因此我们只需初始化它们,将其应用于输入数据集,然后为每个分类器生成包含额外分数列的输出数据集。此外,整个过程都受益于开箱即用的 GPU 加速,如下方代码块所示。

# Import required classifiers
from nemo_curator.classifiers import FineWebNemotronEduClassifier, FineWebMixtralEduClassifier, FastTextQualityClassifier
from nemo_curator import get_client

# Start distributed client on GPU
client = get_client(cluster_type="gpu")

# Initiate all classifiers
classifiers = [
   FineWebNemotronEduClassifier(...),
   FineWebMixtralEduClassifier(...),
   FastTextQualityClassifier(...)
]

# Read input dataset with cuDF
input_dataset = DocumentDataset.read_parquet("./data.parquet", backend="cudf")

# Apply classifiers
output_dataset = input_dataset
for classifier in classifiers:
   output_dataset = classifier(dataset=output_dataset)

# Save output dataset.
output_dataset.to_parquet(path=quality_classification_results_dir)

# Stop Dask client
client.cluster.close()

合成数据生成

我们使用 SDG 流程从低质量和高质量文档中生成数据。对于低质量文档,我们通过提示 LLM 使用 Wikipedia-style 提示重写文本来重复使用有用信息。

对于高质量数据,我们通过重述或压缩文本中的基本知识来生成更独特的预训练标记。为此,我们使用不同的提示运行了四种不同的 LLMs 来生成:

  1. 多样化的问答 (QA) 组:以各种形式提问,例如是/ 否、多项选择和开放式问题
  2. 蒸馏 :将文本重写为简洁明了的段落
  3. 提取知识 :重写文本中的知识,忽略无意义的内容
  4. 知识列表:将文本中的关键信息提取为有组织的列表

结果

如表 1 所示,在 Nemotron-CC 数据集的 1T-token 子集上训练 Llama 3.1 8B 参数模型时,与在 DCLM 数据集上训练的同一 LLM 相比,MMLU 得分提高了 5.6 分,令人印象深刻。如需完整的基准测试结果,请参阅 Nemotron-CC:将 Common Crawl 转换为优化的 Long-Horizon 预训练数据集论文。

数据集 MMLU
FineWebEdu-2 42.4
FineWebEdu 42.9
DCLM 53.4
Nemotron-CC 高质量 59.0
表 1。使用 1T token 训练的 8B 参数模型的结果

如表 2 所示,在长水平令牌 (15T 令牌,包括来自 Nemotron-CC 数据集的 7.2T 令牌) 上训练 Llama 3.1 8B 模型后,在 MMLU 基准测试中提升了 5 分,与 Llama 的 65.3 相比,得分提高了 70.3。

模型 MMLU
Llama 3.1 65.3
使用 Nemotron-CC 数据训练的 Llama 3.1 70.3
表 2。原始 Llama 3.1 与使用 Nemotron-CC 数据训练的 Llama 3.1 模型在 MMLU 基准测试中的准确度分数比较

开始使用

使用 Nemotron-CC 流程生成高质量数据集,以预训练基础模型或为能源、制造、化学等各个领域执行 Domain-Adaptive Pretraining (DAPT) 。得益于 NeMo Curator 的灵活性,此流程中的各个组件不仅可用于开发预训练数据集,还可用于微调数据集。

请访问以下链接开始使用:

  • GitHub 教程 :用于部署 pipeline 的分步 Jupyter Notebook。
  • NeMo Curator API :用于自定义 pipeline 各个阶段 (例如交换 classifiers) 的 Pythonic 接口

另外,别忘了 star 我们的 NeMo Curator GitHub 资源库 ,定期接收有关新发布功能、教程的更新,并将您的代码贡献至资源库。

 

标签