🤗 Hubでのスーパーチャージド検索
'🤗 Hubの高速検索'
huggingface_hub
ライブラリは、ホスティングエンドポイント(モデル、データセット、スペース)を探索するためのプログラム的なアプローチを提供する軽量なインタフェースです。
これまでは、このインタフェースを介してハブでの検索は難しく、ユーザーは「知っているだけ」で慣れなければならない多くの側面がありました。
この記事では、huggingface_hub
に追加されたいくつかの新機能を紹介し、ユーザーにJupyterやPythonインタフェースを離れずに使用したいモデルやデータセットを検索するためのフレンドリーなAPIを提供します。
- 🤗 Transformersを使用して、Wav2Vec2を使用して大規模なファイルで自動音声認識を行う方法
- Pythonを使用した感情分析の始め方
- 🤗 Transformersを使用して、画像分類のためにViTを微調整する
始める前に、システムに最新バージョンの
huggingface_hub
ライブラリがない場合は、次のセルを実行してください:
!pip install huggingface_hub -U
問題の位置づけ:
まず、自分がどのようなシナリオにいるか想像してみましょう。テキスト分類のためにハブでホストされているすべてのモデルを見つけたいとします。これらのモデルはGLUEデータセットでトレーニングされ、PyTorchと互換性があります。
https://huggingface.co/models を単に開いてそこにあるウィジェットを使用することもできます。しかし、これによりIDEを離れて結果をスキャンする必要がありますし、必要な情報を得るためにはいくつかのボタンクリックが必要です。
もしもIDEを離れずにこれを解決する方法があったらどうでしょうか?プログラム的なインタフェースであれば、ハブを探索するためのワークフローにも簡単に組み込めるかもしれません。
ここでhuggingface_hub
が登場します。
このライブラリに慣れている方は、すでにこの種のモデルを検索できることを知っているかもしれません。しかし、クエリを正しく取得することは試行錯誤の痛ましいプロセスです。
それを簡略化することはできるでしょうか?さあ、見てみましょう!
必要なものを見つける
まず、HfApi
をインポートします。これはHugging Faceのバックエンドホスティングと対話するのに役立つクラスです。モデル、データセットなどを通じて対話することができます。さらに、いくつかのヘルパークラスもインポートします:ModelFilter
とModelSearchArguments
from huggingface_hub import HfApi, ModelFilter, ModelSearchArguments
api = HfApi()
これらの2つのクラスは、上記の問題に対する解決策をフレーム化するのに役立ちます。 ModelSearchArguments
クラスは、検索できるすべての有効なパラメータを含むネームスペースのようなクラスです。
のぞいてみましょう:
>>> model_args = ModelSearchArguments()
>>> model_args
利用可能な属性またはキー:
* author
* dataset
* language
* library
* license
* model_name
* pipeline_tag
利用できるさまざまな属性がわかります(このマジックがどのように行われるかについては後ほど詳しく説明します)。私たちが求めるものをカテゴリー分けすると、おそらく以下のように分けることができるでしょう:
pipeline_tag
(またはタスク):テキスト分類dataset
:GLUElibrary
:PyTorch
このような分類を考えると、宣言したmodel_args
の中にそれらを見つけることができるはずです:
>>> model_args.pipeline_tag.TextClassification
'text-classification'
>>> model_args.dataset.glue
'dataset:glue'
>>> model_args.library.PyTorch
'pytorch'
しかし、ここでいくつかの便利なラッピングが行われていることに気付き始めます。 ModelSearchArguments
(および補完されるDatasetSearchArguments
)は、APIが求める形式化された出力に合わせた人間が読みやすいインタフェースを持っており、GLUEデータセットをdataset:glue
で検索する方法などが含まれます。
これが重要です。なぜなら、特定のパラメータをどのように記述すればよいかを知らない場合、APIでモデルを検索しようとしている間に非常に簡単にイライラすることができるからです!
正しいパラメータがわかったので、簡単にAPIを検索できます:
>>> models = api.list_models(filter = (
>>> model_args.pipeline_tag.TextClassification,
>>> model_args.dataset.glue,
>>> model_args.library.PyTorch)
>>> )
>>> print(len(models))
140
私たちの基準に合致する140個の一致するモデルが見つかりました!(この記事を書いた時点での情報です)。そして、1つをより詳しく見てみると、確かに正しいようです:
>>> models[0]
ModelInfo: {
modelId: Jiva/xlm-roberta-large-it-mnli
sha: c6e64469ec4aa17fedbd1b2522256f90a90b5b86
lastModified: 2021-12-10T14:56:38.000Z
tags: ['pytorch', 'xlm-roberta', 'text-classification', 'it', 'dataset:multi_nli', 'dataset:glue', 'arxiv:1911.02116', 'transformers', 'tensorflow', 'license:mit', 'zero-shot-classification']
pipeline_tag: zero-shot-classification
siblings: [ModelFile(rfilename='.gitattributes'), ModelFile(rfilename='README.md'), ModelFile(rfilename='config.json'), ModelFile(rfilename='pytorch_model.bin'), ModelFile(rfilename='sentencepiece.bpe.model'), ModelFile(rfilename='special_tokens_map.json'), ModelFile(rfilename='tokenizer.json'), ModelFile(rfilename='tokenizer_config.json')]
config: None
private: False
downloads: 680
library_name: transformers
likes: 1
}
これは少し読みやすくなり、”このパラメータは正しいかどうか”を推測する必要はありません。
このモデルのモデルIDを使用してプログラムで情報を取得することもできることをご存知でしたか? 以下はその方法です:
api.model_info('Jiva/xlm-roberta-large-it-mnli')
更に向上させる
Hubを検索するときに推測作業を排除するために、ModelSearchArguments
とDatasetSearchArguments
を使用する方法を見ましたが、非常に複雑で乱雑なクエリを持っている場合はどうでしょうか?
以下のようなクエリです:「text-classification
とzero-shot
の両方でトレーニングされ、Multi NLIとGLUEデータセットでトレーニングされ、PyTorchとTensorFlowの両方と互換性があるモデルをすべて検索したい」。
このクエリを設定するために、ModelFilter
クラスを使用します。これは、このような状況を処理するために設計されているため、頭を悩ませる必要はありません:
>>> filt = ModelFilter(
>>> task = ["text-classification", "zero-shot-classification"],
>>> trained_dataset = [model_args.dataset.multi_nli, model_args.dataset.glue],
>>> library = ['pytorch', 'tensorflow']
>>> )
>>> api.list_models(filt)
[ModelInfo: {
modelId: Jiva/xlm-roberta-large-it-mnli
sha: c6e64469ec4aa17fedbd1b2522256f90a90b5b86
lastModified: 2021-12-10T14:56:38.000Z
tags: ['pytorch', 'xlm-roberta', 'text-classification', 'it', 'dataset:multi_nli', 'dataset:glue', 'arxiv:1911.02116', 'transformers', 'tensorflow', 'license:mit', 'zero-shot-classification']
pipeline_tag: zero-shot-classification
siblings: [ModelFile(rfilename='.gitattributes'), ModelFile(rfilename='README.md'), ModelFile(rfilename='config.json'), ModelFile(rfilename='pytorch_model.bin'), ModelFile(rfilename='sentencepiece.bpe.model'), ModelFile(rfilename='special_tokens_map.json'), ModelFile(rfilename='tokenizer.json'), ModelFile(rfilename='tokenizer_config.json')]
config: None
private: False
downloads: 680
library_name: transformers
likes: 1
}]
非常に迅速にわかりますが、APIを検索するためのより協調したアプローチであり、あなたに頭痛の種を追加しません!
これは何ですか?
非常に簡単に、この列挙型ディクショナリのようなデータ型であるAttributeDictionary
によって提供される仕組みについて話します。
fastcoreライブラリのAttrDict
クラスに強くインスパイアされたこのアイデアの一般的なアイデアは、通常のディクショナリを取り、ディクショナリ内のすべてのキーに対してタブ補完を提供することによって探索的なプログラミングを超高速化することです。
前述のように、model_args.dataset.glue
のように探索できるネストされたディクショナリがある場合、これはさらに強力になります!
JavaScriptに詳しい方には、
object
クラスの動作を模倣しています。
このシンプルなユーティリティクラスは、ネストされたデータ型を探索し理解しようとする際に、APIリクエストの返り値など、そこにあるものをよりユーザー中心のエクスペリエンスを提供することができます。
前述のように、AttrDict
をいくつかの重要な方法で拡張しています:
del model_args[key]
またはdel model_args.key
でキーを削除できます- 前述で見たきれいな
__repr__
ただし、非常に重要な概念として、キーに数字や特殊文字が含まれている場合は、オブジェクトとしてではなく、ディクショナリとしてインデックス化する必要があるということです。
>>> from huggingface_hub.utils.endpoint_helpers import AttributeDictionary
これに関する非常に簡単な例は、キーが3_c
のAttributeDictionary
がある場合です:
>>> d = {"a":2, "b":3, "3_c":4}
>>> ad = AttributeDictionary(d)
>>> # 属性として
>>> ad.3_c
File "<ipython-input-6-c0fe109cf75d>", line 2
ad.3_c
^
SyntaxError: invalid token
>>> # ディクショナリのキーとして
>>> ad["3_c"]
4
まとめ
これで、この新しい検索APIがハブのワークフローと探索にどのように直接影響を与えるかについて、おおまかな理解ができることを願っています!これに加えて、AttributeDictionary
があなたにとって有用な場所をコード内で知っているかもしれません。
ここからは、ハブの効率的な検索に関する公式ドキュメントを確認し、私たちにスターを与えることを忘れないでください!
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles