DataComp-LM (DCLM)
目录
简介
DataComp-LM (DCLM)是一个用于构建和训练具有多样化数据集的大型语言模型(LLMs)的综合框架。它提供了来自CommonCrawl的超过300T未经过滤的标记的标准语料库,基于open_lm框架的有效预训练方法,以及超过50项评估的广泛套件。该存储库提供了处理原始数据、分词、打乱、训练模型和评估其性能的工具和指南。
DCLM使研究人员能够在不同的计算规模上进行各种数据集构建策略的实验,从411M到7B参数模型。我们的基线实验表明,通过优化数据集设计,模型性能得到了显著提升。
DCLM已经促成了几个高质量数据集的创建,这些数据集在不同规模上表现良好,并且优于所有开放数据集。
开发更好的数据集以训练更经济的模型。 使用DataComp-LM,我们开发了一个高质量的数据集DCLM-BASELINE,用于训练具有强大计算性能权衡的模型。我们在核心任务集(左)和MMLU 5-shot(右)上进行比较。DCLM-BASELINE(橙色)相对于闭源模型(十字)和其他开源数据集和模型(圆圈)显示出有利的性能。
提交流程:
-
(A) 参与者选择一个规模,较大的规模反映了更多的目标训练标记和/或模型参数。 最小规模是400m-1x,即400m参数模型进行计算最优训练(1x),最大规模是7B-2x,即7B参数模型使用计算最优所需标记量的两倍进行训练。
-
(B) 参与者过滤数据池(过滤赛道)或混合自己的数据(自带数据赛道)以创建数据集。
-
(C) 使用精选的数据集,参与者使用标准化的训练代码和特定规模的超参数训练语言模型,然后
-
(D) 在53个下游任务上进行评估,以判断数据集质量。
更多详细信息,请参阅我们的论文。
排行榜
DCLM排行榜展示了在各种规模和数据集上训练的模型的性能。排行榜定期更新,包含来自社区的最新提交。
以下是我们的模型与7B规模下其他模型的比较。
模型 | 参数 | 标记 | 开放数据集? | CORE | MMLU | EXTENDED |
---|---|---|---|---|---|---|
开放权重,闭源数据集 | ||||||
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,请按照以下步骤操作:
- 克隆存储库:
git clone https://github.com/mlfoundations/DCLM.git cd DCLM
- 安装依赖项:
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
- 设置环境: DCLM使用AWS进行存储和可能的计算后端,以及使用ray进行分布式处理。 确保您已设置好AWS和Ray集群所需的环境变量和配置。
我们建议在DCLM中使用Python 3.10。
选择原始数据源
如果您要创建新的数据源:
- 确保您的数据以JSONL格式存储(最好使用zstandard压缩)。
- 键名应与此处一致。
- 在exp_data/datasets/raw_sources中创建一个参考JSON文件。
如果您要选择原始数据源进行后续处理:
- 确定您打算使用的原始数据源,它对应于一个数据集参考(即raw_sources中的JSON文件)。
- 参考JSON包含实际数据的URL和其他元数据,用作后续处理的输入。
处理数据
按照以下步骤处理原始数据:
-
定义一组处理步骤: 创建一个pipeline配置YAML文件,指定操作步骤。 参考我们的C4复现示例。 有关定义pipeline的更多详细信息,请参见此处。
-
设置Ray集群: 数据处理脚本依赖Ray进行分布式数据处理。此集群可以在单个节点上启动(用于小规模数据处理),也可以使用AWS EC2实例。
要启动本地集群,使用以下命令:
ray start --head --port 6379
要使用AWS EC2实例启动集群,使用以下命令:
ray up <your_cluster_config>
其中
<your_cluster_config>
是根据您的具体用例而定的集群配置脚本。我们建议您查阅Ray文档,了解如何创建此配置文件的说明。重要提示:使用EC2实例时,请确保在作业完成后关闭集群,以避免不必要的费用!
-
运行处理脚本: 对于本地集群,只需运行以下命令:
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 dcnlp 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>
-
监控和关闭: 您可以通过输出目录中的
global_stats.jsonl
文件跟踪数据处理进度。作业完成后,可以通过ray stop
(本地集群情况)或ray down <your_cluster_config>
(AWS EC2情况)关闭集群。使用EC2时,这一步非常重要,以避免产生额外费用!
去重
要像我们在DCLM-Baseline中那样对原始文本进行去重,请使用dedup子目录中提供的工具。这里我们包含了几个用于去重的rust工具,但我们推荐使用位于dedup/bff的BFF。每个包含rust工具的目录中的readme文件中都有运行去重的具体说明。
请注意,dedup中的代码特指跨文档模糊去重,即识别语料库中文档之间的近似重复。用于识别精确内容和URL重复的Ray工具包含在ray_processing/dedup_jsonl.py中(但我们在DCLM-Baseline中不使用这种形式的去重)。
分词和打乱
处理完原始文本后,您应该将其转换为分词后的数据集并进行打乱以便训练:
-
设置Ray集群: 按照处理步骤中的相同方式设置Ray集群。
-
运行分词和打乱脚本:
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>
-
关闭: 按照处理步骤中的方式关闭Ray集群。
tokenize_shuffle.py
脚本会创建一个webdataset
格式的数据集,以及一个manifest.jsonl
文件。训练脚本需要这个文件,它包含了数据集每个分片中序列数量的信息。如果需要,也可以通过以下命令手动创建这个manifest文件:
python -m open_lm.utils.make_wds_manifest --data-dir <tokenized_data_dir>
模型训练
使用分词后的数据集训练模型:
- 运行训练脚本:
torchrun --nproc-per-node 8 -m training.train --scale <scale> <tokenized_json> --logs <log_dir> [--remote-sync <s3_bucket>] [--chinchilla-multiplier <multiplier>] [--clean-exp] [--report-to-wandb]
您可以预期每个轨道的训练时间如下:
规模 | 模型参数 | 训练token数 | 训练FLOPs | 训练H100小时 | 池大小 |
---|---|---|---|---|---|
400M-1x | 412M | 8.2B | 2.0e19 | 26 | 137B |
1B-1x | 1.4B | 28B | 2.4e20 | 240 | 1.64T |
1B-5x | 1.4B | 138B | 1.2e21 | 1200 | 8.20T |
7B-1x | 6.9B | 138B | 5.7e21 | 3700 | 7.85T |
7B-2x | 6.9B | 276B | 1.1e22 | 7300 | 15.7T |
- 监控和管理训练任务: 使用slurm sbatch脚本或Sagemaker在各种计算基础设施上运行实验。
评估
使用以下方法评估训练好的模型:
- 首选方法:
python tools/eval_expdb.py --start_idx 0 --end_idx 3 --filters name=<过滤器> --prefix_replacement <前缀替换> --num_gpus 8 --output_dir <s3输出目录> --eval_yaml <评估yaml文件>
- 直接评估:
torchrun --nproc_per_node <GPU数量> eval/eval_openlm_ckpt.py --checkpoint <检查点> --eval-yaml <评估yaml文件> --config <模型参数文件> --model <open_lm配置> --output-file <输出文件路径>
提交
当你完成模型训练和评估后,一个模型评估json文件会被生成并保存在exp_data/evals目录下。 现在你可以向主仓库提交一个拉取请求,与团队分享你的结果并将其提交到排行榜。
贡献
我们欢迎对DCLM框架的改进贡献。请遵循我们的贡献指南来提交拉取请求和报告问题。
模型微调
使用OpenLM库,也可以对用DCLM训练的模型进行微调。具体步骤如下:
- 首先,创建输入数据为
jsonl
文件,每行是一个包含两个字段的样本:"instruction"和"response"(所以jsonl文件的每一行至少包含一个形如{"instruction": "示例指令", "response": "示例回答"}
的json对象)。对于OpenMathInstruct数据集的示例可以通过以下命令运行:
cd finetuning/
python download_data.py
- 之后,假设你的数据在
finetuning/sft_data/
目录下,运行以下命令将数据处理成OpenLM期望的格式:
python preprocess_data.py --input-files "./sft_data/**/*" --output-dir ./sft_data_tokenized/ --num-workers 1 --num-consumers 1
python -m open_lm.utils.make_wds_manifest --data-dir ./sft_data_tokenized/2048-v1/0 --tmp-dir tmp --num-workers 16
- 最后,你可以通过使用OpenLM来微调模型,在OpenLM训练命令中包含以下参数:
...
--squash-mask-left \
--target-mask-individual 50400 \
--target-mask-left 50300 \
...
完整命令示例如下:
git clone https://github.com/mlfoundations/open_lm.git
cd open_lm
torchrun <其他torchrun选项> open_lm/main.py \
--dataset-manifest ../sft_data_tokenized/manifest.jsonl \
--epochs 20 \
--fsdp \
--fsdp-amp \
--fsdp-limit-all-gathers \
--global-batch-size 1024 \
--grad-checkpointing \
--grad-clip-norm 1 \
--log-every-n-steps 100 \
--logs <日志路径> \
--lr 2e-05 \
--lr-cooldown-end 5e-06 \
--model training/open_lm_configs/open_lm_1b_swiglutorch.json \
--model-norm gain_only_lp_layer_norm \
--multiple-data-passes \
--name <实验名称> \
--precision amp_bfloat16 \
--pretrained <预训练检查点路径> \
--qk-norm \
--report-to wandb \
--seed 124 \
--squash-mask-left \
--target-mask-individual 50400 \
--target-mask-left 50300 \
--train-num-samples <每个epoch的训练token数> \
--warmup 1738 \
--wd 0.1 \
--workers 1
如何引用我们
如果你在研究中使用了我们的数据集或模型,请按以下方式引用我们:
@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评估套件时,请确保引用所有原始评估论文。evaluation_bibtex。
在使用DCLM进行训练时,请确保也引用主要的训练框架依赖。training_bibtex。
许可证
本项目采用MIT许可证。详细信息请参阅许可证文件。