Datasets documentation

云存储

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v4.8.4).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

云存储

Hugging Face Datasets

Hugging Face 数据集中心(Dataset Hub)汇聚了日益丰富的数据集,涵盖多种领域和任务。

它不仅仅是一个云存储:数据集中心是一个平台,借助 git 提供数据版本控制,并配备数据集查看器以探索数据,使其成为存储 AI 就绪数据集的理想场所。

本指南展示了如何使用 fsspec 中的文件系统实现,从其他云存储导入数据。

Hugging Face 存储桶

Storage Buckets 是 Hugging Face Hub 上的一种仓库类型,提供类似 S3 的对象存储,由 Xet 存储后端提供支持。与基于 Git 的数据集仓库不同,Buckets 不支持版本控制且内容可变,专为需要简单、快速存储的场景而设计,例如日志、中间产物或任何无需版本控制的大型文件集合。

从云存储导入数据

大多数云存储提供商都提供了 fsspec FileSystem 实现,这使得使用相同的代码即可从任意云提供商导入数据。 这在发布 Hugging Face 数据集时尤为有用。

请查看下表,了解一些支持的云存储提供商示例:

存储提供商文件系统实现
Amazon S3s3fs
Google Cloud Storagegcsfs
Azure Blob/DataLakeadlfs
Oracle 云存储ocifs

本指南将向您展示如何从任意云存储导入数据文件,并在 Hugging Face 上保存数据集。

假设我们想从云存储中的 Parquet 文件在 Hugging Face 上发布一个数据集。

首先,实例化您的云存储文件系统,并列出您想要导入的文件:

>>> import fsspec
>>> fs = fsspec.filesystem("...")  # s3 / gcs / abfs / adl / oci / ...
>>> data_dir = "path/to/my/data/"
>>> pattern = "*.parquet"
>>> data_files = fs.glob(data_dir + pattern)
["path/to/my/data/0001.parquet", "path/to/my/data/0001.parquet", ...]

发布数据集

然后,您可以在 Hugging Face 上创建一个数据集并导入数据文件,例如使用:

>>> from huggingface_hub import create_repo, upload_folder
>>> from tqdm.auto import tqdm
>>> destination_dataset = "username/my-dataset"
>>> create_repo(destination_dataset, repo_type="dataset")
>>> batch_size = 100
>>> for data_files in batched(tqdm(fs.glob(data_dir + pattern)), batch_size):
...     with TemporaryDirectory() as tmp_dir:
...         tmp_files = [os.path.join(tmp_dir, x[len(data_dir):]) for x in data_files]
...         fs.download(data_files, tmp_files)
...         upload_folder(
...             repo_id=destination_dataset,
...             folder_path=tmp_dir,
...             repo_type="dataset",
...         )

如果您需要更多上传选项,请查阅 huggingface_hub 文档中关于文件上传的 此处。

最后,您可以使用 🤗 Datasets 加载数据集:

>>> from datasets import load_dataset
>>> ds = load_dataset("username/my-dataset")

将原始数据导入 Storage Buckets

或者,如果您不想发布数据集,而只是将原始数据文件导入 Hugging Face Storage Bucket,您可以使用:

>>> from huggingface_hub import create_bucket, sync_bucket
>>> from tqdm.auto import tqdm
>>> from itertools import batched
>>> from tempfile import TemporaryDirectory
>>> import os
>>> create_bucket("username/my-bucket")
>>> bucket_files_location = "hf://buckets/username/my-bucket/path/to/raw/files"
>>> batch_size = 100
>>> for data_files in batched(tqdm(fs.glob(data_dir + pattern)), batch_size):
...     with TemporaryDirectory() as tmp_dir:
...         tmp_files = [os.path.join(tmp_dir, x[len(data_dir):]) for x in data_files]
...         fs.download(data_files, tmp_files)
...         sync_bucket(tmp_dir, bucket_files_location)

如果您需要更多上传选项,请查阅 huggingface_hub 文档中关于 Storage Buckets 的 此处。

之后,您可以使用 🤗 Datasets 加载原始文件,对其进行转换,并上传最终的 AI 就绪数据集,例如以流式方式:

如果文件是 🤗 Datasets 支持的格式:

>>> from datasets import load_dataset
>>> ds = load_dataset(bucket_files_location, streaming=True)
>>> ds = ds.map(...).filter(...)
>>> ds.push_to_hub("username/my-dataset", num_proc=4)
>>> # and later
>>> ds = load_dataset("username/my-dataset")

否则,您可以使用自己的文件解析函数:

>>> from datasets import IterableDataset
>>> from huggingface_hub import hffs
>>> data_files = hffs.find(bucket_files_location)
>>> num_shards = 1024  # For parallelism. PS: every shard should fit in RAM
>>> ds = IterableDataset.from_dict({"data_file": data_files}, num_shards=num_shards)
>>> def parse_data_files(data_files):
...     ...
...     return {"col_1": [...], "col_2": [...]}
>>> ds = ds.map(parse_data_files, batched=True, input_column=["data_file"])
>>> ds.push_to_hub("username/my-dataset", num_proc=4)
>>> # and later
>>> ds = load_dataset("username/my-dataset")
Update on GitHub