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 config
        raw_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 config
        raw_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_w4tmpuaxtwh_k 等文件或文件夹是 Hugging Face 在加载和处理数据时的临时缓存,用于:

  • 解压原始数据。
  • 临时保存未完全转换的数据。

这些文件通常会在数据集加载完成后自动删除,属于中间状态。


总结:

  1. cache-\*tulu-3-sft-mixture-train-\* 是 Arrow 格式存储的数据分块,用于高效读取训练数据。
  2. dataset_info.json 是数据集结构和元信息的描述文件。
  3. 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.arrowdataset_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
  }
  

修改细节说明

  1. splits 部分
    • shard_lengthsnum_examples 修改为只对应第一个分片的数据,保留 139,000 个样本。
    • num_bytes 修改为该分片的大小:361046463 字节。
  2. download_checksums 部分
    • 仅保留第一个分片的路径和大小。
  3. 总大小更新
    • download_sizedataset_size 更新为第一个分片的大小。
  4. 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分于上海。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐