open-instruct框架
这篇笔记主要记录以下问题:只使用huggingface下载的数据集中的一小部分数据进行数据训练。而且我不想修改open-instruct的加载数据集的代码,以及脚本中的--dataset_mixer_list
参数的指定等。下面是我的思路历程。
if args.dataset_name is not None:# Downloading and loading a dataset from the hub.raw_datasets = load_dataset(args.dataset_name,args.dataset_config_name,)elif args.dataset_mixer is not None:# mixing datasets via configraw_datasets = get_datasets(args.dataset_mixer,configs=args.dataset_config_name,splits=["train"],save_data_dir=args.dataset_mix_dir if accelerator.is_main_process else None,columns_to_keep=["messages"],)elif args.dataset_mixer_list is not None:# mixing datasets via configraw_datasets = get_datasets(args.dataset_mixer_list,configs=args.dataset_config_name,splits=["train"],save_data_dir=args.dataset_mix_dir if accelerator.is_main_process else None,columns_to_keep=["messages"],)
我在复现一个开源项目,tulu3大模型相关的项目。用的是open-instruct框架,测试的是https://huggingface.co/datasets/allenai/tulu-3-sft-mixture这个数据集,它的data如下,可以看到有6个parquet文件。
按照这个md文档:https://github.com/allenai/open-instruct/blob/main/docs/tulu3.md,进行的是这个实验:Llama-3.1-Tulu-3-8B-SFT Reproduction, 训练脚本如下:train.sh
,需要修改适配到自己的服务器水平,这里只是复制过来官方github仓库的脚本。
# modify the following `MACHINE_RANK`, `MAIN_PROCESS_IP`,
# `NUM_MACHINES`, `NUM_PROCESSES`, `PER_DEVICE_TRAIN_BATCH_SIZE`,
# `GRADIENT_ACCUMULATION_STEPS` according to your setup
MACHINE_RANK=0
MAIN_PROCESS_IP=localhost
NUM_MACHINES=8
NUM_PROCESSES=64
PER_DEVICE_TRAIN_BATCH_SIZE=1
GRADIENT_ACCUMULATION_STEPS=2
accelerate launch \--mixed_precision bf16 \--num_machines 8 \--num_processes 64 \--machine_rank $MACHINE_RANK \--main_process_ip $MAIN_PROCESS_IP \--main_process_port 29400 \--use_deepspeed \--deepspeed_config_file configs/ds_configs/stage3_no_offloading_accelerate.conf \--deepspeed_multinode_launcher standard open_instruct/finetune.py \--model_name_or_path meta-llama/Llama-3.1-8B \--tokenizer_name meta-llama/Llama-3.1-8B \--use_slow_tokenizer \--use_flash_attn \--max_seq_length 4096 \--preprocessing_num_workers 128 \--per_device_train_batch_size $PER_DEVICE_TRAIN_BATCH_SIZE \--gradient_accumulation_steps $GRADIENT_ACCUMULATION_STEPS \--learning_rate 5e-06 \--lr_scheduler_type linear \--warmup_ratio 0.03 \--weight_decay 0.0 \--num_train_epochs 2 \--output_dir output/sft_8b \--with_tracking \--report_to wandb \--logging_steps 1 \--reduce_loss sum \--model_revision main \--dataset_mixer_list allenai/tulu-3-sft-mixture 1.0 \--checkpointing_steps epoch \--dataset_mix_dir output/sft_8b \--exp_name tulu-3-8b-sft \--seed 123
可以看到 --dataset_mixer_list allenai/tulu-3-sft-mixture 1.0
用到了这个数据集,我提前下载到本地:
from datasets import Dataset, load_dataset, load_from_disk
# dataset = load_dataset("allenai/tulu-v2-sft-mixture")
dataset = load_dataset("allenai/tulu-3-sft-mixture")
dataset
按照hf默认的设置,会下载到这个路径
.cache/huggingface/datasets/allenai___tulu-3-sft-mixture/default/0.0.0/55e9fd6d41c3cd1a98270dff07557bc2a1e1ba91
这个路径后面的一些奇怪的数字和字母是hf自动生成的,比如版本号0.0.0之类。
可以看到,如果按照hf默认的load_dataset会产生如此多的文件,这里借助chatGPT解释一下:
$~/.cache/huggingface/datasets/allenai___tulu-3-sft-mixture/default/0.0.0/55e9fd6d41c3cd1a98270dff07557bc2a1e1ba91$ ls
cache-794e135b6dcca119.arrow cache-aab3a83f436933f5_00046_of_00128.arrow cache-aab3a83f436933f5_00095_of_00128.arrow
cache-954e0d1f5d398acc.arrow cache-aab3a83f436933f5_00047_of_00128.arrow cache-aab3a83f436933f5_00096_of_00128.arrow
cache-a3b8d15dc24b3207.arrow cache-aab3a83f436933f5_00048_of_00128.arrow cache-aab3a83f436933f5_00097_of_00128.arrow
cache-aab3a83f436933f5_00000_of_00128.arrow cache-aab3a83f436933f5_00049_of_00128.arrow cache-aab3a83f436933f5_00098_of_00128.arrow
cache-aab3a83f436933f5_00001_of_00128.arrow cache-aab3a83f436933f5_00050_of_00128.arrow cache-aab3a83f436933f5_00099_of_00128.arrow
cache-aab3a83f436933f5_00002_of_00128.arrow cache-aab3a83f436933f5_00051_of_00128.arrow cache-aab3a83f436933f5_00100_of_00128.arrow
cache-aab3a83f436933f5_00003_of_00128.arrow cache-aab3a83f436933f5_00052_of_00128.arrow cache-aab3a83f436933f5_00101_of_00128.arrow
cache-aab3a83f436933f5_00004_of_00128.arrow cache-aab3a83f436933f5_00053_of_00128.arrow cache-aab3a83f436933f5_00102_of_00128.arrow
cache-aab3a83f436933f5_00005_of_00128.arrow cache-aab3a83f436933f5_00054_of_00128.arrow cache-aab3a83f436933f5_00103_of_00128.arrow
cache-aab3a83f436933f5_00006_of_00128.arrow cache-aab3a83f436933f5_00055_of_00128.arrow cache-aab3a83f436933f5_00104_of_00128.arrow
cache-aab3a83f436933f5_00007_of_00128.arrow cache-aab3a83f436933f5_00056_of_00128.arrow cache-aab3a83f436933f5_00105_of_00128.arrow
cache-aab3a83f436933f5_00008_of_00128.arrow cache-aab3a83f436933f5_00057_of_00128.arrow cache-aab3a83f436933f5_00106_of_00128.arrow
cache-aab3a83f436933f5_00009_of_00128.arrow cache-aab3a83f436933f5_00058_of_00128.arrow cache-aab3a83f436933f5_00107_of_00128.arrow
cache-aab3a83f436933f5_00010_of_00128.arrow cache-aab3a83f436933f5_00059_of_00128.arrow cache-aab3a83f436933f5_00108_of_00128.arrow
cache-aab3a83f436933f5_00011_of_00128.arrow cache-aab3a83f436933f5_00060_of_00128.arrow cache-aab3a83f436933f5_00109_of_00128.arrow
cache-aab3a83f436933f5_00012_of_00128.arrow cache-aab3a83f436933f5_00061_of_00128.arrow cache-aab3a83f436933f5_00110_of_00128.arrow
cache-aab3a83f436933f5_00013_of_00128.arrow cache-aab3a83f436933f5_00062_of_00128.arrow cache-aab3a83f436933f5_00111_of_00128.arrow
cache-aab3a83f436933f5_00014_of_00128.arrow cache-aab3a83f436933f5_00063_of_00128.arrow cache-aab3a83f436933f5_00112_of_00128.arrow
cache-aab3a83f436933f5_00015_of_00128.arrow cache-aab3a83f436933f5_00064_of_00128.arrow cache-aab3a83f436933f5_00113_of_00128.arrow
cache-aab3a83f436933f5_00016_of_00128.arrow cache-aab3a83f436933f5_00065_of_00128.arrow cache-aab3a83f436933f5_00114_of_00128.arrow
cache-aab3a83f436933f5_00017_of_00128.arrow cache-aab3a83f436933f5_00066_of_00128.arrow cache-aab3a83f436933f5_00115_of_00128.arrow
cache-aab3a83f436933f5_00018_of_00128.arrow cache-aab3a83f436933f5_00067_of_00128.arrow cache-aab3a83f436933f5_00116_of_00128.arrow
cache-aab3a83f436933f5_00019_of_00128.arrow cache-aab3a83f436933f5_00068_of_00128.arrow cache-aab3a83f436933f5_00117_of_00128.arrow
cache-aab3a83f436933f5_00020_of_00128.arrow cache-aab3a83f436933f5_00069_of_00128.arrow cache-aab3a83f436933f5_00118_of_00128.arrow
cache-aab3a83f436933f5_00021_of_00128.arrow cache-aab3a83f436933f5_00070_of_00128.arrow cache-aab3a83f436933f5_00119_of_00128.arrow
cache-aab3a83f436933f5_00022_of_00128.arrow cache-aab3a83f436933f5_00071_of_00128.arrow cache-aab3a83f436933f5_00120_of_00128.arrow
cache-aab3a83f436933f5_00023_of_00128.arrow cache-aab3a83f436933f5_00072_of_00128.arrow cache-aab3a83f436933f5_00121_of_00128.arrow
cache-aab3a83f436933f5_00024_of_00128.arrow cache-aab3a83f436933f5_00073_of_00128.arrow cache-aab3a83f436933f5_00122_of_00128.arrow
cache-aab3a83f436933f5_00025_of_00128.arrow cache-aab3a83f436933f5_00074_of_00128.arrow cache-aab3a83f436933f5_00123_of_00128.arrow
cache-aab3a83f436933f5_00026_of_00128.arrow cache-aab3a83f436933f5_00075_of_00128.arrow cache-aab3a83f436933f5_00124_of_00128.arrow
cache-aab3a83f436933f5_00027_of_00128.arrow cache-aab3a83f436933f5_00076_of_00128.arrow cache-aab3a83f436933f5_00125_of_00128.arrow
cache-aab3a83f436933f5_00028_of_00128.arrow cache-aab3a83f436933f5_00077_of_00128.arrow cache-aab3a83f436933f5_00126_of_00128.arrow
cache-aab3a83f436933f5_00029_of_00128.arrow cache-aab3a83f436933f5_00078_of_00128.arrow cache-aab3a83f436933f5_00127_of_00128.arrow
cache-aab3a83f436933f5_00030_of_00128.arrow cache-aab3a83f436933f5_00079_of_00128.arrow dataset_info.json
cache-aab3a83f436933f5_00031_of_00128.arrow cache-aab3a83f436933f5_00080_of_00128.arrow tmpaev1r_w4
cache-aab3a83f436933f5_00032_of_00128.arrow cache-aab3a83f436933f5_00081_of_00128.arrow tmpd7g5_grl
cache-aab3a83f436933f5_00033_of_00128.arrow cache-aab3a83f436933f5_00082_of_00128.arrow tmpdgek340a
cache-aab3a83f436933f5_00034_of_00128.arrow cache-aab3a83f436933f5_00083_of_00128.arrow tmpdwqnn302
cache-aab3a83f436933f5_00035_of_00128.arrow cache-aab3a83f436933f5_00084_of_00128.arrow tmpk3m7aupe
cache-aab3a83f436933f5_00036_of_00128.arrow cache-aab3a83f436933f5_00085_of_00128.arrow tmpnh95gfj4
cache-aab3a83f436933f5_00037_of_00128.arrow cache-aab3a83f436933f5_00086_of_00128.arrow tmpuaxtwh_k
cache-aab3a83f436933f5_00038_of_00128.arrow cache-aab3a83f436933f5_00087_of_00128.arrow tmpusl88bwl
cache-aab3a83f436933f5_00039_of_00128.arrow cache-aab3a83f436933f5_00088_of_00128.arrow tulu-3-sft-mixture-train-00000-of-00006.arrow
cache-aab3a83f436933f5_00040_of_00128.arrow cache-aab3a83f436933f5_00089_of_00128.arrow tulu-3-sft-mixture-train-00001-of-00006.arrow
cache-aab3a83f436933f5_00041_of_00128.arrow cache-aab3a83f436933f5_00090_of_00128.arrow tulu-3-sft-mixture-train-00002-of-00006.arrow
cache-aab3a83f436933f5_00042_of_00128.arrow cache-aab3a83f436933f5_00091_of_00128.arrow tulu-3-sft-mixture-train-00003-of-00006.arrow
cache-aab3a83f436933f5_00043_of_00128.arrow cache-aab3a83f436933f5_00092_of_00128.arrow tulu-3-sft-mixture-train-00004-of-00006.arrow
cache-aab3a83f436933f5_00044_of_00128.arrow cache-aab3a83f436933f5_00093_of_00128.arrow tulu-3-sft-mixture-train-00005-of-00006.arrow
cache-aab3a83f436933f5_00045_of_00128.arrow cache-aab3a83f436933f5_00094_of_00128.arrow
解释如下:
Hugging Face 数据集缓存目录下载文件的特点
从 Hugging Face 数据集缓存目录下载的这些文件有以下特点和作用,以下是对不同文件的详细解释:
1. cache-\*.arrow
文件
这些文件是 Hugging Face 数据集使用 Apache Arrow 格式存储的中间缓存文件,主要用于高效的数据处理和存储。文件命名规则和用途如下:
命名规则
-
类似
cache-aab3a83f436933f5_00000_of_00128.arrow
的文件表示:
00000_of_00128
: 数据集被切分为 128 个分块,这里是第一个分块。- 每个分块可以包含一部分数据样本,以便大数据集可以逐块加载处理,避免内存不足问题。
用途
- 高速加载:Hugging Face 数据集库会先将原始数据转换为 Arrow 格式,这种格式支持高效的序列化和快速的数据读取。
- 分块存储:当数据集太大时,会分成多个 Arrow 分块文件(如
00128
块),使数据处理更加灵活。
为什么生成多个 cache-*
文件?
- 如果数据集较大(如数十 GB),将其分块存储在多个
.arrow
文件中可以减少加载时间,并支持流式读取。
2. tulu-3-sft-mixture-train-\*.arrow
文件
这些是你指定数据集(tulu-3-sft-mixture
)的训练数据文件,每个文件中包含不同的一部分数据集样本。
命名规则
- 文件名如
tulu-3-sft-mixture-train-00000-of-00006.arrow
,表示这是tulu-3-sft-mixture
数据集的第 1 个分块,共有 6 个分块。 - 每个文件是训练数据的分块,类似于
cache-*
文件。
用途
- 每个分块包含一部分训练数据,支持按需加载整个数据集。
- 在训练任务中,通常会逐块加载这些文件的数据以优化内存使用。
3. dataset_info.json
文件
该文件包含数据集的元信息(metadata),描述了数据集的以下内容:
- 版本信息:如数据集版本号和格式版本。
- 列信息:数据集中字段的名称及类型(如
text
是字符串,label
是整数)。 - 样本统计:数据集样本的总数,以及每个分块包含的样本数量。
- 分割描述:训练、验证和测试集的比例及文件路径。
这个文件是 Hugging Face 数据集加载的核心参考,用于理解数据集的结构。
4. 临时文件 (tmp\*
)
类似 tmpaev1r_w4
和 tmpuaxtwh_k
等文件或文件夹是 Hugging Face 在加载和处理数据时的临时缓存,用于:
- 解压原始数据。
- 临时保存未完全转换的数据。
这些文件通常会在数据集加载完成后自动删除,属于中间状态。
总结:
cache-\*
和tulu-3-sft-mixture-train-\*
是 Arrow 格式存储的数据分块,用于高效读取训练数据。dataset_info.json
是数据集结构和元信息的描述文件。tmp\*
文件 是临时缓存,加载后可忽略。
我的需求
我现在主要研究代码能不能跑通,以及是否爆显存等问题,所以想只用一小部分数据集来测试,由于我们用到的是下面6个训练数据集(也就是上文看到的对应的parquet文件,只不过变成arrow后缀: 这种情况通常是 Hugging Face 的 datasets
库在下载数据集时,自动将原始 .parquet
文件转换为 .arrow
格式以优化加载性能。),这里只想用第一个tulu-3-sft-mixture-train-00000-of-00006.arrow
来测试。需要做哪些修改呢?
tulu-3-sft-mixture-train-00000-of-00006.arrow
tulu-3-sft-mixture-train-00001-of-00006.arrow
tulu-3-sft-mixture-train-00002-of-00006.arrow
tulu-3-sft-mixture-train-00003-of-00006.arrow
tulu-3-sft-mixture-train-00004-of-00006.arrow
tulu-3-sft-mixture-train-00005-of-00006.arrow
对应的parquet文件如下:
下面是我的做法:我在open-instruct框架中,不想修改它的源码和更改bash脚本,想直接用hf默认的加载数据集的方式,就是从本地.cache文件夹下面加载。
直接新建如下目录:先把之前的文件夹allenai___tulu-3-sft-mixture
改为allenai___tulu-3-sft-mixture1
,用于存放原本的数据集。然后新建allenai___tulu-3-sft-mixture
文件夹,当然它下面的子文件夹也需要创建,不能更改一个字。
可以使用linux命令来生成路径
mkdir -p /.cache/huggingface/datasets/allenai___tulu-3-sft-mixture/default/0.0.0/55e9fd6d41c3cd1a98270dff07557bc2a1e1ba91
然后复制过来需要的tulu-3-sft-mixture-train-00000-of-00006.arrow
和dataset_info.json
文件,其中后者必不可少,因为**dataset_info.json
** 是数据集结构和元信息的描述文件。
先看一下源数据集的dataset_info.json
文件如下:
{"description": "","citation": "","homepage": "","license": "","features": {"id": {"dtype": "string","_type": "Value"},"messages": [{"content": {"dtype": "string","_type": "Value"},"role": {"dtype": "string","_type": "Value"}}],"source": {"dtype": "string","_type": "Value"}},"builder_name": "parquet","dataset_name": "tulu-3-sft-mixture","config_name": "default","version": {"version_str": "0.0.0","major": 0,"minor": 0,"patch": 0},"splits": {"train": {"name": "train","num_bytes": 2914253735,"num_examples": 939343,"shard_lengths": [139000,46558,86000,192557,217114,258114],"dataset_name": "tulu-3-sft-mixture"}},"download_checksums": {"hf://datasets/allenai/tulu-3-sft-mixture@55e9fd6d41c3cd1a98270dff07557bc2a1e1ba91/data/train-00000-of-00006.parquet": {"num_bytes": 361046463,"checksum": null},"hf://datasets/allenai/tulu-3-sft-mixture@55e9fd6d41c3cd1a98270dff07557bc2a1e1ba91/data/train-00001-of-00006.parquet": {"num_bytes": 477019443,"checksum": null},"hf://datasets/allenai/tulu-3-sft-mixture@55e9fd6d41c3cd1a98270dff07557bc2a1e1ba91/data/train-00002-of-00006.parquet": {"num_bytes": 146926607,"checksum": null},"hf://datasets/allenai/tulu-3-sft-mixture@55e9fd6d41c3cd1a98270dff07557bc2a1e1ba91/data/train-00003-of-00006.parquet": {"num_bytes": 162138577,"checksum": null},"hf://datasets/allenai/tulu-3-sft-mixture@55e9fd6d41c3cd1a98270dff07557bc2a1e1ba91/data/train-00004-of-00006.parquet": {"num_bytes": 149552548,"checksum": null},"hf://datasets/allenai/tulu-3-sft-mixture@55e9fd6d41c3cd1a98270dff07557bc2a1e1ba91/data/train-00005-of-00006.parquet": {"num_bytes": 116271230,"checksum": null}},"download_size": 1412954868,"dataset_size": 2914253735,"size_in_bytes": 4327208603
}
可以看到,里面涉及所有需要用到的数据集的信息,需要修改为适合只有一个arrow文件的情况,否则会报错,比如下面这样:
执行脚本bash train.sh
,出现找不到文件Failed to open local file
的错误。下面是我对GPT的prompt:
现在我只用了一个arrow文件,不想用后面剩余的arrow文件,
出现报错:[rank2]: FileNotFoundError: [Errno 2] Failed to open local file '/.cache/huggingface/datasets/allenai___tulu-3-sft-mixture/default/0.0.0/55e9fd6d41c3cd1a98270dff07557bc2a1e1ba91/tulu-3-sft-mixture-train-00001-of-00006.arrow'. Detail: [errno 2] No such file or directory这里的00001 of 00006,我只有00000我需要怎么更改,
下面是dataset_info.json文件:复制过来上面的dataset_info.json文件内容
它帮我把数据集的dataset_info.json
文件改为:
{"description": "","citation": "","homepage": "","license": "","features": {"id": {"dtype": "string","_type": "Value"},"messages": [{"content": {"dtype": "string","_type": "Value"},"role": {"dtype": "string","_type": "Value"}}],"source": {"dtype": "string","_type": "Value"}},"builder_name": "parquet","dataset_name": "tulu-3-sft-mixture","config_name": "default","version": {"version_str": "0.0.0","major": 0,"minor": 0,"patch": 0},"splits": {"train": {"name": "train","num_bytes": 361046463,"num_examples": 139000,"shard_lengths": [139000],"dataset_name": "tulu-3-sft-mixture"}},"download_checksums": {"hf://datasets/allenai/tulu-3-sft-mixture@55e9fd6d41c3cd1a98270dff07557bc2a1e1ba91/data/train-00000-of-00006.parquet": {"num_bytes": 361046463,"checksum": null}},"download_size": 361046463,"dataset_size": 361046463,"size_in_bytes": 361046463}
修改细节说明
splits
部分:- 将
shard_lengths
和num_examples
修改为只对应第一个分片的数据,保留 139,000 个样本。 - 将
num_bytes
修改为该分片的大小:361046463
字节。
- 将
download_checksums
部分:- 仅保留第一个分片的路径和大小。
- 总大小更新:
download_size
和dataset_size
更新为第一个分片的大小。
size_in_bytes
更新:- 同样只反映第一个分片的大小。
然后记得将原文件名tulu-3-sft-mixture-train-00000-of-00006.arrow
改为tulu-3-sft-mixture-train-00000-of-00001.arrow
,因为只有一个arrow文件。
然后就可以执行bash train.sh
啦,这样就达到了只使用一小部分数据集来训练模型(测试框架等)的目的。
后记
2024年11月27日12点10分于上海。