Datasets documentation
클라우드 스토리지
클라우드 스토리지
Hugging Face Datasets
Hugging Face Dataset Hub에는 다양한 도메인과 작업을 아우르는 데이터셋 모음이 꾸준히 증가하고 있습니다.
클라우드 스토리지 이상의 기능을 제공합니다. Dataset Hub는 git을 통한 데이터 버전 관리와 데이터를 탐색할 수 있는 Dataset Viewer를 제공하는 플랫폼으로, AI에 바로 사용할 수 있는 데이터셋을 저장하기에 최적의 장소입니다.
이 가이드는 fsspec의 filesystems 구현을 사용하여 다른 클라우드 스토리지에서 데이터를 가져오는 방법을 보여줍니다.
Hugging Face Storage Buckets
Storage Buckets는 Xet 스토리지 백엔드로 구동되는 S3 유사 객체 스토리지를 제공하는 Hugging Face Hub의 저장소 유형입니다. Git 기반 데이터셋 저장소와 달리 버킷은 버전 관리가 되지 않고 변경 가능한(non-versioned, mutable) 구조로, 버전 관리가 필요 없는 로그, 중간 산출물, 또는 대량의 파일 컬렉션과 같이 단순하고 빠른 스토리지가 필요한 사용 사례를 위해 설계되었습니다.
클라우드 스토리지에서 데이터 가져오기
대부분의 클라우드 스토리지 제공업체에는 fsspec FileSystem 구현이 있어, 동일한 코드로 모든 클라우드 제공업체에서 데이터를 가져오는 데 유용합니다.
이는 Hugging Face에 데이터셋을 게시할 때 특히 유용합니다.
지원되는 클라우드 스토리지 제공업체의 예시를 확인하려면 다음 표를 참고하세요:
| 스토리지 제공자 | Filesystem 구현 |
|---|---|
| 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", ...]데이터셋 게시
그 후 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")