Closed5

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

bilzardbilzard

背景

特定の実験を再現したい場合の公式のワークフローが知りたい。

実現方法

公式で--experimental-rerunというオプションが提供されている[1]。
これは"experimental feature"という位置付けになっていて、将来的に変更(または廃止)される可能性がある。制約として、再現性が担保されるためにはパラメータのresolveがアプリケーション内で一貫していることが求められる(例えば時刻によるresolveは実行時刻に依存するので再現性は担保されない)。

要するにresolve結果を格納したログ(そもそもそういうのはない?)からの再現はサポートしておらず、resolve前のパラメータを再度注入する仕様らしい。

[1]の機能が実装される元となったissueは[2]。

Reference

bilzardbilzard

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

bilzardbilzard

参考として、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

bilzardbilzard

実験ログの仕様

実験ログの仕様をリバースエンジニアリングした(実際の仕様とは異なるかもしれない)。

- 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-pathconfig-nameを指定して実行する。

$ python infer.py --config-path=./exp --config-name=v0001.yaml

上記運用フローの制約

hydraはコンフィグパラメータをsingletonオブジェクトとして保管するので、異なるパラメータのモデルをアプリケーション内で混在させることはできないと思われる。モデルのアンサンブルをするには推論スクリプトをパラメータ数分実行する必要がある。データローディングが毎回実行されるので、「ロード1回+アンサンブルモデル数分推論」する方法と比較すると非効率な方法になる。
とはいえ、データロードの時間が十分短く(〜数分程度)、推論結果のファイルサイズが小さい(<数百MB~1GB)なら現実的な方法である。

Compose APIで実行時に異なるパラメータでモデルを生成する

Compse API[6]を使えば「実行時に異なるパラメータでモデルを生成し、推論する」ことは可能かもしれない(データの形式が全てのアンサンブルモデルで同じであることを仮定)。

Reference

このスクラップは2023/11/13にクローズされました