Datasets documentation

クラウドストレージ

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は、多様なドメインやタスクにわたるデータセットのコレクションが拡大し続けています。

クラウドストレージ以上のものです。Dataset Hubは、gitによるデータバージョン管理機能と、データを探索するためのDataset Viewerを提供するプラットフォームであり、AI対応のデータセットを保存する最適な場所です。

このガイドでは、fsspecのファイルシステム実装を使用して、他のクラウドストレージからデータをインポートする方法を示します。

Hugging Face ストレージバケット

Storage Buckets は、Hugging Face Hub 上のリポジトリタイプであり、Xet ストレージバックエンドによって提供される S3 類似のオブジェクトストレージです。Git ベースのデータセットリポジトリとは異なり、バケットはバージョン管理されず、変更可能な設計となっており、ログや中間成果物、バージョン管理が不要な大規模なファイルコレクションなど、シンプルで高速なストレージが必要なユースケース向けに設計されています。

クラウドストレージからデータをインポートする

ほとんどのクラウドストレージプロバイダーにはfsspecのFileSystem実装があり、これにより同じコードで任意のクラウドプロバイダーからデータをインポートできます。 これは、Hugging Faceにデータセットを公開する際に特に便利です。

サポートされているクラウドストレージプロバイダーの例を、以下の表に示します。

ストレージプロバイダーファイルシステム実装
Amazon S3s3fs
Google Cloud Storagegcsfs
Azure Blob/DataLakeadlfs
Oracle Cloud Storageocifs

このガイドでは、あらゆるクラウドストレージからデータファイルをインポートし、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", ...]

Datasetを公開する

その後、Hugging Face上でデータセットを作成し、for example: を使用してデータファイルをインポートできます。

>>> 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