kaggle

hydraを使用した機械学習のパラメータ管理方法について理解する

Hydraの簡単な使い方

Hydraは、階層的にパラメータの指定ができて(argparseと比較して可読性が高い)、ログなども自動で出力可能な便利なツールです。何気なく使用していましたが、公式のtutorialを確認すると便利な機能がありそうだったので、tutorialに沿って試してみます。インストールはgithubを参照。

config.yamlの読み込み方

hydraを使うには、config.yamlに必要なパラメータを記述して、スクリプトとして実行する関数に@hydra.main(config_name=’config’)のデコレータを記述する必要があります。

[ディレクトリ構成]
├─config.yaml

└─my_app.py

デコレータの引数ではyaml拡張子は不要でmy_appを実行すると、同じ階層にあるconfig.yamlが読み込まれて値がcfgに格納されます。cfgにはpythonの辞書型と同じようにcfg.db.user, cfg[‘db’][‘user’]でアクセスできます。

文字列など色々なパラメータの設定

config.yamlは数字、文字列、文字列補完が使えますが、ログでは文字列が補完された状態では出力されないようです。

???を設定したパラメータには、アクセスする時に値が上書きされていない場合はエラーが出ます。

別々のconfig.yamlを読み込む方法

パラメータを別yamlファイルで管理して、引数で特定のyamlファイルを読み込めます。

[ディレクトリ構成]
├─conf
│    ├─config.yaml
│    └─model
│            ├─model_1.yaml
│            └─model_2.yaml

└─my_app.py

confディレクトリを作成して、この直下にconfig.yamlを置き、実行時に選択が必要なパラメータを管理するディレクトリーを作成して上のようにyamlファイル置きます。

各ファイルの中身を表示しています。読み込まれるmodel_1.yamlとmodel_2.yamlの先頭には 「# @package _group_ 」の記述が必要です。また、デコレータの引数でconfig_name の他に、config_path(confディレクトリー)を指定する必要があります。

config.yamlにはdafaultで使用するyamlファイルをリスト形式で指定しておくことで、引数を指定しない時の実行条件が設定できます。(デフォルトで指定がない場合も python hoge.py +model=model_1とすれば指定可能)

[実行例]

上記のように引数で任意のyamlファイルを指定して実行すると、config.yamlのdefaultsの値を上書きできて、指定したファイルの読み込みが可能になります。

[ディレクトリ構成]
├─ conf
│    ├─ config.yaml
│    ├─ model
│    │     ├─model_1.yaml
│    │     └─model_2.yaml
│  └- process
│         ├─exp_1.yaml
│         └─exp_2.yaml

└─ my_app.py

cofing.yamlのデフォルトには複数のフォルダを指定できるので、例えば上記のようなフォルダ構成にしてデフォルトから引数で変更することで別々のパラメータでの実験が可能になります。

あるパラメータが他のパラメータに依存する場合

[ディレクトリ構成]
├─ conf
│    ├─ config.yaml
│    ├─ model
│    │     ├─model_A.yaml
│    │     └─model_B.yaml
│    ├─ dataset
│    │     ├─dataset_A.yaml
│    │     └─dataset_B.yaml
│  └- dataset_model
│         ├─modelA_dataset_A.yaml
│         ├─modelA_dataset_B.yaml
│         ├─modelB_dataset_A.yaml
│         └─modelB_dataset_B.yaml

└─ my_app.py

学習データA, BとモデルA,Bがある場合、各組み合わせで実験条件を変えたい場合はconfig.yamlのdefaultsにvariable interpolationの記述方法で指定できます。

引数として与えるモデルを変えると、自動で読み込まれるファイルが変更していることがわかります。また、モデルCなど組み合わせのconfigファイルがない引数を与えてしまうと、通常ならエラーがでてしまいますが、optional:Trueを与えることで、組み合わせの読み込みは無視して実行してくれます。

Multi Run機能(sweep)

例えば複数の条件で実験を回したい時は、multi runが便利です。-m または-multirunとスペース無しのカンマで条件を与えることで、直列に実験が行われます。下記はmodel_1とmodel_2を実験するコマンドです。

[実行例]

数字なども指定できて、range関数で与えることもできるので、seedなど探索範囲が広い場合に便利です。下記は引数としてseed=”range(1,5)”を与えています。

その他にもランダムで引数を指定する方法など色々とあるようですが、あまり活用方法が思い浮かばなかったので割愛します。

outputディレクトリの指定

hydraを使用した場合、実行毎に自動でoutputディレクトリーが作成されます。

[ディレクトリ構成]
outputs/2021/11-50-14
├─ .hydra
│    ├─ config.yaml
│    ├─ model
│  └─ overrides.yaml

└─ my_app.log

config.yamlに実行時に使用したパラメータの情報がコピーされるので、こちらを読み込めば結果を再現できるので便利です。また、実行関数(my_app)の名前でログファイルが作成されており、logger.info(“hoge”)などのようにログのレベルを指定することで出力フォーマットなどの設定をしなくても、ログを取ることができます。

config.yamlなどの保存が不要な場合は実行時のconfigファイルにhydra.output_subdirにnullを指定すると保存されなくなります。

デフォルトではworking directoryがoutput/日付日時/になってしまうので、データの読み込みなどを行う時のpathの指定を実行関数からの相対pathで指定したい場合など、注意が必要です。

一般的に?実行関数からの相対pathで読み込みを行うと思うので、その場合は、hydra.utils.get_original_cwd() + “../input/~”とすると良いかと思います。

タブ補完

同じ階層に複数のパラメータがある場合などに便利です。

インストールしておいて損はなさそうですね。

まとめ

機械学習で活用できそうな機能を中心にまとめましたが、他にも色々と機能がありそうです。また、開発が結構進んでそうなので、新しい機能が追加されたらこちらの記事に追記していきます。