Metaflow

W&B と Metaflow を統合する方法。

概要

Metaflow は、Netflixが開発したMLワークフローを作成し実行するためのフレームワークです。

このインテグレーションにより、ユーザーはMetaflowのステップとフローにデコレータを適用して、W&Bにパラメータとアーティファクトを自動的にログすることができます。

  • ステップをデコレートすると、そのステップ内の特定のタイプに対してログのオンまたはオフが適用されます。
  • フローをデコレートすると、フロー内のすべてのステップに対してログのオンまたはオフが適用されます。

クイックスタート

サインアップしてAPIキーを作成する

APIキーはあなたのマシンをW&Bに認証します。ユーザープロフィールからAPIキーを生成することができます。

  1. 右上のユーザープロフィールアイコンをクリックします。
  2. User Settingsを選択し、API Keysセクションまでスクロールします。
  3. Revealをクリックし、表示されたAPIキーをコピーします。ページをリロードするとAPIキーを隠すことができます。

wandbライブラリをインストールしてログインする

ローカルにwandbライブラリをインストールし、ログインするためには次の手順を行います。

  1. WANDB_API_KEY 環境変数をAPIキーに設定します。

    export WANDB_API_KEY=<your_api_key>
    
  2. wandbライブラリをインストールしてログインします。

    pip install -Uqqq metaflow fastcore wandb
    
    wandb login
    
pip install -Uqqq metaflow fastcore wandb
import wandb
wandb.login()
!pip install -Uqqq metaflow fastcore wandb

import wandb
wandb.login()

フローとステップをデコレートする

ステップをデコレートすることで、そのステップ内の特定のタイプに対してログのオンまたはオフが適用されます。

この例では、startにおける全てのデータセットとモデルがログされます。

from wandb.integration.metaflow import wandb_log

class WandbExampleFlow(FlowSpec):
    @wandb_log(datasets=True, models=True, settings=wandb.Settings(...))
    @step
    def start(self):
        self.raw_df = pd.read_csv(...).    # pd.DataFrame -> データセットとしてアップロード
        self.model_file = torch.load(...)  # nn.Module    -> モデルとしてアップロード
        self.next(self.transform)

フローをデコレートすることは、すべての構成ステップをデフォルトでデコレートすることに相当します。

この場合、WandbExampleFlowのすべてのステップは、各ステップを @wandb_log(datasets=True, models=True)でデコレートするのと同様に、デフォルトでデータセットとモデルをログします。

from wandb.integration.metaflow import wandb_log

@wandb_log(datasets=True, models=True)  # すべての@stepをデコレート
class WandbExampleFlow(FlowSpec):
    @step
    def start(self):
        self.raw_df = pd.read_csv(...).    # pd.DataFrame -> データセットとしてアップロード
        self.model_file = torch.load(...)  # nn.Module    -> モデルとしてアップロード
        self.next(self.transform)

フローをデコレートすることは、すべてのステップをデフォルトでデコレートすることを意味します。つまり、後でステップを別の@wandb_logでデコレートすると、フローレベルのデコレーションが上書きされます。

この例では:

  • startmidは両方、データセットとモデルをログします。
  • endは、データセットもモデルもログしません。
from wandb.integration.metaflow import wandb_log

@wandb_log(datasets=True, models=True)  # startとmidをデコレートするのと同じ
class WandbExampleFlow(FlowSpec):
  # このステップはデータセットとモデルをログします
  @step
  def start(self):
    self.raw_df = pd.read_csv(...).    # pd.DataFrame -> データセットとしてアップロード
    self.model_file = torch.load(...)  # nn.Module    -> モデルとしてアップロード
    self.next(self.mid)

  # このステップもデータセットとモデルをログします
  @step
  def mid(self):
    self.raw_df = pd.read_csv(...).    # pd.DataFrame -> データセットとしてアップロード
    self.model_file = torch.load(...)  # nn.Module    -> モデルとしてアップロード
    self.next(self.end)

  # このステップは上書きされており、データセットもモデルもログしません
  @wandb_log(datasets=False, models=False)
  @step
  def end(self):
    self.raw_df = pd.read_csv(...).    
    self.model_file = torch.load(...)

データへプログラムでアクセスする

キャプチャされた情報には3つの方法でアクセスできます: wandbクライアントライブラリを使用してオリジナルのPythonプロセス内でログされたもの、ウェブアプリUI、あるいはパブリックAPIをプログラムで使用する方法です。パラメータはW&Bのconfigに保存され、Overviewタブで見つけることができます。datasetsmodels、およびその他はW&B Artifactsに保存され、Artifactsタブで見つけることができます。基本的なPythonタイプはW&Bのsummaryディクショナリに保存され、Overviewタブで見ることができます。これらの情報を外部からプログラムで取得する方法の詳細については、パブリックAPIのガイドをご覧ください。

クイックリファレンス

データ クライアントライブラリ UI
Parameter(...) wandb.config Overviewタブ, Config
datasets, models, others wandb.use_artifact("{var_name}:latest") Artifactsタブ
基本的なPython型 (dict, list, str, etc.) wandb.summary Overviewタブ, Summary

wandb_log引数

kwarg オプション
datasets
  • True: インスタンス変数がデータセットの場合にログする
  • False
models
  • True: インスタンス変数がモデルの場合にログする
  • False
others
  • True: pickleとしてシリアライズ可能なその他のものをログする
  • False
settings
  • wandb.Settings(…): このステップまたはフローのために独自のwandb設定を指定する
  • None: wandb.Settings()を渡すのと同じ

デフォルトでは、もし:

  • settings.run_groupNoneであれば、{flow_name}/{run_id}に設定されます
  • settings.run_job_typeNoneであれば、{run_job_type}/{step_name}に設定されます

よくある質問

正確には何をログしますか?すべてのインスタンスとローカル変数をログしますか?

wandb_logはインスタンス変数のみをログします。ローカル変数は決してログされません。これは不要なデータをログしないために役立ちます。

どのようなデータ型がログされますか?

現在、以下のタイプをサポートしています:

ログ設定
デフォルト(常にオン)
  • dict, list, set, str, int, float, bool
datasets
  • pd.DataFrame
  • pathlib.Path
models
  • nn.Module
  • sklearn.base.BaseEstimator
others
  • pickle-ableでありJSONシリアライズ可能なもの

どのようにログの振る舞いを設定できますか?

変数の種類 振る舞い データ型
インスタンス 自動ログされる self.accuracy float
インスタンス datasets=Trueの場合にログ self.df pd.DataFrame
インスタンス datasets=Falseの場合はログされない self.df pd.DataFrame
ローカル ログされない accuracy float
ローカル ログされない df pd.DataFrame

アーティファクトのリネージは追跡されますか?

はい。ステップAの出力であり、ステップBの入力であるアーティファクトがあれば、リネージDAGを自動的に構築します。

この振る舞いの例については、このノートブックおよび対応する W&B Artifactsページをご覧ください。