Datasets documentation
云存储
云存储
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 S3 | s3fs |
| Google Cloud Storage | gcsfs |
| Azure Blob/DataLake | adlfs |
| 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")