目次
1. はじめに
2. 親子関係がどのように設定されているか
3. nested
オプションを使わない親子関係の作り方
4. 参考文献
はじめに
mlflowは、機械学習プロジェクトの実験管理を容易にするツールです。特に、実験(Run)に親子関係を持たせて管理することで、複雑な実験の追跡と分析が簡単になります。
通常Runに親子関係を持たせたい場合は、mlflow.start_run(nested=True)
とすればいいのですが、それが適用できない場面に遭遇したため、他の方法でRun間に親子関係を持たせる方法を調べることになりました。
この記事では、mlflowのRunの親子関係がどのように記述されているか、nested=True
オプションを用いないで親子関係を持たせる方法をまとめています。
親子関係がどのように設定されているか
mlflowでは、tags.mlflow.parentRunId
によって、Runの親子関係が記述されています。
例えば以下のコードをサンプルとして実行します。
import mlflow
with mlflow.start_run() as parent_run:
mlflow.set_tag("mlflow.runName", "parent_run")
print(f"Parent run ID: {parent_run.info.run_id}")
with mlflow.start_run(nested=True) as child_run:
mlflow.set_tag("mlflow.runName", "child_run")
print(f"Child run ID: {child_run.info.run_id}")
>>>
Parent run ID: 0bfac406f7084cd39c27d3274f1e39f2
Child run ID: ac358223146a437a8167badfdaa9c150
すると、
mlruns
└── 0
├── ac358223146a437a8167badfdaa9c150 <- Child Run
│ └── tags
│ └── mlflow.parentRunId # 0bfac406f7084cd39c27d3274f1e39f2
├── 0bfac406f7084cd39c27d3274f1e39f2 <- Parent Run
└── meta.yaml
のようにログが記録されます(各Runのディレクトリ内には、metricsやartifactsなどのディレクトリも生成されますが省略しています)。
このとき、Child runである、ac358223146a437a8167badfdaa9c150
の中のtagsというディレクトリ内にmlflow.parentRunId
という名前のテキストファイルが作成され、ここに書かれたidによって親子関係が識別できるようになっています。
今回だとmlflow.parentRunId
の中身は、Parent run ID
である0bfac406f7084cd39c27d3274f1e39f2
となっています。
mlflow uiで見てみると、以下のように親子関係ができています。
nested
オプションを使わない親子関係の作り方
上記のことを踏まえると、
with mlflow.start_run(nested=True)
のようにして、親子関係を作ることができない場合でも
import mlflow
with mlflow.start_run() as run1:
mlflow.set_tag("mlflow.runName", "run1")
run1_id = run1.info.run_id
print(f"Run1 ID: {run1.info.run_id}")
with mlflow.start_run() as run2:
mlflow.set_tag("mlflow.runName", "run2")
mlflow.set_tag("mlflow.parentRunId", run1.info.run_id)
print(f"Run2 ID: {run2.info.run_id}")
>>>
Run1 ID: 3c4e15b063234ea7b2969c4c72141ef0
Run2 ID: 4d0dceb3f8e74c9bb1ba7951aec8b18d
とすることで、run2
をrun1
のChild Runとすることが可能です。
mlflow uiを立ち上げてみると、以下のようにきちんと親子関係ができています。