wandbでCross Validationを行うときはgroupを設定するといい

いつも忘れて思い出すので備忘録です。
実験管理サービスのwandbでは、MLのloggingを目的に使用する方が多いと思います。ここではCross Validationなどの1実験で複数のモデルを学習する場合に便利なgroup
という機能を使用します。
結論
結論から、group
に実験名を、name
に各fold
の識別子を付与して、wandbのUI上のGroup
からgroup
を選択することで見やすくなります。さらにjob_type
を指定することで、より高度なフィルタリングを可能にします。
操作デモ
今回のPythonでのデモコードは以下です。wandb
のインストールはpip install wandb
で簡単に行えます。
import random
import wandb
project_name: str = "group_demo"
exp_name: str = "exp001"
for fold in [0, 1, 2, 3, 4]:
wandb.init(
project=project_name,
name=f"fold{fold}",
group=exp_name,
job_type="train",
)
for i in range(1, 101):
wandb.log({"loss": random.random() * (100 - i) / 100})
wandb.finish()
wandb.init(
project=project_name,
name=f"fold{fold}",
group=exp_name,
job_type="eval",
)
wandb.log({"score": random.random()})
wandb.finish()
通常name
に実験名を指定しますが、ここではgroup
に実験名を指定して、name
に何fold目
かを指定します。job_type
はgroup
と別の集団を指定するといいかもです。今回では学習はtrain
, 評価ではeval
としています。
学習毎、今回はfold毎にwandb.init
とwandb.finish
を実行します。特にwandb.finish
を実行する場所をよく間違えます。
exp_name
をexp002
などに変えて2回回しておくとwandb
のUIの理解が進みますので、追って実行している方は実行してみてください。
wandb
のログのURLから実験に飛ぶことができます。初期画面はこのようになっていると思います。
ここでgroup
を選択します。画面の左側にある以下のアイコンをクリックして、Group
を選択します。Grouped runs
ではありません。
そうすると以下のように見やすくグルーピングされます。
Group
の左隣のFilter
でname = fold0
のように指定することで、fold毎の実験の比較ができます。
また、Group
でjob_type
も同様に選択することで集約単位を変えることができます。group
とjob_type
両方指定することもできます。
そういえば
そういえば2023年のWeights & Biasesのアドベントカレンダーをまだ書いていなかったので、ここに書いておきます(気が向いたらWandB Reportsに移植します)。