Huggingface数据集采样之后得到的arrow文件无法用Dataset.load_from_disk加载解决方法

问题起源

我现在有数据集

在这里插入图片描述

我想要采样1/10构成一个新的数据集。起初我只是简单的使用save_to_disk保存,如下代码:

from datasets import Dataset
import os# 原数据集路径
source_dataset_path = "~/.cache/huggingface/datasets/allenai___tulu-3-sft-mixture-1024-test/train"
# 新数据集保存路径
output_dataset_path = "~/.cache/huggingface/datasets/allenai___tulu-3-sft-mixture-1024-73k/train"# 加载原数据集
dataset = Dataset.load_from_disk(source_dataset_path)# 设置随机种子,确保每次运行结果相同
seed = 123
dataset = dataset.shuffle(seed=seed)# 随机采样1/10的数据
sampled_dataset = dataset.select(range(len(dataset)//10))# 输出采样后的数据集大小
print(f"采样后的数据集包含 {len(sampled_dataset)} 条数据")# 保存采样后的数据集到新目录
sampled_dataset.save_to_disk(output_dataset_path)print(f"数据集已保存到: {output_dataset_path}") 

但是后面使用的时候遇到问题,当执行下面的代码,load_from_disk会报错:

from datasets import load_dataset, load_from_disk# 加载数据集
input_dir="~/.cache/huggingface/datasets/allenai___tulu-3-sft-mixture-1024-73k"
dataset = load_from_disk(input_dir)# 指定保存路径
output_dir = "xxxx/data/tulu-3-sft-mixture-seqlen-1024-json-73k"# 将数据集转换为 JSON 格式
for split in dataset.keys():  # 处理所有划分 (train, validation 等)dataset[split].to_json(f"{output_dir}/{split}.json", orient="records", lines=True)

报错如下:我里面有.arrow文件,却显示neither a Dataset directory nor a DatasetDict directory.

(base)@test:~$ python arrow2json.py 
Traceback (most recent call last):
lib/python3.10/site-packages/datasets/load.py", line 2218, in load_from_diskraise FileNotFoundError(
FileNotFoundError: Directory ~/.cache/huggingface/datasets/allenai___tulu-3-sft-mixture-1024-73k is neither a Dataset directory nor a DatasetDict directory.

提问GPT4o:

它是通过什么来判断不是Dataset directory nor a DatasetDict directory的,是通过~/.cache/huggingface/datasets/allenai___tulu-3-sft-mixture-1024-73k/dataset_dict.json这个嘛

是的,Hugging Face 的 datasets 库会通过检查目录中的特定文件来确定一个目录是否是一个有效的 DatasetDatasetDict 目录。主要通过以下几个文件来进行判断:

  1. dataset_dict.json:这个文件是用于 DatasetDict 类型的数据集。DatasetDict 是一个包含多个数据集分割(如 trainvalidation 等)的字典。如果这个文件存在,Hugging Face 会认为该目录是一个 DatasetDict

  2. dataset_info.json:这个文件存储了数据集的元数据,包括数据集的特征、版本信息等。如果这个文件存在,Hugging Face 会根据它来加载数据集的结构。

  3. state.json 指定arrow文件和split切分等。

这是上面截图中的state.json文件内容:看一下它的具体内容

{"_data_files": [{"filename": "data-00000-of-00005.arrow"},{"filename": "data-00001-of-00005.arrow"},{"filename": "data-00002-of-00005.arrow"},{"filename": "data-00003-of-00005.arrow"},{"filename": "data-00004-of-00005.arrow"}],"_fingerprint": "3f23ea1c8451dc7f","_format_columns": null,"_format_kwargs": {},"_format_type": null,"_output_all_columns": false,"_split": "train"
}

GPT4o继续回答:
错误原因:报错提示 FileNotFoundError: Directory ~/.cache/huggingface/datasets/allenai___tulu-3-sft-mixture-1024-73k is neither a Dataset directory nor a DatasetDict directory,这意味着该目录下缺少 dataset_dict.json 或其他标识该目录为有效 Hugging Face 数据集目录的文件。

继续debug:

sampled_dataset.save_to_disk(output_dataset_path)
为什么保存的文件中没有dataset_info.json等信息,如何做才能有

GPT4o的回答:

Dataset.save_to_disk() 方法仅会保存数据集的实际内容(即数据文件),但它不会自动保存 dataset_info.jsonstate.json 等元数据文件。为了确保在保存采样后的数据集时包括这些元数据,你需要手动创建并保存 dataset_info.jsonstate.json 文件。以下是如何做到这一点。

解决方案:手动生成并保存 dataset_info.jsonstate.json 文件

在你保存采样后的数据集时,你需要确保保存相关的元数据文件。你可以通过以下步骤:

  1. 创建 dataset_info.json 文件:这可以通过复制原始数据集的元数据并修改其中的一些信息(例如样本数和文件大小)来完成。
  2. 保存 state.json 文件:需要模仿样本的格式来完成。

你可以通过以下方式修改你的代码来保存这些元数据文件:(这里笔者和GPT反复对线,个中过程只有经历过的人才懂)

重新采样和保存 dataset_info.jsonstate.json的核心代码
import os
import json
from datasets import Dataset, DatasetInfo
from pathlib import Path# 原数据集路径
source_dataset_path = "~/.cache/huggingface/datasets/allenai___tulu-3-sft-mixture-1024/train"
# 新数据集保存路径
output_dataset_path = "~/.cache/huggingface/datasets/allenai___tulu-3-sft-mixture-1024-73k/train"# 加载原数据集
dataset = Dataset.load_from_disk(source_dataset_path)# 设置随机种子,确保每次运行结果相同
seed = 123
dataset = dataset.shuffle(seed=seed)# 随机采样1/10的数据
sampled_dataset = dataset.select(range(len(dataset)//10))# 输出采样后的数据集大小
print(f"采样后的数据集包含 {len(sampled_dataset)} 条数据")# 保存采样后的数据集到新目录
sampled_dataset.save_to_disk(output_dataset_path)# 获取原始数据集的信息
original_dataset_info = DatasetInfo.from_directory(source_dataset_path)# 创建dataset_info.json
dataset_info = {"builder_name": original_dataset_info.builder_name,"config_name": original_dataset_info.config_name,"dataset_name": original_dataset_info.dataset_name,"dataset_size": original_dataset_info.dataset_size,"description": original_dataset_info.description,"features": original_dataset_info.features.to_dict(),"size_in_bytes": os.path.getsize(output_dataset_path),"splits": {"train": {"name": "train","num_bytes": os.path.getsize(output_dataset_path),"num_examples": len(sampled_dataset),"shard_lengths": [len(sampled_dataset)],"dataset_name": original_dataset_info.dataset_name}},"version": {"version_str": f"{original_dataset_info.version.major}.{original_dataset_info.version.minor}.{original_dataset_info.version.patch}","major": original_dataset_info.version.major,"minor": original_dataset_info.version.minor,"patch": original_dataset_info.version.patch}
}# 保存dataset_info.json
dataset_info_path = os.path.join(output_dataset_path, "dataset_info.json")
with open(dataset_info_path, "w") as f:json.dump(dataset_info, f, indent=4)
print(f"dataset_info.json 已保存至: {dataset_info_path}")# 创建state.json文件
state_json = {"_data_files": [{"filename": os.path.basename(file)}for file in sorted(Path(output_dataset_path).glob("*.arrow"))],"_fingerprint": sampled_dataset._fingerprint,"_format_columns": None,"_format_kwargs": {},"_format_type": None,"_output_all_columns": False,"_split": "train"
}# 保存state.json
state_json_path = os.path.join(output_dataset_path, "state.json")
with open(state_json_path, "w") as f:json.dump(state_json, f, indent=4)
print(f"state.json 已保存至: {state_json_path}")
代码说明
  1. 加载原始数据集:首先,加载原始数据集并执行数据采样。

  2. 保存采样后的数据集:保存采样后的数据集内容到 output_dataset_path

  3. 获取原始数据集的元信息:使用 DatasetInfo.from_directory() 方法获取原始数据集的元信息。通过这个信息,你可以得到原始数据集的结构、特征、分割等。

  4. 创建并保存 dataset_info.json

    • 创建 dataset_info.json 文件并填写相关信息。
    • 其中包括数据集的 features(字段结构)、splits(分割信息)、dataset_size(文件大小)等信息。
  5. 创建并保存 state.json

    • 创建 state.json 文件并包含必要信息。
  6. 保存文件:将 dataset_info.jsonstate.json 文件保存到新数据集目录中。

重要注意事项
  • features:这部分来自原始数据集的 DatasetInfo 对象,保留了字段和类型的信息。
  • splits:你需要手动为采样后的数据集定义分割信息。采样了训练集,splits 部分需要包括 train 分割。
  • size_in_bytesnum_bytes:这些值应基于采样后的数据集大小和文件大小进行更新。

通过这些操作,你就能确保采样后的数据集包括了 dataset_info.jsonstate.json 文件,从而能够正常加载和使用。

创建state.json文件的代码解释
# 创建state.json文件
state_json = {"_data_files": [{"filename": os.path.basename(file)}for file in sorted(Path(output_dataset_path).glob("*.arrow"))],"_fingerprint": sampled_dataset._fingerprint,"_format_columns": None,"_format_kwargs": {},"_format_type": None,"_output_all_columns": False,"_split": "train"
}# 保存state.json
state_json_path = os.path.join(output_dataset_path, "state.json")
with open(state_json_path, "w") as f:json.dump(state_json, f, indent=4)
print(f"state.json 已保存至: {state_json_path}")
说明
  1. _data_files 字段

    • 使用 Path(output_dataset_path).glob("*.arrow") 遍历目标目录下的所有 .arrow 文件,并将其文件名作为 filename 的值填入。
    • 文件名需要用 os.path.basename(file) 获取,因为文件路径不应该包含绝对路径。
  2. _fingerprint 字段

    • 使用 sampled_dataset._fingerprint 获取数据集的唯一指纹值,确保其与实际数据内容匹配。
  3. _format_columns_format_kwargs_format_type 字段

    • 设置为 None,与 Hugging Face 数据集的默认值保持一致。
  4. _split 字段

    • 设置为 "train",因为你的数据集是训练集。
  5. 排序

    • 使用 sorted() 确保文件按照文件名顺序排列,避免 _data_files 顺序不一致。

运行上面的代码,可以得到想要的两个文件

state.json如下:

{"_data_files": [{"filename": "data-00000-of-00001.arrow"}],"_fingerprint": "fda1608541b4fb67","_format_columns": null,"_format_kwargs": {},"_format_type": null,"_output_all_columns": false,"_split": "train"
}

dataset_info.json如下:

{"builder_name": "arrow","config_name": "default","dataset_name": "55e9fd6d41c3cd1a98270dff07557bc2a1e1ba91","dataset_size": 2914253735,"description": "","features": {"id": {"dtype": "string","_type": "Value"},"messages": [{"content": {"dtype": "string","_type": "Value"},"role": {"dtype": "string","_type": "Value"}}],"source": {"dtype": "string","_type": "Value"}},"size_in_bytes": 4096,"splits": {"train": {"name": "train","num_bytes": 4096,"num_examples": 73752,"shard_lengths": [73752],"dataset_name": "55e9fd6d41c3cd1a98270dff07557bc2a1e1ba91"}},"version": {"version_str": "0.0.0","major": 0,"minor": 0,"patch": 0}
}

万事俱备,只欠东风

还需要如下图所示的dataset_dict.json文件,这个比较简单

在这里插入图片描述
对于我的情况,直接复制过来就行
dataset_dict.json内容如下:

{"splits": ["train"]}

重新load_from_disk正常运行

from datasets import load_dataset, load_from_disk# 加载数据集
input_dir="~/.cache/huggingface/datasets/allenai___tulu-3-sft-mixture-1024-73k"
dataset = load_from_disk(input_dir)# 指定保存路径
output_dir = "xxxx/data/tulu-3-sft-mixture-seqlen-1024-json-73k"# 将数据集转换为 JSON 格式
for split in dataset.keys():  # 处理所有划分 (train, validation 等)dataset[split].to_json(f"{output_dir}/{split}.json", orient="records", lines=True)

生成的结果如下:
在这里插入图片描述

成功解决数据集采样之后只得到.arrow文件,但是无法load_from_disk的问题。

后记

2024年12月29日22点08分于上海, 在GPT4o大模型辅助下完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/65489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js版本之ES6特性简述【Proxy、Reflect、Iterator、Generator】(五)

目录 Proxy Reflect 静态方法 部分实例 Iterator 实际开发迭代器的使用实例 迭代器(Iterator)应用 Generator Proxy Proxy 是 ES6 中新增的对象 Proxy 是JavaScript中的内置对象,它提供了一种机制,可以拦截并自定义各种…

React 组件通信完整指南 以及 自定义事件发布订阅系统

React 组件通信完整指南 1. 父子组件通信 1.1 父组件向子组件传递数据 // 父组件 function ParentComponent() {const [data, setData] useState(Hello from parent);return <ChildComponent message{data} />; }// 子组件 function ChildComponent({ message }) {re…

mac中idea菜单工具栏没有git图标了

1.右击菜单工具栏 2.选中VCS&#xff0c;点击添加 3.搜索你要的工具&#xff0c;选中点击确定就添加了 4.回到上面一个界面&#xff0c;选中你要放到工具栏的工具&#xff0c;点击应用就好了 5.修改图标&#xff0c;快捷键或者右击选中编辑图标 6.选择你要的图标就好了

Linux实验报告7-文件管理

目录 一&#xff1a;实验目的 二&#xff1a;实验内容 (1)查看/etc/inittab文件的权限属性&#xff0c;并指出该文件的所有者以及文件所属组群。 (2)新建文件test&#xff0c;设置文件权限为r--r-----。 (3)新建文件test2&#xff0c;设系统中有用户study和用户组studygr…

CPT203 Software Engineering 软件工程 Pt.4 软件设计(中英双语)

文章目录 6. 设计概念6.1 Principle6.2 Concepts6.2.1 General design concepts&#xff08;常见的设计概念&#xff09;6.2.1.1 Abstraction&#xff08;抽象&#xff09;6.2.1.2 Modularity&#xff08;模块化&#xff09;6.2.1.3 Functional independence&#xff08;功能独…

JSON 系列之4:JSON_VALUE

JSON_VALUE的作用&#xff0c;简单来说&#xff0c;就是从JSON到SQL&#xff1a; SQL/JSON function JSON_VALUE selects JSON data and returns a SQL scalar or an instance of a user-defined SQL object type or SQL collection type (varray, nested table) 所以&#xff…

[wzoi]Help Bubu

题目描述: Bubu的书架上乱成一团了&#xff01;请帮助他一下吧&#xff01; 他的书架上一共有n本书。我们定义混乱值是连续相同高度书本的段数。例如&#xff0c;如果输的高度是30,30,31,31,32&#xff0c;那么混乱值为3,30,32,32,31的混乱度也是3&#xff0c;但31,32,31,32,…

嵌入式AI STM32部署卷积神经网络的魔法棒

基于STM32部署卷积神经网络控制设备方案-AI项目-STM32部署卷积神经网络方案-红外信号复制方案-轨迹识别 项目包含下述内容 硬件部分、PCB制板、BOM表文件等等 (Hardware)外壳、3D打印文件 (3D_print)软件程序、用于电子法棒的软件程序 AI Keil等等(Software)QT上位机动作识别…

【代码分析】Unet-Pytorch

1&#xff1a;unet_parts.py 主要包含&#xff1a; 【1】double conv&#xff0c;双层卷积 【2】down&#xff0c;下采样 【3】up&#xff0c;上采样 【4】out conv&#xff0c;输出卷积 """ Parts of the U-Net model """import torch im…

[Leetcode] 最大子数组和 [击败99%的解法]

解法1&#xff1a; 暴力解法 遍历每个元素&#xff0c;从它当前位置一直加到最后&#xff0c;然后用一个最大值来记录全局最大值。 代码如下&#xff1a; class Solution {public int maxSubArray(int[] nums) {long sum, max nums[len-1];for (int i0; i<nums.length;…

系统压力测试助手——stress-ng

1、背景 在系统性能测试和压力测试中&#xff0c;stress-ng 是一个非常强大的工具&#xff0c;广泛应用于对 Linux 系统进行各种硬件和软件方面的负载测试。它能够模拟多种极端负载情况&#xff0c;帮助开发人员和运维人员检查系统在高负载下的表现&#xff0c;以便发现潜在的…

计算机网络500题2024-2025学年度第一学期复习题库(选择、判断、填空)

一、单选题 1、&#xff08; &#xff09;是实现两个同种网络互连的设备 A. 网桥 B. 网关 C. 集线器 D. 路由器 2、10M以太网有三种接口标准&#xff0c;其中10BASE-T采用&#xff08; &#xff09; A. 双绞线 B. 粗同轴电缆 C. 细同轴电缆 D. 光纤 3、HDLC是哪…

在JavaScript文件中定义方法和数据(不是在对象里定以数据和方法,不要搞错了)

在对象里定以数据和方法看这一篇 对象字面量内定义属性和方法&#xff08;什么使用const等关键字&#xff0c;什么时候用键值对&#xff09;-CSDN博客https://blog.csdn.net/m0_62961212/article/details/144788665 下是在JavaScript文件中定义方法和数据的基本方式&#xff…

基于SpringBoot的垃圾分类系统设计与实现【源码+文档+部署讲解】

系统介绍 基于SpringBootVue实现的垃圾分类系统设计了三种角色、分别是管理员、垃圾分类管理员、用户&#xff0c;实现了个人中心、用户管理、垃圾分类管理员管理、垃圾分类管理、垃圾类型管理、垃圾图谱管理、系统管理等功能 技术选型 开发工具&#xff1a;idea2020.3Webst…

今日总结 2024-12-28

今天全身心投入到鸿蒙系统下 TCPSocket 的学习中。从最基础的 TCP 协议三次握手、四次挥手原理重新梳理&#xff0c;深刻理解其可靠连接建立与断开机制&#xff0c;这是后续运用 TCPSocket 无误通信的根基。在深入鸿蒙体系时&#xff0c;仔细研读了其为 TCPSocket 封装的 API&a…

springboot启动不了 因一个spring-boot-starter-web底下的tomcat-embed-core依赖丢失

这个包丢失了 启动不了 起因是pom中加入了 <tomcat.version></tomcat.version>版本指定&#xff0c;然后idea自动编译后&#xff0c;包丢了&#xff0c;删除这个配置后再也找不回来&#xff0c; 这个包正常在 <dependency><groupId>org.springframe…

前后端分离(对话框的使用)

1.首先先定义两个按钮(一个添加按钮&#xff0c;一个修改按钮) <el-button type"primary" click"openDialog(true)">添加员工</el-button> <el-button size"mini" click"openDialog(false, scope.row)">编辑</…

doris集群存储目录切换

doris集群存储目录切换 1. 背景 3节点集群&#xff0c;BE存储目录&#xff0c;因为运维原因。存储盘系统放在了一一起。 需要增加硬盘&#xff0c;并替换原有目录。 3节点集群&#xff0c;如果各个表都是3副本&#xff0c;可以实现轮流停机&#xff0c;方式处理。 但是业务…

【Maven_bugs】The project main artifact does not exist

背景&#xff1a;我想使用 maven-shade-plugin 打一个 fat jar 时报了标题中的错误&#xff0c;使用的命令是&#xff1a;org.apache.maven.plugins:maven-shade-plugin:shade -pl :shade-project。项目结构如下图&#xff0c;我想把子模块 shade-project 打成一个 fat jar&…

Qt 的信号槽机制详解:之信号槽引发的 Segmentation Fault 问题拆析(上)

Qt 的信号槽机制详解&#xff1a;之因信号槽误用引发的 Segmentation Fault 问题拆析&#xff08;上&#xff09; 前言一. 信号与槽的基本概念信号&#xff08;Signal&#xff09;槽&#xff08;Slot&#xff09;连接信号与槽 二. 信号槽机制的实现原理元对象系统&#xff08;M…