hydraの実行ログから特定のパラメータセットを再現する

背景
特定の実験を再現したい場合の公式のワークフローが知りたい。
実現方法
公式で--experimental-rerun
というオプションが提供されている[1]。
これは"experimental feature"という位置付けになっていて、将来的に変更(または廃止)される可能性がある。制約として、再現性が担保されるためにはパラメータのresolveがアプリケーション内で一貫していることが求められる(例えば時刻によるresolveは実行時刻に依存するので再現性は担保されない)。
要するにresolve結果を格納したログ(そもそもそういうのはない?)からの再現はサポートしておらず、resolve前のパラメータを再度注入する仕様らしい。
[1]の機能が実装される元となったissueは[2]。
Reference

というかそもそも「特定の実験パラメータで推論する」みたいなのをファイルを入れ替えるだけで実現できればそれで良いのだが、このフローとは異なる?

参考として、tuboさんの推論notebook[3]では実行時に引数としてパラメータを注入している。
$ python -m run.inference\
dir=kaggle\
model.encoder_name=resnet34\
model.encoder_weights=null\
num_workers=2\
exp_name=$EXP_NAME\
weight.run_name=single\
batch_size=64\
duration=$DURATION\
downsample_rate=$DOWNSAMPLE_RATE\
post_process.score_th=0.005\
post_process.distance=40\
phase=$PHASE
Reference

config_pathとconfig_nameを実行時にコマンド引数として差し替えることは可能なよう(PR[4], ISSUE[5])。
実験実行後、outputs配下に生成されるconfig.yamlに全てのパラメータセットが格納されたconfigができている。これのパスを指定すれば良さそう。
Reference

実験ログの仕様
実験ログの仕様をリバースエンジニアリングした(実際の仕様とは異なるかもしれない)。
- outputs/yyyy-mm-dd
- HH-MM-SS
- .hydra
- config.yaml # 実験で使用された全てのパラメータの設定値(上書きされた値も含む)
- hydra.yaml # 実験パラメータ以外のhydraの実行時のコンテキスト(例: ログの出力先パスなど)
- overrides.yaml # CLIで上書きされたパラメータのキーと値の一覧
- (*.pyファイル名).log
したがって、特定の実験のconfig.yaml
を保存しておけば、そのパラメータを再度注入して実験が再現できる。この方法であれ実行時に決定するパラメータ(例: worker数、batch_sizeなど)のみ上書きすることができる。
運用フロー
実験後に、推論モデルとして採用したい設定値のoutputs
ディレクトリのログをコピーしてexp
ディレクトリに移動し、v0001.yaml
などの名前をつける。
推論時にconfig-path
とconfig-name
を指定して実行する。
$ python infer.py --config-path=./exp --config-name=v0001.yaml
上記運用フローの制約
hydraはコンフィグパラメータをsingletonオブジェクトとして保管するので、異なるパラメータのモデルをアプリケーション内で混在させることはできないと思われる。モデルのアンサンブルをするには推論スクリプトをパラメータ数分実行する必要がある。データローディングが毎回実行されるので、「ロード1回+アンサンブルモデル数分推論」する方法と比較すると非効率な方法になる。
とはいえ、データロードの時間が十分短く(〜数分程度)、推論結果のファイルサイズが小さい(<数百MB~1GB)なら現実的な方法である。
Compose APIで実行時に異なるパラメータでモデルを生成する
Compse API[6]を使えば「実行時に異なるパラメータでモデルを生成し、推論する」ことは可能かもしれない(データの形式が全てのアンサンブルモデルで同じであることを仮定)。