Hugging Face Datasets での作業

'Hugging Face Datasets での作業'

Hugging Face Hubでデータセットにアクセスし、DuckDBとDatasetsライブラリを使用してリモートでロードする方法を学びましょう

Lars Kienleさんによる写真 Unsplash

Hugging FaceはAIプラットフォームであり、最先端のオープンソースの機械学習モデルを構築、トレーニング、展開しています。これらのトレーニング済みモデルをホスティングするだけでなく、Hugging Faceはデータセット(https://huggingface.co/datasets)もホスティングしており、それらを自身のプロジェクトで利用することができます。

この記事では、Hugging Faceでデータセットにアクセスする方法と、それらをローカルコンピュータにプログラムでダウンロードする方法を紹介します。具体的には、以下の方法を紹介します:

  • DuckDBのhttpfsを使用してデータセットをリモートでロードする
  • Hugging FaceのDatasetsライブラリを使用してデータセットをストリームで取得する

Hugging Faceデータセットサーバー

Hugging Faceデータセットサーバーは、Hugging Face Hubに保存されたさまざまなタイプのデータセットを視覚化するための軽量なWeb APIです。提供されるREST APIを使用して、Hugging Face Hubに保存されたデータセットをクエリすることができます。以下のセクションでは、https://datasets-server.huggingface.co/でAPIを使用するための短いチュートリアルを提供します。

ハブにホストされているデータセットの一覧を取得する

Hugging Faceから取得できるデータセットの一覧を取得するには、validエンドポイントを使用して以下のステートメントを使用します:

$ curl -X GET "https://datasets-server.huggingface.co/valid"

以下のようなJSON結果が表示されます:

エラーなしで動作するデータセットは、結果のvalidキーの値にリストされています。上記の例では、0-hero/OIG-small-chip2という有効なデータセットの例があります。

データセットの検証

データセットを検証するには、is-validエンドポイントとdatasetパラメータを使用して以下のステートメントを使用します:

$ curl -X GET "https://datasets-server.huggingface.co/is-valid?dataset=0-hero/OIG-small-chip2"

データセットが有効な場合、以下の結果が表示されます:

{"valid":true}

データセットの構成とスプリットのリストを取得する

データセットには通常、スプリット(トレーニングセット、バリデーションセット、テストセット)があります。また、構成(大きなデータセット内のサブデータセット)も持つ場合があります。

構成は、多言語音声データセットに一般的です。スプリットの詳細については、以下を参照してください: https://huggingface.co/docs/datasets-server/splits

データセットのスプリットを取得するには、splitsエンドポイントとdatasetパラメータを使用して以下のステートメントを使用します:

$ curl -X GET "https://datasets-server.huggingface.co/splits?dataset=0-hero/OIG-small-chip2"

以下の結果が返されます:

{  "splits": [    {      "dataset":"0-hero/OIG-small-chip2",      "config":"0-hero--OIG-small-chip2",      "split":"train"    }  ],  "pending":[],  "failed":[]}

このデータセットでは、単一のtrainスプリットのみが存在します。

以下は、複数のスプリットと構成を持つデータセット(” duorc “)の例です:

{  "splits": [    {      "dataset": "duorc",      "config": "SelfRC",      "split": "train",      "num_bytes": 239852925,      "num_examples": 60721    },    {      "dataset": "duorc",      "config": "SelfRC",      "split": "validation",      "num_bytes": 51662575,      "num_examples": 12961    },    {      "dataset": "duorc",      "config": "SelfRC",      "split": "test",      "num_bytes": 49142766,      "num_examples": 12559    },    {      "dataset": "duorc",      "config": "ParaphraseRC",      "split": "train",      "num_bytes": 496683105,      "num_examples": 69524    },    {      "dataset": "duorc",      "config": "ParaphraseRC",      "split": "validation",      "num_bytes": 106510545,      "num_examples": 15591    },    {      "dataset": "duorc",      "config": "ParaphraseRC",      "split": "test",      "num_bytes": 115215816,      "num_examples": 15857    }  ]}

最初の100行の取得

しばしば、すべてをダウンロードする代わりに、データセットの一部を取得して調査することがあります。次のステートメントは、datasetconfig、およびsplitパラメータを使用して、指定したデータセットの最初の100行を抽出するためにfirst-rowsエンドポイントを使用しています。

$ curl -X GET "https://datasets-server.huggingface.co/first-rows?dataset=0-hero/OIG-small-chip2&config=0-hero--OIG-small-chip2&split=train"

JSONの結果は、指定したデータセットの最初の100行を返します:

{ "dataset": "0-hero/OIG-small-chip2", "config": "0-hero--OIG-small-chip2", "split": "train", "features": [{  "feature_idx": 0,  "name": "user",  "type": {   "dtype": "string",   "_type": "Value"  } }, {  "feature_idx": 1,  "name": "chip2",  "type": {   "dtype": "string",   "_type": "Value"  } }], "rows": [{  "row_idx": 0,  "row": {   "user": "遺言を作成するのは良いアイデアだと聞いたことがあります。遺言とは何ですか?\n\n",   "chip2": "遺言は、あなたが亡くなった後に財産をどのように分配するかを指定する法的文書です。また、子供や他の扶養家族の世話を誰がするかを指定することもできます。遺言が有効かつ最新であることは重要です。なぜなら、遺言に関する法律は州によって異なるからです。"  },  "truncated_cells": [] }, {  "row_idx": 1,  "row": {   "user": "どうやって仕事を見つけますか?\n\n",   "chip2": "仕事を見つける最良の方法は、スキル、経験、資格を強調した強力な履歴書とカバーレターを作成することです。また、専門分野でのオンラインでの求人情報検索や地元の雇用主に直接連絡して利用可能なポジションについて問い合わせることもできます。同じ分野や業界の人々とのネットワーキングも、雇用の機会を見つけるのに役立つことがあります。"  },  "truncated_cells": [] }, {  "row_idx": 2,  "row": {   "user": "ドーム状の天井、柱、ドアのある邸宅の陰気なシーンの詳細な書き換えを作成してください。\n\n",   "chip2": "円形で、床は完全に黒い大理石の四角形の切り出しでできています。大きな黒くなった大理石の柱が壁に沿って並び、上空にはドーム状のガラス天井で終わります。部屋の向こう側には、その下にミスリンで覆われたドアがある一連の階段があります。"  },  "truncated_cells": [] }, { ... }, {  "row_idx": 98,  "row": {   "user": "お金の予算をもっと上手に立てる方法を学びたいです。どのようなアドバイスがありますか?\n\n",   "chip2": "お金の予算をもっと上手に立てるための最良の方法の一つは、予算を作成し、支出を追跡することです。まず、収入源と支出のすべてを書き出します。それぞれの項目を詳しく見て、どこで削減できるかを判断します。家賃や公共料金など、最初に支払う必要のあるものを優先し、貯金にもお金を少し取り分けるようにしましょう。また、自分自身に支出制限を設けることで、目標に向かって進むのに役立ちます。最後に、定期的に予算を見直して、予算の目標内に収まっているか確認しましょう。"  },  "truncated_cells": [] }, {  "row_idx": 99,  "row": {   "user": "山道の外にある美しいシーンの詳細な描写を作成してください。そこにはモニールの木と巨岩があります。\n\n",   "chip2": "遠い昔、山の険しい崖から落ちたらしい大きな花崗岩の巨岩は、石畳の道のそばにあります。モニールの木々に囲まれて、その巨岩は旅人にとって便利な休憩所であり、旅の厳しさからの一時的な休息を提供します。"  },  "truncated_cells": [] }]}

データセットの一部を取得する

データセットの一部を取得することもできます。次のステートメントは、指定したデータセットの3行目から始まる指定されたデータセットの3行を抽出するために、rows エンドポイントを datasetconfigsplitoffsetlength パラメータとともに使用します。

$ curl -X GET "https://datasets-server.huggingface.co/rows?dataset=0-hero/OIG-small-chip2&config=0-hero--OIG-small-chip2&split=train&offset=2&length=3"

結果は以下のようになります:

{ "features": [{  "feature_idx": 0,  "name": "user",  "type": {   "dtype": "string",   "_type": "Value"  } }, {  "feature_idx": 1,  "name": "chip2",  "type": {   "dtype": "string",   "_type": "Value"  } }], "rows": [{  "row_idx": 2,  "row": {   "user": "Produce a detailed written description of a gloomy scene inside of a mansion with a domed ceiling, pillars, and a door.\n\n",   "chip2": "Circular in shape, the floor is completely made from square-cut sections of black marble. Large, blackened marble pillars line the walls, ending with a domed glass ceiling high overhead. A narrow gap on the far side of the room leads to a sweeping stairwell with a mithglin-plated door beneath it."  },  "truncated_cells": [] }, {  "row_idx": 3,  "row": {   "user": "I have a sprained ankle and need to know what I can do to help it heal faster.\n\n",   "chip2": "You may want to try some ice therapy, which will help reduce swelling and inflammation. Additionally, you could use an elastic bandage or compression wrap to provide additional support for your ankle. It's also important to stay off of it as much as possible, so that it can heal properly."  },  "truncated_cells": [] }, {  "row_idx": 4,  "row": {   "user": "How do you roast a turkey?\n\n",   "chip2": "To roast a turkey, start by preheating your oven to 350 degrees F. Place the turkey in a roasting pan, and rub it with butter or olive oil. Sprinkle with salt and pepper, and any other herbs or seasonings you like. Place the turkey in the oven and cook for approximately 20 minutes per pound, or until the internal temperature registers 165 degrees. Once the turkey is cooked, remove it from the oven and let it sit for 10-15 minutes before carving."  },  "truncated_cells": [] }]}

データセットのParquetファイルを取得する

Hugging Face Hubのデータセットは、さまざまな形式(CSV、JSONLなど)で公開することができますが、Datasetsサーバーはすべての公開データセットを自動的にParquet形式に変換します。 Parquet形式は、特に大規模なデータセットの場合に、パフォーマンスの向上を提供します。後のセクションでは、これを示します。

Apache Parquetは、複雑なデータの高速データ処理をサポートするように設計されたファイル形式です。 Parquetについての詳細は、以前の記事を読んでください:

まだデータをCSVで保存していますか? これらの他のオプションを試してみてください

さまざまな形式(CSV、圧縮、Pickle、およびParquet)でデータを保存し、ストレージを節約し、リダクションする方法を学ぶ…

towardsdatascience.com

Parquet形式でデータセットをロードするには、parquet エンドポイントと dataset パラメータを使用した次のステートメントを使用します:

$ curl -X GET "https://datasets-server.huggingface.co/parquet?dataset=0-hero/OIG-small-chip2"  

上記のステートメントは、以下のJSON結果を返します:

{ "parquet_files": [{  "dataset": "0-hero/OIG-small-chip2",  "config": "0-hero--OIG-small-chip2",  "split": "train",  "url": "https://huggingface.co/datasets/0-hero/OIG-small-chip2/resolve/refs%2Fconvert%2Fparquet/0-hero--OIG-small-chip2/parquet-train.parquet",  "filename": "parquet-train.parquet",  "size": 51736759 }], "pending": [], "failed": []}

特に、urlキーの値は、データセットをParquet形式でダウンロードできる場所を指定しています。この例では、その場所はhttps://huggingface.co/datasets/0-hero/OIG-small-chip2/resolve/refs%2Fconvert%2Fparquet/0-hero--OIG-small-chip2/parquet-train.parquetです。

データセットのプログラムによるダウンロード

今度は、DatasetsサーバーのREST APIを使用する方法を見てみましょう。データセットをプログラムでダウンロードする方法です。

Pythonでは、requestsライブラリを使用するのが最も簡単です:

import requestsr = requests.get("https://datasets-server.huggingface.co/parquet?dataset=0-hero/OIG-small-chip2")j = r.json()print(j)

json()関数の結果はPythonの辞書です:

{  'parquet_files': [    {      'dataset': '0-hero/OIG-small-chip2',      'config': '0-hero--OIG-small-chip2',       'split': 'train',       'url': 'https://huggingface.co/datasets/0-hero/OIG-small-chip2/resolve/refs%2Fconvert%2Fparquet/0-hero--OIG-small-chip2/parquet-train.parquet',       'filename': 'parquet-train.parquet',       'size': 51736759    }  ],   'pending': [],   'failed': []}

この辞書の結果を使用して、リスト内包表記を使用してParquet形式のデータセットのURLを見つけることができます:

urls = [f['url'] for f in j['parquet_files'] if f['split'] == 'train']urls

urls変数は、トレーニングセットのデータセットのURLのリストを含んでいます:

['https://huggingface.co/datasets/0-hero/OIG-small-chip2/resolve/refs%2Fconvert%2Fparquet/0-hero--OIG-small-chip2/parquet-train.parquet']

DuckDBを使用してParquetファイルをダウンロードする

DuckDBを使用して、実際にデータセットをリモートでロードすることができます。

DuckDBに初めて触れる場合は、この記事から基本を学ぶことができます:

データ分析のためのDuckDBの使用

SQLを使用してデータ分析を行う方法を学ぶ

levelup.gitconnected.com

まず、DuckDBをインストールしていない場合は、インストールしてください:

!pip install duckdb 

次に、DuckDBのインスタンスを作成し、httpfsをインストールします:

import duckdbcon = duckdb.connect()con.execute("INSTALL httpfs;")con.execute("LOAD httpfs;")

httpfs拡張機能は、リモートのファイルの読み取り/書き込みが可能なファイルシステムを実装するロード可能な拡張機能です。

httpfsがインストールされ、ロードされたら、SQLクエリを使用してHugging Face HubのParquetデータセットをロードできます:

con.sql(f'''    SELECT * from '{urls[0]}'''').df()

上記のdf()関数は、クエリの結果をPandasのDataFrameに変換します:

Image by author

Parquetの素晴らしい機能の1つは、Parquetが列指向の形式でファイルを保存することです。したがって、クエリが1つの列のみを要求する場合、要求された列のみがコンピュータにダウンロードされます:

con.sql(f'''    SELECT "user" from '{urls[0]}'''').df()

上記のクエリでは、「user」列のみがダウンロードされます:

Image by author

このParquetの機能は、特に大規模なデータセットには非常に便利です。必要な列のみをダウンロードすることで、時間とスペースを節約できます。

一部の場合では、データをダウンロードする必要さえありません。次のクエリを考えてみてください:

con.sql(f'''    SELECT count(*) from '{urls[0]}'''').df()
Image by author

このリクエストは、データセットのメタデータを読み取るだけで満たすことができるため、データをダウンロードする必要はありません。

DuckDBを使用して別のデータセット( **”mstz/heart_failure”** )をダウンロードする別の例です:

import requestsr = requests.get("https://datasets-server.huggingface.co/parquet?dataset=mstz/heart_failure")j = r.json()urls = [f['url'] for f in j['parquet_files'] if f['split'] == 'train']con.sql(f'''    SELECT "user" from '{urls[0]}'''').df()

このデータセットには299行と13列があります:

Image by author

age列に対して集計を行うこともできます:

con.sql(f"""    SELECT         SUM(IF(age<40,1,0)) AS 'Under 40',        SUM(IF(age BETWEEN 40 and 49,1,0)) AS '40-49',        SUM(IF(age BETWEEN 50 and 59,1,0)) AS '50-59',        SUM(IF(age BETWEEN 60 and 69,1,0)) AS '60-69',        SUM(IF(age BETWEEN 70 and 79,1,0)) AS '70-79',              SUM(IF(age BETWEEN 80 and 89,1,0)) AS '80-89',              SUM(IF(age>89,1,0)) AS 'Over 89',    FROM '{urls[0]}'""").df()

以下は結果です:

Image by author

結果を使用して、棒グラフを作成することもできます:

con.sql(f"""    SELECT         SUM(IF(age<40,1,0)) AS 'Under 40',        SUM(IF(age BETWEEN 40 and 49,1,0)) AS '40-49',        SUM(IF(age BETWEEN 50 and 59,1,0)) AS '50-59',        SUM(IF(age BETWEEN 60 and 69,1,0)) AS '60-69',        SUM(IF(age BETWEEN 70 and 79,1,0)) AS '70-79',              SUM(IF(age BETWEEN 80 and 89,1,0)) AS '80-89',              SUM(IF(age>89,1,0)) AS 'Over 89',    FROM '{urls[0]}'""").df().T.plot.bar(legend=False)
Image by author

Datasetsライブラリの使用

Hugging Faceでは、データを簡単かつ効率的に処理するために独自のDatasetsライブラリ(https://github.com/huggingface/datasets)が提供されています。

datasetsライブラリをインストールするには、pipコマンドを使用します:

!pip install datasets

load_dataset()関数は指定したデータセットをロードします:

from datasets import load_datasetdataset = load_dataset('0-hero/OIG-small-chip2',                       split='train')

データセットを初めてロードすると、データセット全体(Parquet形式)がコンピュータにダウンロードされます:

Image by author

返されるdatasetのデータの種類はdatasets.arrow_dataset.Datasetです。では、それをどのように使用できるのでしょうか?まず、Pandas DataFrameに変換することができます:

dataset.to_pandas()
Image by author

インデックスを使用してデータセットの最初の行を取得することもできます:

dataset[0]

これにより、データの最初の行が返されます:

{  'user': "遺言を持つのは良い考えだと聞いたことがあります。遺言とは何ですか?\n\n",  'chip2': "遺言は、あなたが亡くなった後に財産がどのように分配されるかを指定する法的な文書です。また、子供や他の扶養者を誰が世話するかを指定することもできます。遺言が有効かつ最新であることは重要です。遺言に関する法律は州によって異なるためです。"}

このdatasets.arrow_dataset.Datasetオブジェクトでできる他のこともたくさんありますが、詳しくは自分で探索してみてください。

データセットのストリーミング

大規模なデータセットを扱う場合、まずデータセット全体をコンピュータにダウンロードしてから操作することは現実的ではありません。前のセクションでは、load_dataset()関数を呼び出すことでデータセット全体がコンピュータにダウンロードされます:

Image by author

この特定のデータセットは82.2MBのディスク容量を使用しました。より大きなデータセットには、必要な時間とディスク容量が想像できます。

幸いにも、Datasetsライブラリはストリーミングをサポートしています。データセットのストリーミングは、データをダウンロードせずにデータセットと操作することができます。データはデータセットを反復処理する際にストリーミングされます。ストリーミングを使用するには、load_dataset()関数でstreamingパラメータをTrueに設定します:

from datasets import load_datasetdataset = load_dataset('0-hero/OIG-small-chip2',                       split='train',                        streaming=True)

datasetのタイプはdatasets.iterable_dataset.IterableDatasetになります。datasets.arrow_dataset.Datasetではなくなりました。では、どのように使用するのでしょうか?iter()関数を使用してiteratorオブジェクトを取得できます:

i = iter(dataset)

行を取得するには、next()関数を呼び出し、イテレータ内の次のアイテムを返します:

next(i)

すると、最初の行が辞書として表示されます:

{  'user': "遺言を持つのは良い考えだと聞いたことがあります。遺言とは何ですか?\n\n",  'chip2': "遺言は、あなたが亡くなった後に財産がどのように分配されるかを指定する法的な文書です。また、子供や他の扶養者を誰が世話するかを指定することもできます。遺言が有効かつ最新であることは重要です。遺言に関する法律は州によって異なるためです。"}

next() 関数を i に対して再度呼び出すと、次の行が返されます:

{  'user': 'どうやって仕事を見つけるのですか?\n\n',  'chip2': '仕事を見つける最善の方法は、スキル、経験、資格を強調した強力な履歴書とカバーレターを作成することです。また、専門分野のオンラインの求人情報を検索したり、地元の雇用主に直接連絡して利用可能な職種について問い合わせたりすることもできます。同じ分野や業界の人々とのネットワーキングも、雇用の機会を見つけるのに役立ちます。'}

などを続けます。

データセットのシャッフル

データセットをシャッフルするには、次のように dataset 変数に shuffle() 関数を使用することもできます:

shuffled_dataset = dataset.shuffle(seed = 42,                                    buffer_size = 500)

上記の例では、データセットが10,000行あるとします。 shuffle() 関数は、バッファ内の最初の500行からランダムに例を選択します。

デフォルトでは、バッファサイズは1,000です。

その他のタスク

ストリーミングを使用して、次のようなさまざまなタスクを実行することができます:

  • データセットの分割
  • データセットの交互挿入 — 各データセットの行を交互に組み合わせることで、2つのデータセットを結合する
  • データセットの列の変更
  • データセットのフィルタリング

詳細については、https://huggingface.co/docs/datasets/stream を参照してください。

私の記事を読んでくれて、キャリアや学習に役立った場合は、VoAGIメンバーとして登録することを検討してください。月額$5で、VoAGIの全ての記事(私の記事も含む)に無制限でアクセスできます。以下のリンクを使用して登録すると、私には小さな手数料が支払われます(追加費用はかかりません)。あなたのサポートは、私がこのような記事の執筆により多くの時間を割くことができることを意味します。

VoAGIメンバーとして、会費の一部があなたが読んだ作家に支払われ、すべてのストーリーに完全アクセスできます…

weimenglee.medium.com

概要

この記事では、Hugging Face Hub に保存されているデータセットにアクセスする方法を紹介しました。データセットは Parquet 形式で保存されているため、データセット全体をダウンロードする必要なく、リモートでデータセットにアクセスすることができます。DuckDB を使用するか、Hugging Face が提供する Datasets ライブラリを使用してデータセットにアクセスできます。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more