如何从 Hugging Face 数据集中随机采样数据并保存为新的 Arrow 文件

如何从 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(seed=42).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)
代码步骤解释:
  1. 加载原始 Arrow 文件:我们通过 Dataset.from_file() 方法加载原始的 Arrow 文件。这个文件通常较大,包含了整个数据集的内容。

  2. 随机采样数据:使用 dataset.shuffle(seed=42).select(range(1000)) 随机采样出 1000 条数据。shuffle() 方法随机打乱数据集,select() 方法选择数据集的前 1000 条记录。

  3. 保存为新文件:通过 save_to_disk() 方法将采样后的数据保存为新的 Arrow 文件。这时,我们可以将这个小型的数据集用于模型训练,而不需要加载整个大数据集。

  4. 计算文件大小:通过遍历文件夹的方式,使用 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_size,num_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.arrow,tulu-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 文件,我们可以确保训练过程中数据管理的准确性。

这种方法不仅适用于大数据集,也为需要快速原型设计或进行小规模实验的研究人员提供了便利。

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

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

相关文章

深入解析 MySQL 启动方式:`systemctl` 与 `mysqld` 的对比与应用

目录 前言1. 使用 systemctl 启动 MySQL1.1 什么是 systemctl1.2 systemctl 启动 MySQL 的方法1.3 应用场景1.4 优缺点优点缺点 2. 使用 mysqld 命令直接启动 MySQL2.1 什么是 mysqld2.2 mysqld 启动 MySQL 的方法2.3 应用场景2.4 优缺点优点缺点 3. 对比分析结语 前言 MySQL …

会议直击|美格智能亮相2024紫光展锐全球合作伙伴大会,融合5G+AI共拓全球市场

11月26日,2024紫光展锐全球合作伙伴大会在上海举办,作为紫光展锐年度盛会,吸引来自全球的众多合作伙伴和行业专家、学者共同参与。美格智能与紫光展锐竭诚合作多年,共同面向5G、AI和卫星通信为代表的前沿科技,聚焦技术…

本地学习axios源码-如何在本地打印axios里面的信息

1. 下载axios到本地 git clone https://github.com/axios/axios.git 2. 下载react项目, 用vite按照提示命令配置一下vite react ts项目 npm create vite my-vue-app --template react 3. 下载koa, 搭建一个axios请求地址的服务端 a.初始化package.json mkdir koa-server…

7、递归

一、概念/理解 递归:某个函数直接或者间接的调用自身。--->函数调用 函数调用:创建副本 递归函数:直接或者间接调用自身的函数叫 递归函数: 边界条件/递归出口:递归调用的终止条件。避免出现死循环或者爆栈的情况。//报错显…

【python】图像、音频、视频等文件数据采集

【python】图像、音频、视频等文件数据采集 先安装所需要的工具一、Tesseract-OCRTesseract-OCR环境变量设置验证是否配置成功示例语言包下载失败 二、ffmpeg验证是否安装成功示例 先安装所需要的工具 一、Tesseract-OCR Tesseract是一个 由HP实验室开发 由Google维护的开源的…

【青牛科技】2K02 电动工具专用调速电路芯片描述

概述: 2K02 是电动工具专用调速电路。内置稳压电路,温度系数好,可以调节输出频率以及占空比的振荡输出,广泛的应用于小型电钻,割草机等工具。 主要特点: ● 电源电压范围宽 ● 占空比可调 ● 温度系数好 …

内网穿透步骤

步骤 第一次需要验证token window和linux的方法不同。 然后 启动 cpolar 服务: 在命令窗口中输入 cpolar.exe htttp 8080,启动内网穿透服务。确保命令窗口保持开启状态,以维持穿透效果。 cpolar.exe hhttp 8080 成功后 注意事项 命令窗口…

FreeRTOS之vTaskStartScheduler实现分析

FreeRTOS之vTaskStartScheduler实现分析 1 FreeRTOS源码下载地址2 函数接口2.1 函数接口2.2 函数参数简介3 vTaskDelete的调用关系3.1 调用关系3.2 调用关系示意图 4 函数源码分析4.1 vTaskStartScheduler4.2 prvCreateIdleTasks4.2.1 prvCreateIdleTasks4.2.2 xTaskCreate 4.3…

基于群晖搭建个人图书架-TaleBook based on Docker

前言 在群晖Container Manager中部署失败,转通过ssh部署。 一、准备工作 名称备注群晖SSH“终端机和SNMP”中启用SSH软件secureCRT等docker-compose.ymlGithub下载并修改 二、过程 2.1 创建本地文件夹 本地路径为: /docker/Calibre/data 2.2 下载d…

Ubuntu24.04初始化教程(包含基础优化、ros2)

将会不断更新。但是所有都是基础且必要的操作。 为重装系统之后的环境配置提供便捷信息来源。记录一些错误的解决方案。 目录 构建系统建立系统备份**Timeshift: 系统快照和备份工具****安装 Timeshift****使用 Timeshift 创建快照****还原快照****自动创建快照** 最基本配置换…

【论文笔记】A Token-level Contrastive Framework for Sign Language Translation

🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: A Token-level Contrastiv…

yolov5 解决:export GIT_PYTHON_REFRESH=quiet

当我们在第一次运行YOLOv5中的train.py程序时:可能会出现以下报错: This initial warning can be silenced or aggravated in the future by setting the $GIT_PYTHON_REFRESH environment variable. Use one of the following values: - quiet|q|silen…

基于springboot中小型制造企业质量管理系统源码和论文

信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的…

【实验13】使用预训练ResNet18进行CIFAR10分类

目录 1 数据处理 1.1 数据集介绍 1.2数据处理与划分 2 模型构建- Pytorch高层API中的Resnet18 3 模型训练 4 模型评价 5 比较“使用预训练模型”和“不使用预训练模型”的效果: 6 模型预测 7 完整代码 8 参考链接 1 数据处理 1.1 数据集介绍 数据规模&…

Java之链表1

文章目录 1. 链表1.11.2 链表的概念及其结构1.3 自己实现一个链表 1. 链表 1.1 之前我们学习了 顺序表ArrayList,并自己实现了 ArrayList ,发现它在删除元素和添加元素时很麻烦,最坏的情况时,需要将所有的元素移动,因…

二分搜索(三)x的平方根

69. x 的平方根 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2…

AI开发-数据可视化库-Seaborn

1 需求 概述 Seaborn 是一个基于 Python 的数据可视化库,它建立在 Matplotlib 之上。其主要目的是使数据可视化更加美观、方便和高效。它提供了高层次的接口和各种美观的默认主题,能够帮助用户快速创建出具有吸引力的统计图表,用于数据分析和…

使用docker-compose部署搜索引擎ElasticSearch6.8.10

背景 Elasticsearch 是一个开源的分布式搜索和分析引擎,基于 Apache Lucene 构建。它被广泛用于实时数据搜索、日志分析、全文检索等应用场景。 Elasticsearch 支持高效的全文搜索,并提供了强大的聚合功能,可以处理大规模的数据集并进行快速…

LeetCode—74. 搜索二维矩阵(中等)

仅供个人学习使用 题目描述: 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true…

Cento7 紧急模式无法正常启动,修复home挂载问题

Centos 7 开机失败进入紧急模式[emergency mode],解决方案。 通过journalctl -xb查看启动日志,定位发现/home目录无法正常挂载。 退出启动日志检查,进行修复。 进行问题修复 # 修复挂载问题 mkdir /home mount /dev/mapper/centos-home /ho…