返回介绍

数学基础

统计学习

深度学习

工具

Scala

二、load_dataset() 原理

发布于 2023-07-17 23:38:23 字数 5680 浏览 0 评论 0 收藏 0

  1. 一个 dataset 是包含如下内容的目录:

    • 一些通用格式的数据文件,如 JSON, CSV, Parquet, text 等等格式。
    • 一个可选的 dataset script ,如果它需要一些代码来读取数据文件。这用于加载所有格式和结构的文件。

    load_dataset() 函数从本地或 Hugging Face Hub 获取 datasetHub 是一个 central repository ,它存储了 Hugging Face 的数据集和模型。

    • 如果数据集仅包含数据文件,那么 load_dataset() 会根据数据文件的扩展名(如 json, csv, parquet,text 等等)来自动推断如何加载数据文件。

    • 如果数据集有一个 dataset script ,那么 load_dataset()Hugging Face Hub 下载并导入 dataset scriptdataset script 中的代码定义数据集信息(描述、Features 、原始文件的 URL 等等),并讲述 Datasets 如何从 dataset script 生成和展示样本。

      dataset script 从原始文件的 URL 下载数据集文件,生成数据集并将其缓存在磁盘上的 Arrow table 中。 如果你以前下载过该数据集,那么 Datasets 将从缓存中重新加载它,从而避免重复下载。

  2. 构建一个数据集:首次加载数据集时,Datasets 获取原始数据文件,并将其构建为一个 table,这个 table 由行组成并且包含带类型的列。有两个主要的类负责构建数据集:BuilderConfigDatasetsBuilder

  3. BuilderConfigBuilderConfigDatasetsBuilder 的配置类,包含以下基本属性:

    • name:数据集的简称。
    • version:数据集的版本 id
    • data_dir:包含数据文件的本地目录的路径。
    • data_files:本地数据文件的文件名。
    • description:数据集的描述。

    如果你想向你的数据集添加额外的属性,如 class label,你可以创建 base BuilderConfig class 的子类。有两种方法可以填充 BuilderConfig 类及其子类的属性:

    • 在数据集的 DatasetsBuilder.BUILDER_CONFIGS() 属性中,提供一组预定义的 BuilderConfig 类(或子类)的实例。
    • 当你调用 load_dataset() 时,任何不是特定于该方法的关键字参数都将用于设置 BuilderConfig 类的关联属性(如果属性已经设置过,那么这里将覆盖它)。

    你还可以设置 DatasetBuilder.BUILDER_CONFIG_CLASSBuilderConfig 的任意自定义子类。

  4. DatasetsBuilderDatasetBuilder 访问 BuilderConfig 中的所有属性来构建实际的数据集。DatasetBuilder 有三个主要的方法:

    • DatasetBuilder._info():负责定义数据集属性。当你调用 dataset.info 时,Datasets 返回存储在这里的信息。同样地,这里也指定了 FeaturesFeatures 提供了每一列的名称和类型)。

    • DatasetBuilder._split_generator():下载或检索数据文件,将它们组织为 splits(即,训练集、验证集、测试集的拆分)。

      该方法有一个 DownloadManager ,可以从本地文件系统下载或获取文件。在 DownloadManager 中,有一个 DownloadManager.download_and_extract() 方法,它接受 URL 到原始数据文件的字典,并下载所请求的文件。可接受的输入包括:单个 URL 或路径、URL 或路径的列表/字典。任何压缩文件类型(如 TAR, GZIP, ZIP)都将被自动解压。

      文件下载完成之后,SplitGenerator 会将它们组织成 splitsSplitGenerator 包含 split 的名称,以及任何关键字参数(这些关键字参数用于提供给 DatasetBuilder._generate_examples() 方法)。这些关键字参数可以特定于每个 split,并且通常至少包括每个 split 的数据文件的本地路径。

    • DatasetBuilder._generate_examples() :为一个 split 读取并解析数据文件。然而,它根据来自 DatasetBuilder._info()features 指定的格式来生成样本。DatasetBuilder._generate_examples() 的输入实际上是 DatasetBuilder._split_generator() 的关键字参数中所提供的路径。

      数据集是使用 Python generator 生成的,该生成器不会将所有数据加载到内存中。因此,生成器可以处理大型数据集。但是,在将生成的样本刷新到磁盘上的数据集文件之前,它们存储在一个 ArrowWriter buffer 中。这意味着被生成的样本是以 batch 的方式写入的。如果数据集样本消耗大量的内存(如图像、视频),请确保在 DatasetBuilder 中为 DEFAULT_WRITER_BATCH_SIZE 属性指定一个较低的值。我们建议不要超过 200 MB 的大小。

  5. 没有 loading script:有时候我们希望能够快速使用一个数据集。实现一个 dataset loading script 有时会碍事。Datasets 消除了这个障碍,它使从 Hug 加载任何数据集成为可能,而无需 dataset loading script 。用户只需要将数据文件上传到 Hug 上的 dataset repository 中。

    loading script-free 方法使用 huggingface_hub library 来列出 dataset repository 中的文件。你也可以提供本地目录的路径,而不是 repository name。根据可用的数据文件格式,Datasets 自动选择一个 data file builder 来为你创建数据集。

  6. 维持完整性:为了确保数据集是完整的,load_dataset() 将对下载的文件执行一系列的测试,确保所有内容都在那里。以下数据将被验证:下载文件的列表、下载文件的字节数量、下载文件的 SHA256 checksum 、生成的 DatasetDictsplit 数量、生成的 DatasetDict 的每个 split 中的样本数。

    如果数据集没有通过验证,很可能数据集的原始 host 在数据文件中做了一些更改。在这种情况下,会引发一个错误,警告数据集已更改。要忽略错误,需要在 load_dataset() 中指定 ignore_verifications=True 。每当看到验证错误时,请随时在相应的数据集 "Community" 选项卡中发起一个 discussionpull request ,以便更新该数据集的完整性检查。

  7. Datasets 将每个数据集看作一个内存映射文件,这个内存映射文件提供了 RAM 和文件系统存储之间的映射,从而允许 Datasets 访问和操作数据集的元素而无需将数据集完全加载到内存中。内存映射文件也在多个进程之间共享,这使得像 Dataset.map()之类的方法可以并行化,而无需移动或者拷贝数据集。在底层,些功能都是由 apache Arrow 内存格式和 pyarrow 库提供的支持,使得数据加载和处理速度非常快速。Datasets 通常能以 GB/s 级别的速度迭代数据集。

    通过上述的方法就已经能够解决大多数大数据集加载的限制,但是有时候我们不得不使用一个很大的数据集, 该数据集甚至无法存储在笔记本电脑的硬盘上。例如,如果我们尝试下载整个 Pile 数据集,我们需要 825GB 的可用磁盘空间。为了处理这种情况,Datasets 提供了一个流式功能,这个功能允许我们动态下载和访问数据集元素而不需要下载整个数据集。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文