建行网站关于我们,网站设计公司 推荐,北京业之峰装饰公司官网,国内网站排名如何从 Hugging Face 数据集中随机采样数据并保存为新的 Arrow 文件
在使用 Hugging Face 的数据集进行模型训练时#xff0c;有时我们并不需要整个数据集#xff0c;尤其是当数据集非常大时。为了节省存储空间和提高训练效率#xff0c;我们可以从数据集中随机采样一部分数…如何从 Hugging Face 数据集中随机采样数据并保存为新的 Arrow 文件
在使用 Hugging Face 的数据集进行模型训练时有时我们并不需要整个数据集尤其是当数据集非常大时。为了节省存储空间和提高训练效率我们可以从数据集中随机采样一部分数据并将其保存为新的 Arrow 文件格式。本文将介绍如何通过代码实现这一过程并解释如何计算文件大小以便在 dataset_info.json 文件中记录文件信息方便后续训练使用。
1. 背景介绍
Hugging Face 提供的 datasets 库支持直接加载和操作 Arrow 格式的数据集。Arrow 是一个高效的列式数据格式适用于大规模数据处理和分析。其高效性体现在对内存的友好支持和读取速度上这使得它在深度学习中得到广泛应用。
然而整个数据集可能会非常庞大尤其是在进行大规模模型训练时。为了提高效率和减少内存占用通常我们只需要数据集的一部分。在这种情况下随机采样并保存为一个新的 Arrow 文件是一个很好的解决方案。
2. 代码实现
以下是从 Hugging Face 数据集中随机采样 1000 条数据并将其保存为新的 Arrow 文件的代码
from datasets import Dataset, DatasetDict
import os# 加载原始 Arrow 文件
dataset Dataset.from_file(/.cache/huggingface/datasets/allenai___tulu-3-sft-mixture/default/0.0.0/55e9fd6d41c3cd1a98270dff07557bc2a1e1ba91/tulu-3-sft-mixture-train-00000-of-00001.arrow
)# 采样 1000 条数据随机采样
sampled_dataset dataset.shuffle(seed42).select(range(1000))# 保存为新的 Arrow 文件
output_path /.cache/huggingface/datasets/allenai_test
sampled_dataset.save_to_disk(output_path)# 计算文件大小
file_size sum(os.path.getsize(os.path.join(dp, f)) for dp, dn, filenames in os.walk(output_path) for f in filenames
)# 打印采样结果和大小
print(f采样数据集保存路径: {output_path})
print(f文件大小: {file_size / (1024 ** 2):.2f} MB) # 转换为 MB
print(file_size)代码步骤解释 加载原始 Arrow 文件我们通过 Dataset.from_file() 方法加载原始的 Arrow 文件。这个文件通常较大包含了整个数据集的内容。 随机采样数据使用 dataset.shuffle(seed42).select(range(1000)) 随机采样出 1000 条数据。shuffle() 方法随机打乱数据集select() 方法选择数据集的前 1000 条记录。 保存为新文件通过 save_to_disk() 方法将采样后的数据保存为新的 Arrow 文件。这时我们可以将这个小型的数据集用于模型训练而不需要加载整个大数据集。 计算文件大小通过遍历文件夹的方式使用 os.path.getsize() 获取保存的 Arrow 文件的大小。计算结果以 MB 为单位输出便于理解文件的存储需求。
3. 文件大小和 dataset_info.json
保存采样数据时计算文件大小是非常重要的。这是因为在 Hugging Face 的数据集格式中dataset_info.json 文件记录了数据集的基本信息包括数据集的大小、特征、列数等。在训练时Hugging Face 会根据 dataset_info.json 文件的信息来进行数据加载和管理。确保文件大小准确可以帮助在加载数据集时正确管理内存和硬盘空间。
下面是新的dataset_info.json文件内容需要改的地方有 “num_bytes”: 3781998, “num_examples”: 1000, “download_size”: 3781998, “dataset_size”: 3781998, “size_in_bytes”: 3781998 这些这里的3781998就是上面的file_sizenum_examples是上面提到的采样1000条数据。
{description: A sampled version of tulu-3-sft-mixture dataset with 1000 examples.,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: 3781998,num_examples: 1000,shard_lengths: [1000],dataset_name: tulu-3-sft-mixture}},download_checksums: {},download_size: 3781998,dataset_size: 3781998,size_in_bytes: 3781998
}
然后记得把之前的数据集文件夹改名为其他比如改成这里的allenai___tulu-3-sft-mixture1然后将新的数据集放到/.cache/huggingface/datasets/allenai___tulu-3-sft-mixture/default/0.0.0/55e9fd6d41c3cd1a98270dff07557bc2a1e1ba91/这个路径下请注意这个路径应该与hf下载下来的路径完全相同。这个是新建的可以使用LInux命令来新建mkdir命令后面记得加-p参数
mkdir -p /.cache/huggingface/datasets/allenai___tulu-3-sft-mixture/default/0.0.0/55e9fd6d41c3cd1a98270dff07557bc2a1e1ba91/如下图所示需要在这里放入新的arrow文件只需要放自己的那1000条数据的arrow即可其他cache开头的arrow文件是系统自己生成的不用管和dataset_info.json文件这个是需要按照上面更改后的不能用之前的然后arrow文件记得改名tulu-3-sft-mixture-train-00000-of-00001.arrow这里记得按照原始文件中的arrow文件命名格式比如原来的是tulu-3-sft-mixture-train-00000-of-00006.arrowtulu-3-sft-mixture-train-00001-of-00006.arrow这样后面的00006是分块的个数由于我们只有一个arrow文件后面的00006应该改为00001。 4. 如何使用新的 Arrow 文件进行训练
在 Hugging Face 上使用数据集时我们通常指定一个数据集路径比如
--dataset_mixer_list allenai/tulu-3-sft-mixture 1.0这个参数指定了使用某个数据集进行训练。当我们使用采样的 Arrow 文件时文件路径应该指向我们保存的采样文件这里由于我们用新的arrow覆盖掉了原来的文件所以不用指定新的路径默认即可而无需更改 --dataset_mixer_list 参数。这样我们就可以利用数据集的一部分进行训练而不需要更改 Hugging Face 数据集的整体配置。
5. 下载后的文件为何变成 Arrow 格式
在使用 Hugging Face 的数据集时很多时候我们会下载数据集并看到它是以 .arrow 格式存储的。这是因为 Arrow 格式在性能和存储上优于其他格式尤其是在大规模数据集的处理过程中能够提供更高效的内存和磁盘使用。下载到本地后文件会以 Arrow 格式存储便于后续使用和处理。
6. 结论
通过从 Hugging Face 数据集中随机采样一部分数据并保存为新的 Arrow 文件我们可以更高效地进行模型训练特别是当数据集庞大时。通过计算文件大小并更新 dataset_info.json 文件我们可以确保训练过程中数据管理的准确性。
这种方法不仅适用于大数据集也为需要快速原型设计或进行小规模实验的研究人员提供了便利。