Open1

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

colum2131colum2131

いつも忘れて思い出すので備忘録です。

実験管理サービスの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_typegroupと別の集団を指定するといいかもです。今回では学習はtrain, 評価ではevalとしています。

学習毎、今回はfold毎にwandb.initwandb.finishを実行します。特にwandb.finishを実行する場所をよく間違えます。

exp_nameexp002などに変えて2回回しておくとwandbのUIの理解が進みますので、追って実行している方は実行してみてください。

wandbのログのURLから実験に飛ぶことができます。初期画面はこのようになっていると思います。

ここでgroupを選択します。画面の左側にある以下のアイコンをクリックして、Groupを選択します。Grouped runsではありません。


そうすると以下のように見やすくグルーピングされます。

Groupの左隣のFiltername = fold0のように指定することで、fold毎の実験の比較ができます。


また、Groupjob_typeも同様に選択することで集約単位を変えることができます。groupjob_type両方指定することもできます。

そういえば

そういえば2023年のWeights & Biasesのアドベントカレンダーをまだ書いていなかったので、ここに書いておきます(気が向いたらWandB Reportsに移植します)。

https://x.com/nejumi_dqx/status/1738229103948693994