機械学習ワークフローでモデル Artifacts をトラッキング、共有、管理するために、W&B をいつどのように使用するかを学びます。このページでは、実験のログ、レポートの生成、各タスクに適した W&B API を使用したログ済みデータへのアクセスについて説明します。
このチュートリアルでは、以下を使用します。
W&B でお使いのマシンを認証するには、まず wandb.ai/settings で APIキーを発行する必要があります。APIキーをコピーして、安全に保管してください。
この手順で使用する W&B ライブラリと、その他の必要なパッケージをインストールします。
W&B Python SDK をインポートします:
以下のコードブロックで、チームのentityを指定してください。
TEAM_ENTITY = "<Team_Entity>" # チーム entityを置き換えてください
PROJECT = "my-awesome-project"
次のコードは、基本的な機械学習ワークフローをシミュレートしています。モデルをトレーニングし、メトリクスをログし、モデルをアーティファクトとして保存します。
トレーニング中に W&B と連携するには、W&B Python SDK (wandb.sdk) を使用します。wandb.Run.log() を使用して損失をログし、次に wandb.Artifact を使用してトレーニング済みモデルをアーティファクトとして保存してから、最後に Artifact.add_file を使用してモデルファイルを追加します。
import random # データのシミュレーション用
def model(training_data: int) -> int:
"""デモ用のモデルシミュレーション。"""
return training_data * 2 + random.randint(-1, 1)
# 重みとノイズのシミュレーション
weights = random.random() # ランダムな重みを初期化
noise = random.random() / 5 # ノイズをシミュレートするための小さなランダムノイズ
# ハイパーパラメーターと設定
config = {
"epochs": 10, # トレーニングのエポック数
"learning_rate": 0.01, # オプティマイザーの学習率
}
# コンテキストマネージャーを使用してW&B runsを初期化・終了する
with wandb.init(project=PROJECT, entity=TEAM_ENTITY, config=config) as run:
# トレーニングループのシミュレーション
for epoch in range(config["epochs"]):
xb = weights + noise # シミュレートされた入力トレーニングデータ
yb = weights + noise * 2 # シミュレートされたターゲット出力(入力ノイズの2倍)
y_pred = model(xb) # モデルの予測
loss = (yb - y_pred) ** 2 # 平均二乗誤差損失
print(f"epoch={epoch}, loss={loss}")
# エポックと損失をW&Bにログする
run.log({
"epoch": epoch,
"loss": loss,
})
# モデルartifactの一意の名前
model_artifact_name = f"model-demo"
# シミュレートされたモデルファイルの保存先ローカルパス
PATH = "model.txt"
# モデルをローカルに保存する
with open(PATH, "w") as f:
f.write(str(weights)) # モデルの重みをファイルに保存する
# artifactオブジェクトを作成する
# ローカルに保存したモデルをartifactオブジェクトに追加する
artifact = wandb.Artifact(name=model_artifact_name, type="model", description="トレーニング済みモデル")
artifact.add_file(local_path=PATH)
artifact.save()
前のコードブロックの主なポイントは次のとおりです。
- トレーニング中にメトリクスをログするには、
wandb.Run.log() を使用します。
- モデル (データセットなど) を アーティファクト として W&B プロジェクトに保存するには、
wandb.Artifact を使用します。
モデルをトレーニングして アーティファクト として保存したら、W&B のレジストリに公開できます。wandb.Run.use_artifact() を使用してプロジェクトから アーティファクト を取得し、Model registry で公開できるように準備します。wandb.Run.use_artifact() には主に次の 2 つの目的があります。
- プロジェクトから アーティファクト オブジェクトを取得します。
- アーティファクト を run への入力としてマークし、再現性とトレーサビリティを確保します。詳細は リネージ マップを作成して表示する を参照してください.
https://wandb.ai/login でアカウントにログインします
Projects に my-awesome-project (または前の手順でプロジェクト名として使用した名前) が表示されます。これをクリックして、プロジェクトの Workspace に入ります。
ここでは、これまでに実行したすべての run の詳細を確認できます。このスクリーンショットでは、コードを数回再実行した結果、複数の run が生成されています。各 run にはランダムに生成された名前が付けられます。
組織内の他のメンバーとモデルを共有するには、wandb.Run.link_artifact() を使用して コレクション に公開します。次のコードは、アーティファクトを レジストリ にリンクして、チームからアクセスできるようにします。
# Artifact名はチームのプロジェクト内の特定のartifactバージョンを指定します
artifact_name = f'{TEAM_ENTITY}/{PROJECT}/{model_artifact_name}:v0'
print("Artifact name: ", artifact_name)
REGISTRY_NAME = "Model" # W&BのRegistry名
COLLECTION_NAME = "DemoModels" # Registry内のcollection名
# Registry内のartifactのターゲットパスを作成する
target_path = f"wandb-registry-{REGISTRY_NAME}/{COLLECTION_NAME}"
print("Target path: ", target_path)
with wandb.init(entity=TEAM_ENTITY, project=PROJECT) as run:
model_artifact = run.use_artifact(artifact_or_name=artifact_name, type="model")
run.link_artifact(artifact=model_artifact, target_path=target_path)
wandb.Run.link_artifact() を実行すると、モデル アーティファクト はレジストリ内の DemoModels コレクションに追加されます。そこから、バージョン履歴、リネージ マップ、その他のメタデータなどの詳細を確認できます。
アーティファクト をレジストリにリンクする方法の詳細については、アーティファクト をレジストリにリンクするを参照してください。
推論用にレジストリからモデルのアーティファクトを取得する
推論にモデルを使用するには、wandb.Run.use_artifact() を使用して、公開済みのアーティファクトをレジストリから取得します。これによりアーティファクトオブジェクトが返され、その後 wandb.Artifact.download() を使用してアーティファクトをローカルファイルにダウンロードできます。
REGISTRY_NAME = "Model" # W&B のレジストリ名
COLLECTION_NAME = "DemoModels" # レジストリ内のコレクション名
VERSION = 0 # 取得する artifact のバージョン
model_artifact_name = f"wandb-registry-{REGISTRY_NAME}/{COLLECTION_NAME}:v{VERSION}"
print(f"モデル artifact 名: {model_artifact_name}")
with wandb.init(entity=TEAM_ENTITY, project=PROJECT) as run:
registry_model = run.use_artifact(artifact_or_name=model_artifact_name)
local_model_path = registry_model.download()
レジストリからアーティファクトを取得する方法の詳細については、レジストリからアーティファクトをダウンロードするを参照してください。
使用する機械学習フレームワークによっては、重みを読み込む前にモデルのアーキテクチャを再構築する必要がある場合があります。具体的な手順は、使用するフレームワークとモデルによって異なるため、ここでは省略します。
W&B Report and Workspace API はパブリックプレビューです。
作業内容を要約するには、Reports を作成して共有します。プログラムでReportsを作成するには、W&B Report and Workspace API を使用します。
まず、W&B Reports API をインストールします。
pip install wandb wandb-workspaces -qqq
次のコードブロックは、Markdown、パネルグリッドなどを含む複数のブロックで構成されたレポートを作成します。さらにブロックを追加したり、既存のブロックの内容を変更したりして、レポートをカスタマイズできます。
コードブロックの出力には、作成されたレポートの URL へのリンクが表示されます。このリンクをブラウザで開くと、レポートを表示できます。
import wandb_workspaces.reports.v2 as wr
experiment_summary = """This is a summary of the experiment conducted to train a simple model using W&B."""
dataset_info = """The dataset used for training consists of synthetic data generated by a simple model."""
model_info = """The model is a simple linear regression model that predicts output based on input data with some noise."""
report = wr.Report(
project=PROJECT,
entity=TEAM_ENTITY,
title="My Awesome Model Training Report",
description=experiment_summary,
blocks= [
wr.TableOfContents(),
wr.H2("Experiment Summary"),
wr.MarkdownBlock(text=experiment_summary),
wr.H2("Dataset Information"),
wr.MarkdownBlock(text=dataset_info),
wr.H2("Model Information"),
wr.MarkdownBlock(text = model_info),
wr.PanelGrid(
panels=[
wr.LinePlot(title="Train Loss", x="Step", y=["loss"], title_x="Step", title_y="Loss")
],
),
]
)
# レポートをW&Bに保存する
report.save()
プログラムでレポートを作成する方法や、W&B App を使ってインタラクティブにレポートを作成する方法について詳しくは、W&B Docs の Developer guide にある レポートを作成する を参照してください。
W&B Public APIs を使用すると、W&B の履歴データをクエリし、分析、管理できます。これは、アーティファクト のリネージを追跡したり、異なるバージョンを比較したり、モデルのパフォーマンスを経時的に分析したりする際に役立ちます。
次のコードブロックは、特定のコレクション内にあるすべての アーティファクト について、Model レジストリをクエリする方法を示しています。コレクションを取得し、そのバージョンを順に処理して、各 アーティファクト の名とバージョンを出力します。
import wandb
# wandb APIを初期化する
api = wandb.Api()
# 文字列 `model` を含み、タグ `text-classification` または
# エイリアス `latest` を持つすべてのartifactバージョンを検索する
registry_filters = {
"name": {"$regex": "model"}
}
# 論理演算子 $or を使用してartifactバージョンをフィルタリングする
version_filters = {
"$or": [
{"tag": "text-classification"},
{"alias": "latest"}
]
}
# フィルターに一致するすべてのartifactバージョンのイテラブルを返す
artifacts = api.registries(filter=registry_filters).collections().versions(filter=version_filters)
# 見つかった各artifactの名前、コレクション、エイリアス、タグ、作成日時を出力する
for art in artifacts:
print(f"artifact name: {art.name}")
print(f"collection artifact belongs to: { art.collection.name}")
print(f"artifact aliases: {art.aliases}")
print(f"tags attached to artifact: {art.tags}")
print(f"artifact created at: {art.created_at}\n")
レジストリのクエリについて詳しくは、レジストリアイテムをクエリするを参照してください。