Metaflow
概要
Metaflowは、Netflixによって開発されたMLワークフローを作成および実行するためのフレームワークです。
この連携により、ユーザーは Metaflow のステップとフローにデコレータを適用して、パラメータやアーティファクトをW&Bに自動的にログすることができます。
- ステップにデコレータを適用することで、そのステップ内の特定のタイプのログの有効化または無効化が可能です。
- フローにデコレータを適用することで、フロー内のすべてのステップのログの有効化または無効化が可能です。
クイックスタート
W&Bをインストールし、ログインする
- ノートブック
- コマンドライン
!pip install -Uqqq metaflow fastcore wandb
import wandb
wandb.login()
pip install -Uqqq metaflow fastcore 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)
以下の例では:
start
とmid
はデータセットとモデルをログに記録しますが、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つの方法でアクセスできます:ログに使用されているオリジナルのPythonプロセス内のwandb
クライアントライブラリ、WebアプリのUI、またはパブリックAPIを使ってプログラムで。 Parameter
はW&Bのconfig
に保存され、概要タブで見つけることができます。datasets
、models
、others
はW&Bアーティファクトに保存され、アーティファクトタブで見つけることができます。基本的なPythonの型はW&Bのsummary
辞書に保存され、概要タブで見つけることができます。プログラムでこの情報を取得する方法については、パブリックAPIのガイドを参照してください。
以下はチートシートです:
データ | クライアントライブラリ | UI |
---|---|---|
Parameter(...) | wandb.config | 概要タブ, コンフィグ |
datasets , models , others | wandb.use_artifact("{var_name}:latest") | アーティファクトタブ |
基本的なPythonの型(dict 、list 、str など) | wandb.summary | 概要タブ, サマリー |
wandb_log
kwargs
kwarg | オプション |
---|---|
datasets |
|
models |
|
others |
|
settings |
デフォルトでは、以下の場合:
|
よくある質問
具体的に何をログに記録しますか?インスタンス変数とローカル変数のすべてをログに記録しますか?
wandb_log
はインスタンス変数のみを記録します。ローカル変数は決して記録されません。これにより、不要なデータのログ記録を回避できます。
どのデータ型が記録されますか?
現在、以下のタイプに対応しています: | ロギング設定 | タイプ |
| ----------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| デフォルト(常時オン) |
dict, list, set, str, int, float, bool
| datasets
|
pd.DataFrame
pathlib.Path
| models
|
nn.Module
sklearn.base.BaseEstimator
| others
|
- 何かpickle可能で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アーティファクトページをご覧ください。