Datasets documentation
クラウドストレージ
クラウドストレージ
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 S3 | s3fs |
| Google Cloud Storage | gcsfs |
| Azure Blob/DataLake | adlfs |
| Oracle Cloud Storage | 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", ...]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")