暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

国内用户如何使用 DuckDB 访问 Hugging Face 上超15万 数据集?

alitrack 2024-07-12
487

写在前面

上次是Hugging Face主动拥抱DuckDB,50多万种数据集轻松查

这次是DuckDB 主动拥抱Hugging Face,总算完成了互相拥抱。但DuckDB这次忘记了拥抱中国用户,我来帮DuckDB一把。

原文:Access 150k+ Datasets from Hugging Face with DuckDB[1]

author: Hugging Face 和 DuckDB 团队

2024年5月底,DuckDB激动地宣布,DuckDB 现已支持 hf://
 路径,让您可以轻松访问 Hugging Face 平台上超过 15 万个用于人工智能研究的数据集。DuckDB与 Hugging Face 携手合作,致力于让访问、处理和探索 AI 模型训练和评估所需的数据集变得更加便捷高效。但是,他们忘记了可怜的中国兄弟,总不能每次使用魔法来访问吧?好在我们有Hugging Face镜像可以使用, 我之前也多次介绍过,比如 ,

今天的解决办法依然离不开它, 可惜DuckDB不支持读取改环境变量HF_ENDPOINT
,所以得从源代码入手了,下面把修改后的源代码附上:替换掉 hff.hpp
中的

struct ParsedHFUrl{
//! Path within the
    string path;
//! Name of the repo (i presume)
    string repository;

//! Endpoint, defaults to HF
    string endpoint ="https://huggingface.co";
//! Which revision/branch/tag to use
    string revision ="main";
//! For DuckDB this may be a sensible default?
    string repo_type ="datasets";
};

struct ParsedHFUrl{
//! Path within the
    std::string path;
//! Name of the repo (i presume)
    std::string repository;

//! Endpoint, defaults to HF
    std::string endpoint;
//! Which revision/branch/tag to use
    std::string revision;
//! For DuckDB this may be a sensible default?
    std::string repo_type;

// Constructor
ParsedHFUrl():
endpoint(std::getenv("HF_ENDPOINT")? std::getenv("HF_ENDPOINT"):"https://huggingface.co"),
revision("main"),
repo_type("datasets"){}
};

即可。

顺便说了,有了GPT真好,我把想法提出来,GPT帮我完成代码工作,我没有修改一个字符。

接下来就是编译了

BUILD_HTTPFS=1 make 
HF_ENDPOINT=https://hf-mirror.com ./build/release/duckdb
v0.5.2-dev26246 7b2cdc786b
Enter".help"for usage hints.
Connected to a transient in-memory database.
Use".open FILENAME" to reopen on a persistent database.
D SET autoinstall_known_extensions=1;
D SET autoload_known_extensions=1;
D SELECT count(*) AS count
  FROM 'hf://datasets/cais/mmlu/astronomy/test-00000-of-00001.parquet';
┌───────┐
│ count │
│ int64 │
├───────┤
│152│
└───────┘
D .q

附上测试效果:

下面让我们看看DuckDB 如何轻松访问 Hugging Face 海量数据集吧

数据集仓库

Hugging Face (https://huggingface.co/) 是一个广受欢迎的平台,用户可以在此存储、共享机器学习模型、数据集以及其他资源,并进行协同开发。

数据集通常包含以下内容:

  • • README
     文件:这是一个纯文本文件,概述了数据集仓库及其内容,通常会描述数据集的用途、使用方法以及特定的要求或依赖项。

  • • 数据文件:根据数据集类型的不同,数据文件格式可能会有所不同,例如 CSV、Parquet、JSONL 等。这些文件构成了数据集的核心内容。

一个典型的数据集仓库结构如下所示:

使用 hf:// 路径读取数据

在处理数据时,您经常需要读取各种格式的文件,例如 CSV、JSONL 和 Parquet。自 v0.10.3 版本开始,DuckDB 原生支持 hf://
 路径,作为 httpfs
 扩展[2]
 的一部分,使您能够轻松访问所有这些格式的数据。

现在,您可以使用以下 URL 模式查询 Hugging Face 数据集:

hf://datasets/⟨用户名⟩/⟨数据集名称⟩/⟨文件路径⟩

例如,要读取 CSV 文件,可以使用以下查询语句:

SELECT *
FROM 'hf://datasets/datasets-examples/doc-formats-csv-1/data.csv';

其中:

  • • datasets-examples
     是用户名或组织名称

  • • doc-formats-csv-1
     是数据集仓库的名称

  • • data.csv
     是仓库中的文件路径

查询结果如下所示:

kindsound
dogwoof
catmeow
pokemonpika
humanhello

要读取 JSONL 文件,可以运行以下查询:

SELECT *
FROM 'hf://datasets/datasets-examples/doc-formats-jsonl-1/data.jsonl';

要读取 Parquet 文件,可以使用以下查询:

SELECT *
FROM 'hf://datasets/datasets-examples/doc-formats-parquet-1/data/train-00000-of-00001.parquet';

以上每个命令都会从指定的文件格式读取数据,并以结构化表格的形式进行展示。您可以根据实际需要选择合适的命令来读取不同格式的数据。

创建本地表

为了避免每次查询都访问远程服务器,您可以使用 CREATE TABLE ... AS
 命令将数据保存到 DuckDB 表中。例如:

CREATE TABLE data AS
    SELECT *
    FROM 'hf://datasets/datasets-examples/doc-formats-csv-1/data.csv';

创建本地表后,您可以直接查询该表:

SELECT *
FROM data;

处理多个文件

在处理大型数据集时,您可能需要同时查询多个文件。让我们以 cais/mmlu[3](测量大规模多任务语言理解)数据集为例来说明如何使用 DuckDB 高效地查询多个文件。该数据集包含来自各个知识领域的包含多项选择题的测试,涵盖 57 个任务,包括初等数学、美国历史、计算机科学、法律等等。为了在本次测试中获得高准确率,AI 模型必须具备广泛的世界知识和解决问题的能力。

首先,让我们计算单个文件中的行数。要从 cais/mmlu 数据集中的单个文件获取行数,请使用以下查询语句:

SELECT count(*) AS count
FROM 'hf://datasets/cais/mmlu/astronomy/dev-00000-of-00001.parquet';

count
5

类似地,对于同一数据集中的另一个文件 (test-00000-of-00001.parquet
),我们可以运行以下查询:

SELECT count(*) AS count
FROM 'hf://datasets/cais/mmlu/astronomy/test-00000-of-00001.parquet';

count
152

要查询特定格式下的所有文件,可以使用 glob 模式[4]。例如,以下查询可以统计所有 Parquet 文件中的总行数:

SELECT count(*) AS count
FROM 'hf://datasets/cais/mmlu/astronomy/*.parquet';

count
173

通过使用 glob 模式,您可以高效地处理大型数据集,并跨多个文件执行查询,从而简化数据检查和处理任务。例如,您可以使用以下查询查找天文学类别中包含单词“planet”的所有问题:

SELECT count(*) AS count
FROM 'hf://datasets/cais/mmlu/astronomy/*.parquet'
WHERE question LIKE '%planet%';

count
21

以下查询展示了其中三个示例:

SELECT question
FROM 'hf://datasets/cais/mmlu/astronomy/*.parquet'
WHERE question LIKE '%planet%'
LIMIT 3;

question
Why isn't there a planet where the asteroid belt is located?
On which planet in our solar system can you find the Great Red Spot?
The lithosphere of a planet is the layer that consists of

版本控制和修订

在 Hugging Face 数据集仓库中,数据集版本或修订指的是数据集的不同更新。每个版本都是特定时间点的快照,方便用户跟踪数据集的变化和改进。用 Git 术语来说,它可以理解为分支或特定提交。

您可以使用以下 URL 模式查询不同版本或修订的数据集:

hf://datasets/⟨用户名⟩/⟨数据集名称⟩@⟨分支名称⟩/⟨文件路径⟩

例如:

SELECT *
FROM 'hf://datasets/datasets-examples/doc-formats-csv-1@~parquet/**/*.parquet';

kindsound
dogwoof
catmeow
pokemonpika
humanhello

上述查询将会读取 ~parquet
 修订版本下的所有 Parquet 文件。~parquet
 是一个特殊分支,Hugging Face 会自动将每个数据集转换为 Parquet 格式并存储在该分支下,以便用户进行高效的数据扫描。

身份验证

要访问私有或受控数据集,您需要在 DuckDB Secrets Manager 中配置您的 Hugging Face Token。首先,请访问 Hugging Face 设置 - Token[5] 页面获取您的访问 Token。然后,使用 DuckDB 的 Secrets Manager[6] 在您的 DuckDB 会话中设置 Token。DuckDB 支持两种 Token 管理方式:

  • • CONFIG
    :您需要将所有配置信息传递给 CREATE SECRET
     语句。要使用 CONFIG
     方式创建密钥,请使用以下命令:

    CREATE SECRET hf_token (
       TYPE HUGGINGFACE,
       TOKEN 'your_hf_token'
    );

  • • CREDENTIAL_CHAIN
    :DuckDB 会自动尝试获取凭据。对于 Hugging Face Token,它会尝试从 ~/.cache/huggingface/token
     文件中读取。要使用 CREDENTIAL_CHAIN
     方式创建密钥,请使用以下命令:

    CREATE SECRET hf_token (
       TYPE HUGGINGFACE,
       PROVIDER CREDENTIAL_CHAIN
    );

结论

DuckDB 中 hf://
 路径的集成极大简化了对 Hugging Face 平台上超过 15 万个数据集的访问和查询流程。该功能使数据操作和探索变得更加便捷高效,让更多用户能够轻松访问和利用 CSV、JSON、JSONL 和 Parquet 等各种格式的数据集。通过利用 hf://
 路径,用户可以执行复杂查询、高效处理大型数据集并利用 Hugging Face 数据集仓库的丰富资源。

DuckDB 与 Hugging Face 的集成支持无缝访问单个文件、使用 glob 模式查询多个文件以及访问不同版本的数据集。DuckDB 强大的功能为用户提供了灵活且高效的数据处理体验。这种集成是朝着让 AI 数据集访问更加便捷高效迈出的重要一步,必将促进机器学习领域的创新和发展。

想了解更多关于如何使用 DuckDB 处理 Hugging Face 数据集的信息,请访问 详细指南[7]

引用链接

[1]
 Access 150k+ Datasets from Hugging Face with DuckDB: https://duckdb.org/2024/05/29/access-150k-plus-datasets-from-hugging-face-with-duckdb.html
[2]
 httpfs
 扩展: https://duckdb.org/docs/extensions/httpfs/overview.html
[3]
 cais/mmlu: https://huggingface.co/datasets/cais/mmlu
[4]
 glob 模式: https://duckdb.org/docs/data/multiple_files/overview.html#multi-file-reads-and-globs
[5]
 Hugging Face 设置 - Token: https://huggingface.co/settings/tokens
[6]
 Secrets Manager: https://duckdb.org/docs/configuration/secrets_manager.html
[7]
 详细指南: https://huggingface.co/docs/hub/datasets-duckdb


文章转载自alitrack,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论