数据集文档

云存储

Hugging Face's logo
加入 Hugging Face 社区

并获得增强型文档体验

入门

云存储

🤗 数据集通过 fsspec 文件系统实现支持访问云存储提供商。您可以以 Pythonic 方式从任何云存储中保存和加载数据集。查看下表以了解一些受支持的云存储提供商示例。

存储提供商 文件系统实现
Amazon S3 s3fs
Google Cloud Storage gcsfs
Azure Blob/DataLake adlfs
Dropbox dropboxdrivefs
Google Drive gdrivefs
Oracle Cloud Storage ocifs

本指南将向您展示如何使用任何云存储来保存和加载数据集。以下是有关 S3、Google Cloud Storage、Azure Blob Storage 和 Oracle Cloud Object Storage 的示例。

设置您的云存储文件系统

Amazon S3

  1. 安装 S3 文件系统实现
>>> pip install s3fs
  1. 定义您的凭据

要使用匿名连接,请使用 anon=True。否则,在您与私有 S3 存储桶交互时,请包含您的 aws_access_key_idaws_secret_access_key

>>> storage_options = {"anon": True}  # for anonymous connection
# or use your credentials
>>> storage_options = {"key": aws_access_key_id, "secret": aws_secret_access_key}  # for private buckets
# or use a botocore session
>>> import aiobotocore.session
>>> s3_session = aiobotocore.session.AioSession(profile="my_profile_name")
>>> storage_options = {"session": s3_session}
  1. 创建您的文件系统实例
>>> import s3fs
>>> fs = s3fs.S3FileSystem(**storage_options)

Google Cloud Storage

  1. 安装 Google Cloud Storage 实现
>>> conda install -c conda-forge gcsfs
# or install with pip
>>> pip install gcsfs
  1. 定义您的凭据
>>> storage_options={"token": "anon"}  # for anonymous connection
# or use your credentials of your default gcloud credentials or from the google metadata service
>>> storage_options={"project": "my-google-project"}
# or use your credentials from elsewhere, see the documentation at https://gcsfs.readthedocs.io/
>>> storage_options={"project": "my-google-project", "token": TOKEN}
  1. 创建您的文件系统实例
>>> import gcsfs
>>> fs = gcsfs.GCSFileSystem(**storage_options)

Azure Blob Storage

  1. 安装 Azure Blob Storage 实现
>>> conda install -c conda-forge adlfs
# or install with pip
>>> pip install adlfs
  1. 定义您的凭据
>>> storage_options = {"anon": True}  # for anonymous connection
# or use your credentials
>>> storage_options = {"account_name": ACCOUNT_NAME, "account_key": ACCOUNT_KEY}  # gen 2 filesystem
# or use your credentials with the gen 1 filesystem
>>> storage_options={"tenant_id": TENANT_ID, "client_id": CLIENT_ID, "client_secret": CLIENT_SECRET}
  1. 创建您的文件系统实例
>>> import adlfs
>>> fs = adlfs.AzureBlobFileSystem(**storage_options)

Oracle Cloud Object Storage

  1. 安装 OCI 文件系统实现
>>> pip install ocifs
  1. 定义您的凭据
>>> storage_options = {"config": "~/.oci/config", "region": "us-ashburn-1"} 
  1. 创建您的文件系统实例
>>> import ocifs
>>> fs = ocifs.OCIFileSystem(**storage_options)

使用您的云存储文件系统加载和保存您的数据集

将数据集下载并准备到云存储中

您可以通过在 download_and_prepare 中指定远程 output_dir 来将数据集下载并准备到您的云存储中。不要忘记使用之前定义的包含您的凭据的 storage_options 来写入私有云存储。

download_and_prepare 方法分两个步骤完成

  1. 它首先将您的本地缓存中的原始数据文件(如果有)下载。您可以通过将 cache_dir 传递给 load_dataset_builder() 来设置您的缓存目录。
  2. 然后,它通过遍历原始数据文件,以 Arrow 或 Parquet 格式在您的云存储中生成数据集。

从 Hugging Face Hub 加载数据集构建器(请参阅 如何从 Hugging Face Hub 加载

>>> output_dir = "s3://my-bucket/imdb"
>>> builder = load_dataset_builder("imdb")
>>> builder.download_and_prepare(output_dir, storage_options=storage_options, file_format="parquet")

使用您自己的数据文件(请参阅 如何加载本地和远程文件

>>> data_files = {"train": ["path/to/train.csv"]}
>>> output_dir = "s3://my-bucket/imdb"
>>> builder = load_dataset_builder("csv", data_files=data_files)
>>> builder.download_and_prepare(output_dir, storage_options=storage_options, file_format="parquet")

强烈建议将文件保存为压缩的 Parquet 文件,以便通过指定 file_format="parquet" 来优化 I/O。否则,数据集将保存为未压缩的 Arrow 文件。

您还可以使用 max_shard_size 指定分片的尺寸(默认值为 500MB)

>>> builder.download_and_prepare(output_dir, storage_options=storage_options, file_format="parquet", max_shard_size="1GB")

Dask

Dask 是一个并行计算库,它具有一个类似 pandas 的 API,可用于并行处理比内存更大的 Parquet 数据集。Dask 可以使用一台机器上的多个线程或进程,或者使用机器集群来并行处理数据。Dask 支持本地数据,也支持来自云存储的数据。

因此,您可以使用 Dask 加载以分片 Parquet 文件形式保存的数据集,方法是:

import dask.dataframe as dd

df = dd.read_parquet(output_dir, storage_options=storage_options)

# or if your dataset is split into train/valid/test
df_train = dd.read_parquet(output_dir + f"/{builder.name}-train-*.parquet", storage_options=storage_options)
df_valid = dd.read_parquet(output_dir + f"/{builder.name}-validation-*.parquet", storage_options=storage_options)
df_test = dd.read_parquet(output_dir + f"/{builder.name}-test-*.parquet", storage_options=storage_options)

您可以在他们的 文档 中找到有关 dask 数据帧的更多信息。

保存序列化数据集

在您处理完数据集后,您可以使用 Dataset.save_to_disk() 将其保存到您的云存储中。

# saves encoded_dataset to amazon s3
>>> encoded_dataset.save_to_disk("s3://my-private-datasets/imdb/train", storage_options=storage_options)
# saves encoded_dataset to google cloud storage
>>> encoded_dataset.save_to_disk("gcs://my-private-datasets/imdb/train", storage_options=storage_options)
# saves encoded_dataset to microsoft azure blob/datalake
>>> encoded_dataset.save_to_disk("adl://my-private-datasets/imdb/train", storage_options=storage_options)

请记住,在您与私有云存储交互时,要在 文件系统实例 fs 中定义您的凭据。

列出序列化数据集

使用 fs.ls 使用您的文件系统实例 fs 列出云存储中的文件

>>> fs.ls("my-private-datasets/imdb/train", detail=False)
["dataset_info.json.json","dataset.arrow","state.json"]

加载序列化数据集

当您准备好再次使用您的数据集时,请使用 Dataset.load_from_disk() 重新加载它。

>>> from datasets import load_from_disk
# load encoded_dataset from cloud storage
>>> dataset = load_from_disk("s3://a-public-datasets/imdb/train", storage_options=storage_options)  
>>> print(len(dataset))
25000
< > 在 GitHub 上更新