five

Granular

收藏
github2024-07-01 更新2024-07-03 收录
下载链接:
https://github.com/danijar/granular
下载链接
链接失效反馈
官方服务:
资源简介:
Granular是一个用于读写多模态数据集的库,每个数据集是由[bag文件格式][bag]的链接文件集合组成。

Granular is a library for reading and writing multimodal datasets. Each dataset consists of a collection of linked files in the [bag file format][bag].
创建时间:
2024-06-28
原始信息汇总

Granular 数据集概述

概述

Granular 是一种数据集格式,适用于从简单到复杂的各种数据集。每个 Granular 数据集是由 [bag 文件格式][bag] 组成的链接文件集合,具有高性能的数据加载器。

特点

  • 性能: 本地和云端的高读写吞吐量。
  • 寻址: 通过数据点索引快速随机访问磁盘。
  • 序列: 数据点可以包含可寻址的模态列表。
  • 灵活性: 用户提供编码器和解码器;提供示例。
  • 分片: 将数据集存储为分片以分割处理负载。
  • 确定性: 每个 epoch 的全局洗牌是确定性和可恢复的。
  • 正确性: 具有高代码覆盖率的单元测试套件。

快速开始

写入数据

python import pathlib import granular import numpy as np

directory = ./dataset

spec = { foo: int, # 整数 bar: utf8[], # 字符串列表 baz: msgpack, # 打包结构 abc: jpg, # 图像 xyz: array, # 数组 }

with granular.DatasetWriter(directory, spec, granular.encoders) as writer: for i in range(10): datapoint = { foo: i, bar: [hello] * i, baz: {a: 1}, abc: np.zeros((60, 80, 3), np.uint8), xyz: np.arange(0, 1 + i, np.float32), } writer.append(datapoint)

print(list(directory.glob(*)))

[spec.json, refs.bag, foo.bag, bar.bag, baz.bag, abc.bag, xyz.bag]

读取数据

python with granular.DatasetReader(directory, granular.decoders) as reader: print(reader.spec) # {foo: int, bar: utf8[], baz: msgpack, ...} print(reader.size) # 数据集大小(字节) print(len(reader)) # 数据点数量

datapoint = reader[2] print(datapoint[foo]) # 2 print(datapoint[bar]) # [hello, hello] print(datapoint[abc].shape) # (60, 80, 3)

加载数据

python def preproc(datapoint, seed): return {image: datapoint[abc], label: datapoint[foo]}

loader = granular.Loader( reader, batch=8, fns=[preproc], shuffle=True, workers=64, seed=0)

print(loader.spec)

{image: (np.uint8, (60, 80, 3)), label: (np.int64, ())}

dataset = iter(loader) for _ in range(100): batch = next(dataset) print(batch[image].shape) # (8, 60, 80, 3)

高级功能

文件系统

支持自定义文件系统,通过提供不同的 Path 实现。例如,在 Google Cloud 上可以使用 [elements][elements] 中优化的 Path

python import elements # pip install elements

directory = elements.Path(gs://<bucket>/dataset)

reader = granular.DatasetReader(directory, ...) writer = granular.DatasetWriter(directory, ...)

格式

Granular 不强制用户使用特定的序列化解决方案。任何字符串都可以用作 spec 中的类型,只要提供了相应的编码器和解码器函数。

python import msgpack

encoders = { bytes: lambda x: x, utf8: lambda x: x.encode(utf-8), msgpack: msgpack.packb, }

decoders = { bytes: lambda x: x, utf8: lambda x: x.decode(utf-8), msgpack: msgpack.unpackb, }

恢复

数据加载器是完全确定性和可恢复的,只需提供步骤和种子整数。可以通过 loader.save() 保存状态字典,并在加载检查点时传递给 loader.load()

python state = loader.save() print(state) # {step: 100, seed: 0} loader.load(state)

缓存

检索数据点需要先从 refs.bag 读取以找到其他 bag 文件的引用,然后从每个模态 bag 文件读取。如果某些模态足够小,可以通过设置 cache_keys 将其缓存在 RAM 中。

python reader = granular.DatasetReader( directory, decoders, cache_index=True, # 将所有 bag 文件的索引表缓存在内存中。 cache_keys=(refs, foo), # 完全缓存 refs.bag 和 foo.bag 在内存中。 )

掩码

可以仅加载数据点的子集键值。通过提供掩码和数据点索引来减少读取请求的数量:

python print(reader.spec) # {foo: int, bar: utf8, baz: array}

mask = {foo: True, baz: True} datapoint = reader[index, mask] print(foo in datapoint) # True print(bar in datapoint) # False print(baz in datapoint) # True

序列

每个数据集是数据点的列表。每个数据点是具有字符串键的字典,键值可以是单个字节值或字节值列表。要使用序列值,在 spec 中的类型后添加 [] 后缀:

python spec = { title: utf8, frames: jpg[], captions: utf8[], times: int[], }

序列字段不仅可以存储可变长度的值,还可以通过掩码读取值的范围而不需要从磁盘加载整个序列:

python available = reader.available(index) print(available)

{title: True, frames: range(54), captions: range(7), times: range(7)}

mask = { title: True, # 读取标题模态 frames: range(32, 42), # 读取10帧的范围。 captions: range(0, 7), # 读取所有字幕。 times: True, # 另一种读取完整列表的方式。 } datapoint = reader[index, mask] print(len(datapoint[frames])) # 10

分片

大型数据集可以存储为较小的数据集列表,以便轻松并行处理。分片长度指定每个分片的数据点数量。一个好的默认值是设置每个分片的大小约为10 Gb。

python

写入分片数据集。

writer = granular.ShardedDatasetWriter(directory, spec, encoders, shardlen=10000)

从分片数据集读取。

reader = granular.ShardedDatasetReader(directory, decoders)

分片数据集的文件结构是每个分片一个文件夹,以分片编号命名。每个分片本身是一个数据集,也可以使用非分片的 granular.DatasetReader 读取。

sh $ tree ./directory . ├── 000000 │  ├── spec.json │  ├── refs.bag │  ├── foo.bag │  ├── bar.bag │  └── baz.bag ├── 000001 │  ├── spec.json │  ├── refs.bag │  ├── foo.bag │  ├── bar.bag │  └── baz.bag └── ...

在处理具有大量分片的数据集时,指定 shardstartshardstep,以便每个工作线程读取和写入其专用子集的分片。

python

写入分片数据集。

writer = granular.ShardedDatasetWriter( directory, spec, encoders, shardlen=10000, shardstart=worker_id, # 从此分片开始写入。 shardstep=num_workers, # 之后,跳过这么多分片。 )

从分片数据集读取。

reader = granular.ShardedDatasetReader( directory, decoders, shardstart=worker_id, # 从此分片开始读取。 shardstep=num_workers, # 之后,跳过这么多分片。 )

搜集汇总
数据集介绍
main_image_url
构建方式
Granular数据集的构建基于bag文件格式,这是一种可寻址的容器结构。每个Granular数据集由一系列链接的文件组成,这些文件通过高性能的数据加载器进行管理。数据集的构建过程包括定义数据点的规范,使用编码器将数据点写入指定的目录,并生成一系列bag文件。这些文件不仅存储了数据点的具体内容,还包含了索引信息,以便实现快速随机访问。
特点
Granular数据集具有多项显著特点。首先,其在本地和云端均表现出卓越的读写性能。其次,支持快速随机访问,用户可以通过数据点索引来高效地从磁盘读取数据。此外,数据点可以包含可寻址的多种模态序列,提供了极大的灵活性。Granular还支持数据集的分片存储,便于并行处理,同时确保了全局洗牌的确定性和可恢复性。
使用方法
使用Granular数据集时,用户首先需要安装相应的Python包,并通过定义数据点的规范来初始化数据集。写入数据时,用户可以指定编码器将数据点逐个追加到数据集中。读取数据时,用户可以通过数据点索引或使用掩码来选择性地加载数据。此外,Granular支持高级功能,如自定义文件系统、序列化格式、数据加载器的恢复和缓存机制,以及数据集的分片处理,以满足不同应用场景的需求。
背景与挑战
背景概述
Granular数据集是一种用于存储从简单到复杂数据集的格式,由一系列链接文件组成,采用bag文件格式,旨在提供高效的读写性能。该数据集由主要研究人员或机构开发,旨在解决大规模数据集管理中的核心问题,如数据存储、访问速度和处理效率。Granular数据集的创建时间不详,但其对数据科学和机器学习领域的贡献显著,特别是在处理复杂数据结构和大规模数据集时,展示了其强大的性能和灵活性。
当前挑战
Granular数据集在构建和应用过程中面临多项挑战。首先,数据集的复杂性要求高效的编码和解码机制,以确保数据的高效存储和快速访问。其次,数据的分片处理和并行化需要精确的控制和优化,以避免数据处理的瓶颈。此外,数据集的随机访问和序列化处理需要高性能的算法支持,以满足实时数据处理的需求。最后,数据集的确定性和可恢复性要求在数据加载过程中保持一致性和可靠性,这对系统的稳定性和鲁棒性提出了高要求。
常用场景
经典使用场景
Granular数据集的经典使用场景主要集中在高性能数据加载和处理领域。其设计允许用户在本地或云环境中实现高效的数据读写操作,特别适用于需要快速随机访问和处理大规模数据集的应用。例如,在深度学习训练过程中,Granular能够提供确定性和可恢复的全局洗牌功能,确保数据加载的稳定性和一致性,从而优化模型训练的效率和准确性。
实际应用
在实际应用中,Granular数据集被广泛用于需要高效数据处理和存储的场景。例如,在图像和视频处理领域,Granular能够快速加载和处理大规模的图像和视频数据,支持实时分析和处理。此外,在自然语言处理和语音识别等应用中,Granular的高性能数据加载和随机访问功能也大大提升了数据处理的效率和准确性。其支持的云存储和分布式处理功能,使得Granular在企业级数据处理和分析中也有着广泛的应用前景。
衍生相关工作
Granular数据集的推出催生了一系列相关的高性能数据处理工具和方法。例如,基于Granular的高效数据加载技术,研究者们开发了多种优化数据处理流程的工具,如加速数据预处理和模型训练的插件。此外,Granular的分布式处理和云存储支持,也启发了许多关于如何在分布式环境中高效管理和处理大规模数据的研究。这些衍生工作不仅提升了数据处理的效率,也为相关领域的学术研究和工业应用提供了新的思路和方法。
以上内容由遇见数据集搜集并总结生成
5,000+
优质数据集
54 个
任务类型
进入经典数据集
二维码
社区交流群

面向社区/商业的数据集话题

二维码
科研交流群

面向高校/科研机构的开源数据集话题

数据驱动未来

携手共赢发展

商业合作