Skopsの紹介
Skops介绍
Skopsの紹介
Hugging Faceでは、オープンソースの機械学習に関するさまざまな問題に取り組んでおり、モデルの安全なホスティングや公開、再現性、説明可能性、コラボレーションなどを可能にしています。私たちは、新しいライブラリ「Skops」をご紹介できることを大変嬉しく思っています!Skopsを使用すると、scikit-learnモデルをHugging Face Hubにホストしたり、モデルのドキュメント用のモデルカードを作成したり、他の人と共同作業したりすることができます。
まず、モデルをトレーニングしてから、Skopsを使用してステップバイステップでsklearnを本番環境で活用する方法を見ていきましょう。
# ライブラリをインポートしましょう
import sklearn
from sklearn.datasets import load_breast_cancer
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
# データをロードして分割します
X, y = load_breast_cancer(as_frame=True, return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
# モデルをトレーニングします
model = DecisionTreeClassifier().fit(X_train, y_train)
モデルのファイル名やシリアライズ方法は、pickleやjoblibなどの任意の方法を使用できます。現時点では、私たちのバックエンドではモデルの読み込みにjoblibを使用しています。 hub_utils.init
は、指定されたパスにモデルがトレーニングされた環境の仕様を含む設定ファイルを作成し、モデルを含むローカルフォルダを作成します。 init
に渡されたデータとタスクは、Hugging Face Hubがモデルページでの推論ウィジェットを有効にし、モデルを見つけるための機能を提供するのに役立ちます。
from skops import hub_utils
import pickle
# モデルを保存しましょう
model_path = "example.pkl"
local_repo = "my-awesome-model"
with open(model_path, mode="bw") as f:
pickle.dump(model, file=f)
# ローカルリポジトリを初期化します
hub_utils.init(
model=model_path,
requirements=[f"scikit-learn={sklearn.__version__}"],
dst=local_repo,
task="tabular-classification",
data=X_test,
)
リポジトリには、シリアライズされたモデルと設定ファイルが含まれています。設定には以下の情報が含まれています:
- transformers、accelerate、bitsandbytesを使用した大規模トランスフォーマーの8ビット行列乗算へのやさしい入門
- 🤗 ViTをVertex AIに展開する
- Hugging Face TransformersとHabana Gaudiを使用して、BERTを事前に学習する
- モデルの特徴
- モデルの要件
X_test
から取得した例の入力データ- モデルファイルの名前
- ここで解決するタスクの名前
次に、モデルカードを作成します。モデルカードは、Hugging Face Hubの期待する形式に一致する必要があります。これは、マークダウン部分とメタデータセクション(先頭のyaml
セクション)で構成されます。メタデータセクションのキーはこちらで定義され、モデルの検索性を向上させるために使用されます。モデルカードの内容は、skops
で使用するテンプレートによって決まります:
- メタデータ用の先頭に
yaml
セクション(モデルライセンス、ライブラリ名など) - 自由なテキストと埋めるセクション(モデルの簡単な説明など)を持つマークダウンセクション。次のセクションは、モデルカードに埋めるために
skops
によって抽出されます: - モデルのハイパーパラメータ
- モデルのインタラクティブなダイアグラム
- メタデータには、ライブラリ名、タスク識別子(たとえば、表形式の分類)、推論ウィジェットが必要な情報が埋められます。
モデルカードに情報をプログラムで渡す方法を説明します。デフォルトのテンプレートについては、skops
が提供するドキュメントやセクションを参照して、テンプレートが期待するものやどのようなものかを確認できます。
モデルのシリアライズ時に、タスク名とライブラリ名が設定ファイルに書き込まれます。この情報は、モデルカードのメタデータでも必要です。そのため、metadata_from_config
メソッドを使用して設定ファイルからメタデータを抽出し、カードの作成時に渡すことができます。 add
を使用して情報とメタデータを追加できます。
from skops import card
# カードを作成します
model_card = card.Card(model, metadata=card.metadata_from_config(Path(destination_folder)))
limitations = "このモデルは本番での使用にはまだ準備ができていません。"
model_description = "これは乳がんデータセットでトレーニングされたDecisionTreeClassifierモデルです。"
model_card_authors = "skops_user"
get_started_code = "import pickle \nwith open(dtc_pkl_filename, 'rb') as file: \n clf = pickle.load(file)"
citation_bibtex = "bibtex\n@inproceedings{...,year={2020}}"
# addを使用して情報を追加できます
model_card.add(
citation_bibtex=citation_bibtex,
get_started_code=get_started_code,
model_card_authors=model_card_authors,
limitations=limitations,
model_description=model_description,
)
# メタデータ部分を直接設定できます
model_card.metadata.license = "mit"
モデルを評価し、評価方法の説明をadd
で追加します。メトリクスはadd_metrics
で追加され、テーブルにパースされます。
from sklearn.metrics import (ConfusionMatrixDisplay, confusion_matrix,
accuracy_score, f1_score)
# 予測を行い、モデルを評価する
y_pred = model.predict(X_test)
# add_metricsを使用してメトリクスを渡し、addで詳細を渡すことができます
model_card.add(eval_method="モデルはテストの分割を使用して評価され、マクロ平均に基づいて正解率とF1スコアが計算されます。")
model_card.add_metrics(accuracy=accuracy_score(y_test, y_pred))
model_card.add_metrics(**{"f1スコア": f1_score(y_test, y_pred, average="micro")})
add_plot
を使用して、カードに任意のプロットを追加することもできます。
import matplotlib.pyplot as plt
from pathlib import Path
# 混同行列を作成します
cm = confusion_matrix(y_test, y_pred, labels=model.classes_)
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=model.classes_)
disp.plot()
# プロットを保存します
plt.savefig(Path(local_repo) / "confusion_matrix.png")
# プロットはconfusion_matrixという名前でモデルカードに書き込まれます
# プロットのパスを渡します
model_card.add_plot(confusion_matrix="confusion_matrix.png")
モデルカードをローカルリポジトリに保存しましょう。ここではファイル名をREADME.md
にする必要があります。これはHugging Face Hubが期待するものです。
model_card.save(Path(local_repo) / "README.md")
ローカルリポジトリをHugging Face Hubにプッシュできるようになりました。これにはhub_utils
のpush
を使用します。Hugging Face Hubでは認証にトークンが必要ですので、ノートブックからログインする場合はnotebook_login
、CLIからログインする場合はhuggingface-cli login
にトークンを渡してください。
# リポジトリがHugging Face Hub上に存在しない場合、create_remoteをTrueに設定すると作成されます
repo_id = "skops-user/my-awesome-model"
hub_utils.push(
repo_id=repo_id,
source=local_repo,
token=token,
commit_message="pushing files to the repo from the example!",
create_remote=True,
)
モデルをHubにプッシュすると、リポジトリがプライベートでない限り、誰でも使用することができます。モデルはdownload
を使用してダウンロードできます。モデルファイル以外にも、リポジトリにはモデルの設定と環境要件が含まれています。
download_repo = "downloaded-model"
hub_utils.download(repo_id=repo_id, dst=download_repo)
リポジトリ内で予測を行うために、推論ウィジェットが有効になっています。
プロジェクトの要件が変更された場合、update_env
を使用して環境を更新することができます。
hub_utils.update_env(path=local_repo, requirements=["scikit-learn"])
上記のコードでプッシュされた例のリポジトリはこちらでご覧いただけます。モデルを保存し、モデルカードユーティリティを使用する方法を示すために、2つの例を準備しました。リソースセクションで見つけることができます。
リソース
- モデルカードのチュートリアル
- hub_utilsのチュートリアル
- skopsのドキュメント
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