メインコンテンツへスキップ
機械学習ワークフローでモデル Artifacts をトラッキング、共有、管理するために、W&B をいつどのように使用するかを学びます。このページでは、実験のログ、レポートの生成、各タスクに適した W&B API を使用したログ済みデータへのアクセスについて説明します。 このチュートリアルでは、以下を使用します。
  • W&B Python SDK (wandb.sdk): トレーニング中に実験をログして監視するため。
  • W&B Public API (wandb.apis.public): ログされた実験データをクエリして分析するため。
  • W&B Reports and Workspaces API (wandb.wandb-workspaces): 調査結果を要約する Reports を作成するため。

サインアップしてAPIキーを発行する

W&B でお使いのマシンを認証するには、まず wandb.ai/settings で APIキーを発行する必要があります。APIキーをコピーして、安全に保管してください。

パッケージをインストールしてインポートする

この手順で使用する W&B ライブラリと、その他の必要なパッケージをインストールします。
pip install wandb
W&B Python SDK をインポートします:
import wandb
以下のコードブロックで、チームの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 でアカウントにログインします Projectsmy-awesome-project (または前の手順でプロジェクト名として使用した名前) が表示されます。これをクリックして、プロジェクトの Workspace に入ります。 ここでは、これまでに実行したすべての run の詳細を確認できます。このスクリーンショットでは、コードを数回再実行した結果、複数の run が生成されています。各 run にはランダムに生成された名前が付けられます。
run 名、メトリクス、ステータス情報を含む表ビューで複数の run が表示されている W&B プロジェクトページ

モデルを W&B レジストリ に公開する

組織内の他のメンバーとモデルを共有するには、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")
レジストリのクエリについて詳しくは、レジストリアイテムをクエリするを参照してください。