Metaflow

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

概要

Metaflow は、ML ワークフローを作成および実行するために Netflix によって作成されたフレームワークです。

このインテグレーションを使用すると、Metaflow の ステップとフロー にデコレータを適用して、パラメータと Artifacts を自動的に 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 内のすべての Datasets と Models がログ記録されます。

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 -> upload as dataset
        self.model_file = torch.load(...)  # nn.Module    -> upload as model
        self.next(self.transform)

フローをデコレートすることは、すべての構成ステップをデフォルトでデコレートすることと同じです。

この場合、WandbExampleFlow のすべてのステップは、Datasets と Models をデフォルトでログ記録します。これは、各ステップを @wandb_log(datasets=True, models=True) でデコレートするのと同じです。

from wandb.integration.metaflow import wandb_log

@wandb_log(datasets=True, models=True)  # decorate all @step 
class WandbExampleFlow(FlowSpec):
    @step
    def start(self):
        self.raw_df = pd.read_csv(...).    # pd.DataFrame -> upload as dataset
        self.model_file = torch.load(...)  # nn.Module    -> upload as model
        self.next(self.transform)

フローをデコレートすることは、すべてのステップをデフォルトでデコレートすることと同じです。つまり、後で別の @wandb_log でステップをデコレートすると、フローレベルのデコレーションがオーバーライドされます。

この例では:

  • startmid は Datasets と Models の両方をログ記録します。
  • end は Datasets も Models もログ記録しません。
from wandb.integration.metaflow import wandb_log

@wandb_log(datasets=True, models=True)  # same as decorating start and mid
class WandbExampleFlow(FlowSpec):
  # this step will log datasets and models
  @step
  def start(self):
    self.raw_df = pd.read_csv(...).    # pd.DataFrame -> upload as dataset
    self.model_file = torch.load(...)  # nn.Module    -> upload as model
    self.next(self.mid)

  # this step will also log datasets and models
  @step
  def mid(self):
    self.raw_df = pd.read_csv(...).    # pd.DataFrame -> upload as dataset
    self.model_file = torch.load(...)  # nn.Module    -> upload as model
    self.next(self.end)

  # this step is overwritten and will NOT log datasets OR models
  @wandb_log(datasets=False, models=False)
  @step
  def end(self):
    self.raw_df = pd.read_csv(...).    
    self.model_file = torch.load(...)

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

キャプチャした情報には、次の 3 つの方法でアクセスできます。wandb クライアントライブラリ を使用してログ記録されている元の Python プロセス内、web アプリ UI を使用、または Public API を使用してプログラムでアクセスできます。Parameter は W&B の config に保存され、Overview タブ にあります。datasetsmodels、および othersW&B Artifacts に保存され、Artifacts タブ にあります。Base python タイプは W&B の summary 辞書に保存され、Overview タブにあります。API を使用してこの情報を外部からプログラムで取得する方法の詳細については、Public API のガイド を参照してください。

クイックリファレンス

データ クライアントライブラリ UI
Parameter(...) wandb.config Overview タブ, Config
datasetsmodelsothers wandb.use_artifact("{var_name}:latest") Artifacts タブ
Base Python タイプ (dictliststr など) wandb.summary Overview タブ, Summary

wandb_log kwargs

kwarg オプション
datasets
  • True: データセットであるインスタンス変数をログに記録します
  • False
models
  • True: モデルであるインスタンス変数をログに記録します
  • False
others
  • True: シリアル化可能なものをピクルとしてログに記録します
  • 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

ログ記録の振る舞いを構成するにはどうすればよいですか?

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

Artifacts のリネージは追跡されますか?

はい。Artifact がステップ A の出力であり、ステップ B の入力である場合、リネージ DAG が自動的に構築されます。

この振る舞いの例については、この notebook と対応する W&B Artifacts ページ を参照してください。