马儿慢些走

人生惶惶,悲喜一场。

DataComp-LM (DCLM) 项目仓库说明

2025年5月29日:针对 mlfoundations/dclm: DataComp for Language Models 的说明进行全文翻译。

好的,以下是该网页的正文内容翻译:

看起来整套流程能利用上的是分词、洗牌、训练和评估,前面的数据处理部分不一定用DCLM的数据处理工具,会有自己的流程。本篇最后一章节展示的用 DCLM 基线训练 1B 模型过程就符合当前需求,数据集(语料)是提前制作好的,评估流程涉及分词、洗牌、训练和评估。


DataComp-LM (DCLM)

目录

  • 介绍

  • 排行榜

  • 入门指南

  • 工作流程概述(及实验数据)

    • 选择原始数据源

    • 数据处理

      • 基于 Ray 的过滤和清洗
      • 去重
    • 分词和洗牌

    • 模型训练

    • 模型评估

      • 提交
  • 下载资源

    • 数据集
    • 预训练模型
  • 使用 DCLM 基线训练 1B 模型的示例命令

  • 如何贡献

  • 如何引用我们

  • 许可证

介绍

DataComp-LM (DCLM) 是一个用于构建和训练大型语言模型(LLMs)的综合性框架,提供多样化数据集。它包含来自 CommonCrawl 的超过 300T 未过滤标记的标准化语料库、基于 open_lm 框架的有效预训练配方,以及超过 50 项评估的广泛套件。此仓库提供了处理原始数据、分词、洗牌、训练模型以及评估性能的工具和指南。

DCLM 使研究人员能够在不同计算规模(从 411M 到 7B 参数模型)上实验各种数据集构建策略。我们的基线实验表明,通过优化数据集设计可以显著提升模型性能。

DCLM 已成功创建多个在不同规模上表现良好的高质量数据集,其性能优于所有公开数据集。

image

开发更便宜且性能更好的模型的数据集。 使用 DataComp-LM,我们开发了一个高质量的数据集 DCLM-BASELINE,用于训练具有强大计算性能权衡的模型。我们在核心任务集(左侧)和 MMLU 5-shot(右侧)上进行了比较。DCLM-BASELINE(橙色)相对于闭源模型(交叉点)和其他开源数据集及模型(圆形)表现出有利的性能。

提交工作流

  • (A) 参与者选择一个规模,较大规模表示更多的目标训练标记和/或模型参数。最小规模是 400m-1x,即参数为 400m 的模型,以计算最优方式训练(1x),最大规模是 7B-2x,即参数为 7B 的模型,训练所需的标记量是计算最优的两倍。
  • (B) 参与者过滤数据池(过滤赛道)或混合自己的数据(自带数据赛道)以创建数据集。
  • (C) 使用策划的数据集,参与者训练语言模型,使用标准化的训练代码和特定规模的超参数,然后
  • (D)53 个下游任务上评估模型以判断数据集质量。

image

更多详细信息,请参阅我们的论文。

排行榜

DCLM 排行榜展示了在不同规模和数据集上训练的模型的性能。排行榜会定期更新社区的最新提交内容。

以下是我们在 7B 规模上与其他模型的比较。

模型 参数 标记 开放数据集? 核心任务 MMLU 扩展任务
开放权重,封闭数据集
Llama2 7B 2T 49.2 45.8 34.1
DeepSeek 7B 2T 50.7 48.5 35.3
Mistral-0.3 7B 57.0 62.7 45.1
QWEN-2 7B 57.5 71.9 50.5
Llama3 8B 15T 57.6 66.2 46.3
Gemma 8B 6T 57.8 64.3 44.6
Phi-3 7B 61.0 69.9 57.9
开放权重,开放数据集
Falcon 7B 1T 44.1 27.4 25.1
OLMo-1.7 7B 2.1T 47.0 54.0 34.2
MAP-Neo 7B 4.5T 50.2 57.1 40.4
我们训练的模型
FineWeb edu 7B 0.14T 38.7 26.3 22.1
FineWeb edu 7B 0.28T 41.9 37.3 24.5
DCLM-BASELINE 7B 0.14T 44.1 38.3 25.0
DCLM-BASELINE 7B 0.28T 48.9 50.8 31.8
DCLM-BASELINE 7B 2.6T 57.1 63.7 45.4

入门指南

要开始使用 DCLM,请按照以下步骤操作:

  1. 克隆仓库

    git clone https://github.com/mlfoundations/DCLM.git
    cd DCLM
    
  2. 安装依赖

    pip install -r requirements.txt
    

    在安装依赖之前,请确保已安装 cmake、build-essential 和 g++,例如通过安装以下命令:

    apt install cmake build-essential
    apt install g++-9
    update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 90
    

    要下载用于基线复现所需的额外模型和数据,请运行:

  3. 设置环境
    DCLM 使用 AWS 作为存储和可能的计算后端,并使用 ray 进行分布式处理。请确保已设置 AWS 和 Ray 集群所需的环境变量和配置。

    我们建议使用 Python 3.10 与 DCLM。

    Ray是一个分布式计算框架,用于扩展AI和Python程序。

    ray-分布式计算框架-集群与异步Job管理 - 梦_鱼 - 博客园

    Getting Started — Ray 2.46.0

工作流程概述和实验数据

DCLM 的工作流程主要包括五个步骤:(1) 原始数据源选择;(2) 数据处理;(3) 分词和洗牌;(4) 模型训练;(5) 模型评估。要符合我们的排行榜资格,您需要使用我们的脚本进行步骤 (3)-(5)。对于数据处理,您可以使用和/或扩展我们的代码,但也可以自行实现此步骤。

为了跟踪和运行实验,此仓库使用 exp_data 文件夹记录这些步骤的输入和输出(例如,创建的数据集、训练的模型和完成的评估)。每个记录称为“参考 JSON”,可以被视为特定输入或输出资产的“身份证”。总体来说,参考 JSON 分为以下四类:

  • 未分词数据集:这些是指原始文本形式的数据集,可以是数据处理的输入或输出(exp_data/datasets/raw_sourcesexp_data/datasets/untokenized)。
  • 已分词数据集:这些是指通过分词-洗牌生成的已分词数据集,可以被视为“编译”策划数据集以准备训练的步骤(exp_data/datasets/tokenized)。
  • 模型:这些是指训练步骤生成的模型(exp_data/models)。
  • 评估:这些存储特定模型的评估结果(exp_data/evaluations)。

在原始数据源选择之后的步骤中,我们的大多数脚本都需要您指定正确的输入参考 JSON,并且会自动生成输出的 JSON。默认情况下,生成的参考 JSON 还会包含指向生成引用资产的输入的相关指针(例如,模型 JSON 将包含用于训练它的已分词数据集的指针)。具体来说,参考 JSON 的使用方式如下:

  1. 数据处理分词-洗牌都接受未分词数据集 JSON 的相对路径,以检测输入数据集的存储位置。使用我们的基于 ray 的实现将分别生成未分词和已分词数据集 JSON。
  2. 训练接受已分词数据集 JSON 的相对路径,以检测数据集及其对应清单文件的位置。将生成模型 JSON。
  3. 评估可以接受模型的 UUID 来自动填充评估脚本的大部分参数。将生成评估 JSON。

如果需要(例如,设置新的原始数据源或使用自己的代码进行数据处理时),可以通过复制现有文件的格式并修改相关字段来手动创建 JSON。在这种情况下,关键是要生成一个新的 UUID(例如,通过运行 python -c "import uuid; print(uuid.uuid4().__str__())"),以替换现有的 UUID,因为这是代码用于识别每个 JSON 的唯一标识符。JSON 中的路径可以是本地路径,只要在使用 JSON 时可访问即可。

(1) 选择原始数据源

过滤赛道

我们提供了多个标准化的输入池,作为参与者应用其策划策略的起点。这些数据集在两个关键维度上有所不同:

  • 计算规模:400M-1x、1B-1x、3B-1x、7B-1x、7B-2x
  • 预处理程度:DCLM-Pool 或 DCLM-RefinedWeb

在决定计算规模时,参与者应考虑其可用资源,并参考模型训练部分的训练成本。至于预处理,我们的主要竞赛池是 DCLM-Pool 的子集,仅经过文本提取(通过 resiliparse)。同时,我们还提供了标准化的 DCLM-RefinedWeb 子集,它应用了 DCLM-BASELINE 的所有处理步骤,除了我们的 OH2.5 + ELI5 fastText 过滤器。这组池可供希望更方便地测试策划策略的参与者使用,作为我们 fastText 分类器的替代方案(无需重复 DCLM-Baseline 管道的早期部分)。

请注意,目前 DCLM-RefinedWeb 池并不完全匹配 DCLM-Pool 竞赛池的处理版本。因此,我们不会将它们的提交结果合并到同一个排行榜中。有关如何下载特定输入池的详细信息,请参阅下载资源部分。

下载适当的起始池后,如果您希望使用/扩展我们的处理代码,则需要为其创建一个参考 JSON。最重要的是,该 JSON 应包含指向您存储的输入池的 URL。

混合赛道

对于混合赛道,参与者可以创建并注册一个新源(例如,维基百科、GitHub 等)。在这种情况下,他们应按照以下步骤操作:

  • 确保您的数据以 JSONL 格式存储,最好使用 zstandard 压缩(尽管未压缩或 gzip 压缩的文件也可以),其中每一行对应一个单独的页面/文档。
  • 这些 JSONL 中的键名应与此处一致。最重要的是,每一行都应有一个 "text" ,其中包含页面的实际内容。
  • exp_data/datasets/raw_sources 中创建一个参考 JSON。这些充当源的“身份证”,并包含关键信息,例如内容来源、大小以及存储位置。

(2) 数据处理

给定所需的原始数据集,这是参与者应用自己的自定义数据策划策略的关键步骤。要开始,请使用我们提供的数据处理脚本,其中包含各种过滤和去重操作。具体来说,这些操作分为两组。

基于 Ray 的过滤和清洗

我们的代码库包含一个基于 ray 的数据处理引擎,最适合高度并行化地应用“局部操作”,这些操作独立地对每一页进行操作(例如,过滤)。该引擎的入口点是 ray_processing/process.py,使用它涉及以下步骤。

  1. 定义一组处理步骤
    创建一个管道配置 YAML 文件,指定操作。
    请参阅我们对 C4 的复现示例。
    关于定义管道的更多详细信息,请参阅此处

  2. 设置 Ray 集群
    数据处理脚本依赖于 Ray 来分布式处理数据。该集群可以在单个节点上启动(用于小规模数据处理),也可以使用 AWS EC2 实例。
    还正在进行将 Ray 部署到 slurm 设置的工作,尽管这一努力仍在进行中。

    Slurm是一个开源作业调度系统,为Linux集群设计。

    要启动本地集群,请使用以下命令:

    ray start --head --port 6379
    

    要使用 AWS EC2 实例启动集群,请使用以下命令:

    ray up <your_cluster_config>
    

    其中 <your_cluster_config> 是一个集群配置脚本,取决于您的具体用例。我们邀请读者查阅 Ray 文档,了解如何创建此配置文件。

    重要:在使用 EC2 实例时,请确保在作业完成后使用 ray down <your_cluster_config> 关闭集群,以免产生不必要的费用!

    示例配置文件可以在此处查看(请确保根据需要进行调整):

    cluster_name: test-processing
    max_workers: 2
    upscaling_speed: 1.0
    available_node_types:
        ray.head.default:
            resources: {}
            node_config:
                ImageId: ami-0c5cce1d70efb41f5
                InstanceType: i4i.4xlarge
                IamInstanceProfile:
                    # 将 000000000000 替换为您的 12 位 IAM 账号 ID
                    Arn: arn:aws:iam::000000000000:instance-profile/ray-autoscaler-v1
        ray.worker.default:
            min_workers: 2
            max_workers: 2
            node_config:
                ImageId: ami-0c5cce1d70efb41f5
                InstanceType: i4i.4xlarge
                IamInstanceProfile:
                    # 将 000000000000 替换为您的 12 位 IAM 账号 ID
                    Arn: arn:aws:iam::000000000000:instance-profile/ray-autoscaler-v1
    
    # 云提供商特定配置
    provider:
        type: aws
        region: us-west-2
        cache_stopped_nodes: False
    
    setup_commands:
        - sudo mkfs -t xfs /dev/nvme1n1
        - sudo mount /dev/nvme1n1 /tmp
        - sudo chown -R $USER /tmp
        - sudo chmod -R 777 /tmp
        - wget https://repo.anaconda.com/miniconda/Miniconda3-py310_23.3.1-0-Linux-x86_64.sh -O miniconda.sh
        - bash ~/miniconda.sh -f -b -p /tmp/miniconda3/
        - echo 'export PATH="/tmp/miniconda3/bin/:$PATH"' >> ~/.bashrc
        # 在此处添加您的 AWS 凭证
        - echo 'export AWS_ACCESS_KEY_ID=' >> ~/.bashrc
        - echo 'export AWS_SECRET_ACCESS_KEY=' >> ~/.bashrc
        - pip install --upgrade pip setuptools wheel
        - pip install -U "ray[default] @ https://s3-us-west-2.amazonaws.com/ray-wheels/latest/ray-3.0.0.dev0-cp310-cp310-manylinux2014_x86_64.whl"
        - pip install boto3==1.26.90
        - pip install s3fs==2022.11.0
        - pip install psutil
        - pip install pysimdjson
        - pip install pyarrow
        - git clone https://github.com/mlfoundations/dclm.git
        - pip install -r dclm/requirements.txt
        - cd dclm && python3 setup.py install
    
  3. 运行处理脚本
    要运行处理脚本,在本地集群的情况下,只需运行以下命令:

    python3 ray_processing/process.py --source_ref_paths <source_json> --readable_name <name> --output_dir <s3_output_dir> --config_path <config_yaml> --source_name <source_name>
    

    当使用 EC2 实例时,您需要连接到集群,然后启动命令:

    # 在本地终端中
    ray attach <your_cluster_config>
    
    # 在集群 EC2 实例中
    cd dclm
    export PYTHONPATH=$(pwd)
    python3 ray_processing/process.py --source_ref_paths <source_json> --readable_name <name> --output_dir <s3_output_dir> --config_path <config_yaml> --source_name <source_name>
    
  4. 监控和关闭
    您可以通过输出目录中的 global_stats.jsonl 文件跟踪数据处理的进度。如果运行成功,exp_data/datasets/untokenized/ 中应已创建一个新的未分词数据集 JSON,如果您希望保存它,请提交并推送。作业完成后,您可以通过 ray stop(在本地集群情况下)或 ray down <your_cluster_config>(在 AWS EC2 情况下)关闭集群。在使用 EC2 时,这一点非常重要,以免产生额外费用!

去重

我们最高效(也是推荐的)去重实现是用 Rust 编写的,而不是 Python。为了像我们在 DCLM-BASELINE 中那样对原始文本进行去重,我们使用 dedup 子目录中提供的 Rust 工具,其中包括几个程序,用于跨语料库中的文档进行模糊去重,即识别语料库中跨文档的近似重复内容。在 DCLM-BASELINE 中,我们具体使用的是 BFF(dedup/bff)。每个包含 Rust 工具的目录的 README 中都包含了运行去重的具体说明。

遗憾的是,目前这些 Rust 实现无法与上面描述的基于 Ray 的管道集成(即,无法添加到 YAML 配置中)。相比之下,我们还使用 ray 创建了工具,用于识别完全相同的内容和 URL 重复项(ray_processing/dedup_jsonl.py)。它可以集成到上面的基于 Ray 的工作流中,但我们并未在 DCLM-BASELINE 中使用这种形式的去重。

(3) 分词和洗牌

完成所有数据策划后,您现在可以通过分词和洗牌准备您的数据集以进行训练评估。我们支持基于 Rust 和基于 Ray 的分词洗牌,尽管我们推荐在大多数工作流中使用基于 Rust 的方法,因为它是在单机上运行且更高效。对于那些无法在单机上处理的数据集,基于 Ray 的方法仍然很有用。

基于 Rust

系统要求:

  • 足够的 RAM 来处理 num_threads * num_local_cells 本地单元。通常这将远小于数据集本身的大小。
  • 足够的磁盘空间来容纳整个数据集的 2 倍大小。

尽管代码支持从 AWS 读取和写入,但有时不太可靠,我们强烈建议使用 AWS CLI 或 s5cmd 将您的数据从 S3 复制到本地,并使用本地路径。

(对象存储有时存在访问错误的问题)

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs > rustup.sh
bash rustup.sh -y
source ~/.bashrc

# 从 DCLM 文件夹中
cd rust_processing/tokshuf-rs
cargo build --release

# 如果需要,将数据集从 S3 复制到本地

cargo run --release -- \
--input path/to/raw/dataset \
--local-cell-dir tmp/path/to/storage/for/local/cells \
--output path/to/output/location \
--tokenizer "EleutherAI/gpt-neox-20b" \ # 其他支持的选项是 "meta-llama/Meta-Llama-3-8B"
--seqlen 2049 \
--wds-chunk-size 8192 \
--num-local-cells 512 # 512 是一个很好的折衷方案,但对于非常大的数据集,可能需要将此值提高得更高

示例命令:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs > rustup.sh
bash rustup.sh -y
source ~/.bashrc

# 从 DCLM 文件夹中
cd rust_processing/tokshuf-rs
cargo build --release

aws s3 cp --recursive s3://commoncrawl/contrib/datacomp/DCLM-baseline/global-shard_03_of_10/local-shard_1_of_10/ dclm_local
mkdir tokshuf_tmp
mkdir dclm_tokshuf

cargo run --release -- \
--input dclm_local \
--local-cell-dir tokshuf_tmp \
--output dclm_tokshuf \
--tokenizer "EleutherAI/gpt-neox-20b" \
--seqlen 2049 \
--wds-chunk-size 8192 \
--num-local-cells 512

由于这是基于 Rust 的代码,因此不会在 exp_data 自动生成数据集 JSON。您可以复制一个现有的文件,例如 exp_data/datasets/tokenized/rw_v2_w_substr_cc_v3_f0.15_resiliparse_try3_100_nodes.jsonexp_data/datasets/tokenized/dclm_rust_tok_shuf_test.json,并确保修改相关字段(最重要的是 UUID、名称、数据集 URL 和清单 URL)。

基于 Ray

  1. 设置 Ray 集群
    按照数据处理步骤中的方式设置 Ray 集群。

  2. 运行分词和洗牌脚本

    python ray_processing/tokenize_shuffle.py --source_ref_paths <source_jsons> --readable_name <name> --output <s3_output_dir> --content_key text --do_sample --default_dataset_yaml <mixing_yaml>
    
  3. 关闭集群
    按照数据处理步骤中的方式关闭 Ray 集群。

tokenize_shuffle.py 脚本会创建一个 webdataset 格式的数据集,以及一个 manifest.jsonl 文件。此文件是训练脚本所需的,它包含有关数据集每个分片中序列数量的信息。如果需要,您也可以通过以下命令手动创建此清单文件:

python -m open_lm.utils.make_wds_manifest --data-dir <tokenized_data_dir>

(4) 模型训练

要使用分词后的数据集和我们固定的训练配方之一来训练模型:

  1. 运行训练脚本

    torchrun --nproc-per-node <num_gpus> -m training.train -- --scale <scale> --data-config <tokenized_json> --logs <log_dir> --attn-name torch_attn [--remote-sync <s3_bucket>] [--report-to-wandb] [--num-checkpoints checkpoints] [--multiple-data-passes] [--acc 4] [--torchcompile]
    

    参数说明:

    • scale 可在 training/configs 中找到(不要包含路径和 .json)。
    • data-configexp_data 中的数据集:exp_data/datasets/tokenized(包含路径和 .json)。
    • logs 是您希望本地日志写入的位置。
    • attn-name 指定注意力实现(推荐使用 torch_attn)。
    • remote-sync 是将检查点写入 S3 的位置。
    • report-to-wandb 将日志记录到 Weights & Biases。
    • num-checkpoints 设置要保存的检查点数量,尽最大努力,可能实际上并非此数量。
    • multiple-data-passes 启用对数据集进行多次训练。
    • acc 设置梯度累积,这会根据规模自动指定,但您可能需要根据可用资源手动调整。
    • torchcompile 使用 torchcompile 加速训练,适用于包含“fast”的规模。

    示例命令:

    torchrun --nproc-per-node 8 -m training.train -- --scale 1b_1x_fast --data-config exp_data/datasets/tokenized/rw_v2_w_substr_cc_v3_f0.15_resiliparse_try3_100_nodes.json --logs rw_training_local_logs --attn-name torch_attn --torchcompile
    

    注意:在运行此示例之前,您需要修改 exp_data/datasets/tokenized/rw_v2_w_substr_cc_v3_f0.15_resiliparse_try3_100_nodes.json 中的 dataset_urlmanifest_url

    您可以预期以下每个赛道的训练时间:

    规模 模型参数 训练标记 训练 FLOPs H100 训练小时数 池大小
    400M-1x 412M 8.2B 2.0e19 26 137B
    1B-1x 1.4B 28B 2.4e20 240 1.64T
    3B-1x 2.8B 55.9B 9.4e20 740 3.18T
    7B-1x 6.9B 138B 5.7e21 3700 7.85T
    7B-2x 6.9B 276B 1.1e22 7300 15.7T
  2. 监控和管理您的训练作业
    使用 slurm sbatch 脚本或 SageMaker 在各种计算基础设施上运行实验。

(5) 模型评估

评估 YAML 文件位于 eval 文件夹中,它们决定了要评估的任务。例如,eval/mmlu_and_lowvar.yaml 包含用于计算核心指标和 MMLU 的任务,而 eval/heavy.yaml 运行额外的任务,以便也可以计算聚合指标。

使用以下方法评估训练好的模型:

  1. 首选方法
    此方法使用从训练中自动生成的 JSON 文件中的 UUID(可在 exp_data/models 中找到)。

    python tools/eval_expdb.py --num_gpus <num_gpus> --no_skip --output_dir <output_dir> --eval_yaml "eval/<eval_yaml>" -f "uuid=<model_uuid>" --skip_perplexity
    

    示例命令:
    如果我们训练的模型将其 JSON 保存在 exp_data/models/rw_original-open_lm_1b-5.0.json 中,UUID 是 c014f9d6-51d0-429d-9a3e-fe82e53c37fd。请注意,此命令实际上不会运行,因为 checkpoint_urlparams_url 不是公开可访问的;但您训练的模型自动生成的 JSON 将具有正确且可访问的路径。

    python tools/eval_expdb.py --num_gpus 8 --no_skip --output_dir exp_data/evals/ --eval_yaml "eval/mmlu_and_lowvar.yaml" -f "uuid=c014f9d6-51d0-429d-9a3e-fe82e53c37fd" --skip_perplexity
    
  2. 直接评估
    此方法需要手动指定检查点路径和模型参数文件(两者都是训练的输出),以及指定模型配置(training/open_lm_configs)。

    torchrun --nproc_per_node <num_gpus> eval/eval_openlm_ckpt.py --checkpoint <checkpoint> --eval-yaml <eval_yaml> --config <model_params_file> --model <open_lm_config> --output-file <output_file_path>
    

    我们还支持对现有的 Hugging Face 模型进行评估:

    torchrun --nproc_per_node 8 eval/eval_openlm_ckpt.py --hf-model allenai/OLMo-1B-0724-hf --tokenizer allenai/OLMo-1B-0724-hf --eval-yaml "eval/mmlu_and_lowvar.yaml" --output-file exp_data/evals/olmo_eval_mmlu_and_lowvar.json --donot-compute-perplexity
    

提交

完成模型训练和评估后,模型评估 JSON 文件已生成,位于 exp_data/evals

现在,您可以向主仓库发起拉取请求,与团队分享您的结果,并将其提交到排行榜。

下载资源

数据集

我们提供了多个数据集,既作为每个竞赛规模的起点,也作为我们处理管道的结果。

  • 竞赛规模的原始数据池可通过下载 data/competition_pools/preextracted/ 中的相应路径获得。此文件夹包含 .txt 文件,列出每个 400m-1x、1b-1x、3b-1x、7b-1x、7b-2x 规模的输入数据池的 S3 路径。所有这些数据池都是我们整个原始池 DCLM-pool 的子集,可通过 CommonCrawl S3 存储桶访问。每个子集包含仅经过文本提取的原始数据,并且可以按照上述步骤进行处理。要下载这些池中的任何一个,我们建议使用 s5cmd run cmds.txt,其中 cmds.txt 是您根据所需目标路径 <YOUR_DEST_PATH> 自动生成的命令文件(以下示例为 400m-1x 池的前两个分片)。

    cp s3://commoncrawl/contrib/datacomp/DCLM-pool/crawl=CC-MAIN-2013-20/1368696382185/CC-MAIN-20130516092622-00084-ip-10-60-113-184.ec2.internal.jsonl.gz  <YOUR_DEST_PATH>/crawl=CC-MAIN-2013-20/1368696382185/CC-MAIN-20130516092622-00084-ip-10-60-113-184.ec2.internal.jsonl.gz
    cp s3://commoncrawl/contrib/datacomp/DCLM-pool/crawl=CC-MAIN-2013-20/1368696382892/CC-MAIN-20130516092622-00074-ip-10-60-113-184.ec2.internal.jsonl.gz  <YOUR_DEST_PATH>/crawl=CC-MAIN-2013-20/1368696382892/CC-MAIN-20130516092622-00074-ip-10-60-113-184.ec2.internal.jsonl.gz
    ⋮
    

    我们还提供了 data/competition_pools/raw_warcs/ 文件夹,其中包含对应于各个规模的原始 WARC 转储。如果希望从 HTML 而不是预提取的文本开始,这些文件才相关。请注意,这些文件不是 JSONL 格式,因此如果要使用我们的管道(例如,使用 resiliparse 提取),则需要首先将它们转换为 JSONL(例如,参见我们用于执行此类转换的脚本)。

    [已弃用] 竞赛池还可在 Hugging Face 上找到,不同规模的池分别存储在不同的存储库中。请注意,我们不再支持 1b-5x 规模,我们用 3b-1x 规模替换了它。

  • 我们处理好的最终数据集 DCLM-BASELINE 可在 Hugging Face 上找到,提供 zstd 压缩的 jsonl 和 parquet 格式。前者的版本也可在 CommonCrawl S3 存储桶中找到,访问方式见此链接。

  • 我们还提供了一个版本的数据集,执行了我们预处理的所有步骤,除了最后一步(即 fasttext 过滤)。这个版本称为 DCLM-RefinedWeb,也可在 CommonCrawl S3 存储桶中找到,访问方式见此链接。对于官方竞赛子集的 DCLM-RefinedWeb,请下载以下分片(以大括号表示法书写)。遗憾的是,我们目前还没有 400M-1x 规模的固定子集,因为其大小小于一个本地分片,这是我们进行去重的单位。

    # 1B-1x(使用 1 个本地分片,共 100 个)
    
    s3://commoncrawl/contrib/datacomp/DCLM-refinedweb/global-shard_03_of_10/local-shard_1_of_10/
    
    # 3B-1x(使用 2 个本地分片)
    
    s3://commoncrawl/contrib/datacomp/DCLM-refinedweb/global-shard_03_of_10/local-shard_{1,8}_of_10/
    
    # 7B-1x(使用 5 个本地分片)
    
    s3://commoncrawl/contrib/datacomp/DCLM-refinedweb/global-shard_03_of_10/local-shard_{1,3,6,8,9}_of_10/
    
    # 7B-2x(使用全球分片 03 中的所有 10 个本地分片)
    
    s3://commoncrawl/contrib/datacomp/DCLM-refinedweb/global-shard_03_of_10/
    

    重要的是,从 Common Crawl 存储桶下载需要有效的 AWS 账户凭证(即 AWS_SECRET_ACCESS_KEYAWS_ACCESS_KEY_ID)。然而,实际复制数据不应产生费用。

预训练模型

我们通过 Hugging Face 上的 DCLM 集合提供了使用我们的数据集预训练的模型,链接在此处。这些模型可以使用 OpenLM 库下载和评估。

使用 DCLM 基线训练 1B 模型的示例命令

这里我们提供了一组快速设置、分词洗牌、训练和评估的命令。有关过滤的详细信息,请参阅相关部分。有关以下命令的具体详细信息,请参阅相关部分。

使用 Conda 设置

conda create -n dclm python=3.10
conda activate dclm

git clone https://github.com/mlfoundations/DCLM.git
cd DCLM
export PYTHONPATH="$(pwd):$PYTHONPATH"

pip install -r requirements.txt

分词洗牌

这里包括使用 AWS CLI 下载 DCLM 数据。运行以下命令后,通常需要在 exp_data/datasets/tokenized创建一个数据集 JSON,但我们在本教程中为您提供了一个(exp_data/datasets/tokenized/dclm_gs3_ls1_rs_tokshuf.json)。

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs > rustup.sh
bash rustup.sh -y
source ~/.bashrc
pushd rust_processing/tokshuf-rs
cargo build --release

aws s3 cp --recursive s3://commoncrawl/contrib/datacomp/DCLM-baseline/global-shard_03_of_10/local-shard_1_of_10/ dclm_local
mkdir tokshuf_tmp
mkdir dclm_tokshuf

cargo run --release -- \
--input dclm_local \
--local-cell-dir tokshuf_tmp \
--output dclm_tokshuf \
--tokenizer "EleutherAI/gpt-neox-20b" \
--seqlen 2049 \
--wds-chunk-size 8192 \
--num-local-cells 512

popd

训练

data-config 来自分词洗牌后创建的 JSON(对于 Rust 代码是手动创建的,对于 Ray 是自动生成的)。

torchrun --nproc-per-node 8 -m training.train -- --scale 1b_1x_fast --data-config exp_data/datasets/tokenized/dclm_gs3_ls1_rs_tokshuf.json --logs dclm_rs_tokshuf_training_local_logs --attn-name torch_attn --torchcompile

评估

运行以下命令,将 UUID 替换为您要评估的模型的 UUID,该 UUID 可以在训练命令输出的 exp_data/models 中的 JSON 文件中找到。

python tools/eval_expdb.py --num_gpus 8 --no_skip --output_dir exp_data/evals/ --eval_yaml "eval/mmlu_and_lowvar.yaml" -f "uuid=UUID" --skip_perplexity

如何贡献

我们欢迎对 DCLM 框架进行改进的贡献。请遵循我们的贡献指南提交拉取请求和报告问题。

如何引用我们

如果您在研究中使用了我们的数据集或模型,请按照以下方式引用我们:

@article{li2024datacomplm,
      title={DataComp-LM: In search of the next generation of training sets for language models},
      author={Jeffrey Li and Alex Fang and Georgios Smyrnis and Maor Ivgi and Matt Jordan and Samir Gadre and Hritik Bansal and Etash Guha and Sedrick Keh and Kushal Arora and Saurabh Garg and Rui Xin and Niklas Muennighoff and Reinhard Heckel and Jean Mercat and Mayee Chen and Suchin Gururangan and Mitchell Wortsman and Alon Albalak and Yonatan Bitton and Marianna Nezhurina and Amro Abbas and Cheng-Yu Hsieh and Dhruba Ghosh and Josh Gardner and Maciej Kilian and Hanlin Zhang and Rulin Shao and Sarah Pratt and Sunny Sanyal and Gabriel Ilharco and Giannis Daras and Kalyani Marathe and Aaron Gokaslan and Jieyu Zhang and Khyathi Chandu and Thao Nguyen and Igor Vasiljevic and Sham Kakade and Shuran Song and Sujay Sanghavi and Fartash Faghri and Sewoong Oh and Luke Zettlemoyer and Kyle Lo and Alaaeldin El-Nouby and Hadi Pouransari and Alexander Toshev and Stephanie Wang and Dirk Groeneveld and Luca Soldaini and Pang Wei Koh and Jenia Jitsev and Thomas Kollar and Alexandros G. Dimakis and Yair Carmon and Achal Dave and Ludwig Schmidt and Vaishaal Shankar},
      year={2024},
      journal={arXiv preprint arXiv:2406.11794}
}

当使用 DCLM 评估套件时,请确保引用所有原始评估论文。评估的 BibTeX 文件可在 evaluation_bibtex 中找到。

当使用 DCLM 进行训练时,请确保引用主要训练框架的依赖项。训练的 BibTeX 文件可在 training_bibtex 中找到。

许可证

本项目在 MIT 许可证下授权。详细信息请参阅许可证文件。


以上是网页的正文内容翻译。

posted on 2025-06-03 14:10  马儿慢些走  阅读(211)  评论(0)    收藏  举报

导航