云存储
🤗 数据集通过 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
- 安装 S3 文件系统实现
>>> pip install s3fs
- 定义您的凭据
要使用匿名连接,请使用 anon=True
。否则,在您与私有 S3 存储桶交互时,请包含您的 aws_access_key_id
和 aws_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}
- 创建您的文件系统实例
>>> import s3fs
>>> fs = s3fs.S3FileSystem(**storage_options)
Google Cloud Storage
- 安装 Google Cloud Storage 实现
>>> conda install -c conda-forge gcsfs
# or install with pip
>>> pip install gcsfs
- 定义您的凭据
>>> 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}
- 创建您的文件系统实例
>>> import gcsfs
>>> fs = gcsfs.GCSFileSystem(**storage_options)
Azure Blob Storage
- 安装 Azure Blob Storage 实现
>>> conda install -c conda-forge adlfs
# or install with pip
>>> pip install adlfs
- 定义您的凭据
>>> 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}
- 创建您的文件系统实例
>>> import adlfs
>>> fs = adlfs.AzureBlobFileSystem(**storage_options)
Oracle Cloud Object Storage
- 安装 OCI 文件系统实现
>>> pip install ocifs
- 定义您的凭据
>>> storage_options = {"config": "~/.oci/config", "region": "us-ashburn-1"}
- 创建您的文件系统实例
>>> import ocifs
>>> fs = ocifs.OCIFileSystem(**storage_options)
使用您的云存储文件系统加载和保存您的数据集
将数据集下载并准备到云存储中
您可以通过在 download_and_prepare
中指定远程 output_dir
来将数据集下载并准备到您的云存储中。不要忘记使用之前定义的包含您的凭据的 storage_options
来写入私有云存储。
download_and_prepare
方法分两个步骤完成
- 它首先将您的本地缓存中的原始数据文件(如果有)下载。您可以通过将
cache_dir
传递给 load_dataset_builder() 来设置您的缓存目录。 - 然后,它通过遍历原始数据文件,以 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