Hydra というのは設定ファイルをイイ感じに扱えるようにする python 製のフレームワークである。
公式サイトによると、A framework for elegantly configuring complex applications
ということなのだが、まあその通りという感じ。
複数ファイルで色々と設定を書いてまとめられるので、かなり便利で重宝しているのだが、いくつかうーんという点がある。
- 勝手にディレクトリを掘って、勝手にワーキングディレクトリを変更する
- (実行時に色々いじった物を反映した) 設定に対応するファイルを書き出す
- ログファイルを勝手に作る
という感じで、色々と手を回してくれるのはまあ良いのだが、ちょっと副作用が強いなと思うときもあったりなかったりする。
気持ちとしてはこの辺の副作用をなんとかしたいと思うのは自然だと思うのだが、果たして頑張ってみるとこの辺を誤魔化すことができるようだったのでまとめておく。
調べていく過程で、stack overflow に記事がることを発見したので、ほとんどそれの和訳に近い形になるのだが、ともかく書いておく。
1. 勝手にワーキングディレクトリを変更する
hydra 実行時のワーキングディレクトリは、デフォルトだとこんな感じ に設定されたディレクトリに変更されるようになっている。
例にも書いてあるが、この辺をいじればコンフィグの値によってログを吐き出す先を書き換えることもできる。
ワーキングディレクトリを変更しないようにするには、単に ./
を値として設定すればよい。
2. (実行時に色々いじった物を反映した) 設定に対応するファイルを書き出す
実行時に、様々な設定に対応する値をコマンドライン引数の値に応じて書き換えるような機能が入っている。
その書き換え前/後の設定を yaml で書き出してくれるようになっているのだが、これも困るといえば困る。
これを無効にするには、 hydra.output_subdir
の値を null に設定すればよい。
3. ログファイルを勝手に作る
勝手に実行時のログファイルを(当然だが何もロギングしてなくとも)書き出すようになっている。
stack overflow では hydra.hydra_logging=disabled と設定することで無効にすることができると書いてある。
それはそれで事実なのだが、このへん を参考にするとイイ感じに logging の設定ができて便利である。 handlers の値としてファイルへの物を渡さなければ、ファイルを勝手に生成することはなくなる。
上記を踏まえた上で、パースするyaml
には例えば次のように書く。
hydra:
run:
dir: ./
output_subdir: null
job_logging:
version: 1
handlers:
console:
class: logging.StreamHandler
stream: ext://sys.stdout
root:
handlers: [console]
disable_existing_loggers: false