1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Hydraでランダムな実験IDを扱う

Posted at

こんにちは。今日は研究で使っているHydraでディレクトリの作成の際に、ランダムに生成した実験IDを使うための方法です。

Hydraでは自動で実験の結果をいい感じにディレクトリを切ってくれて出力してくれるのですが、デフォルトの設定では日付/時間と行った形でディレクトリが切られます。

ただ、実験を多く重ねていくと、あれこの結果っていつの実験だっけ?となることが多々あり、実験の際の設定を探そうにも膨大な数のディレクトリを一つ一つ開けて探すことになるので、実験の管理としてはあまり良くありません。

そこで、今回はPythonのuuidライブラリを使用して、ランダムな実験IDを発行し、それをHydraで使う方法についてご説明します。

Hydraの出力ディレクトリをカスタマイズする

まず最初にHydraの出力ディレクトリのカスタマイズ方法について確認していきます。

これは公式ドキュメントにも記載されていますが、スクリプトで使用する.ymlファイルに以下を追記することで出力ディレクトリをカスタマイズすることができます。


hydra:
  run:
    dir: ${now:%Y%m%d}T${now:%H%M%S}-${experiment_id}
  sweep:
    dir: ${now:%Y%m%d}T${now:%H%M%S}-${experiment_id}
    subdir: ${hydra.job.num}

experiment_id: "30d3974d"

このように、hydra.run.dirを指定してあげることで、出力フォルダ名をカスタマイズすることができます。

しかしこの方法では、わざわざ毎回手作業でexperiment_idを発行して、貼り付ける必要があり、面倒ですし、ミスも増えます。

そこでこの部分を自動化したいのですが、調べてもなかなか類似のことを行おうとしている記事が存在せずに困っていました。
hydra.job_idも使おうと思ったのですが、普通にhydraを実行するとこの値はNoneになってしまうので使えませんでした。

実験IDとしてuuidを使う

そこで今回はPythonでuuidを発行し、ディレクトリに使うことを考えます。
やり方は2つあり、

  1. ComposeAPIを使う
  2. hydra-pluginsを作る

のどちらでも目標を達成することができます。
ただ、ComposeAPIは古いAPIで使用すると本来のHydraでできることができなくなり、かえって手間が増えることがあります。

なので今回は2の方法で実装していきたいと思います。

といってもやり方は単純で以下の方法で終わりです。

ソースコードが書かれているルートディレクトリに(今回の場合は便宜的にsrcとします)、hydra-pluginsフォルダを作成して、以下のpythonファイルを作ります。

# src/hydra-plugins/random_id_provide.py
import uuid
from omegaconf import OmegaConf

class IDGenerator:
    def __init__(self, digit: int = 8) -> None:
        self.digit = digit # 長すぎるので切り捨てる桁数を指定。

    def generate(self) -> str:
        return str(uuid.uuid4())[: self.digit]
id_generator = IDGenerator()

OmegaConf.register_new_resolver("experiment_id", id_generator.generate)

hydraで使われているOmegaConfregister_new_resolverに呼び出したい関数を渡すだけです。このようにhydra-pluginsの中に適当なファイルを作成しておくだけで、後はhydraがよしなに読み取ってくれてconfig内で使用することが可能です。

以下のようなディレクトリを考えてみましょう。

hydra:
  run:
    dir: ${now:%Y%m%d}T${now:%H%M%S}-${experiment_id}
  sweep:
    dir: ${now:%Y%m%d}T${now:%H%M%S}-${experiment_id}
    subdir: ${hydra.job.num}

experiment_id: "${experiment_id:}"

このようにするだけで以下のようにuuidに従って出力用ディレクトリが作成されます!

スクリーンショット 2022-12-18 20.23.59.png

以上です!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?