🐉

Hydraで設定ファイル(yaml)の管理を容易化する

2023/06/15に公開

はじめに

pythonの処理を行う際、yamlファイル等の設定ファイルを読み込むことがあります。設定ファイルを読み込む際に便利なHydraというフレームワークを調べたので纏めます。

Hydraとは

Hydraは、Pythonアプリケーションの設定管理を容易にするためのFacebookが開発したフレームワークです。

Hydraの使用メリット

以下に、Hydraを使用することで得られる主なメリットをいくつか挙げてみます:

  1. 階層的な設定管理: HydraはYAMLファイルを利用し、設定を階層的に管理します。これにより、大規模な設定ファイルを小さな、管理しやすい部品に分割することができます。

  2. 設定の組み合わせ: Hydraは複数の設定ファイルを組み合わせて一つの設定を生成することができます。これにより、特定のシチュエーションに合わせて設定を動的に変更することが容易になります。

  3. コマンドラインオーバーライド: Hydraはコマンドラインから直接設定をオーバーライドする機能を提供します。これにより、設定ファイルを編集することなく、一時的な設定の変更や実験的なパラメータの調整が可能になります。

  4. 変数補間: Hydraは設定値間での変数補間をサポートします。つまり、一つの設定値を他の設定値に依存させることができます。これにより、設定値の一貫性を維持することが容易になります。

  5. アプリケーションの設定とロギング: Hydraはアプリケーションの設定を管理するだけでなく、アプリケーションの実行時の出力(ログ)の管理もサポートします。たとえば、各実行の出力を異なるディレクトリに自動的に保存することが可能です。

  6. プラグインアーキテクチャ: Hydraはプラグインアーキテクチャをサポートしており、カスタムプラグインを作成してHydraの機能を拡張することが可能です。これにより、特定の用途にHydraをカスタマイズすることができます。

これらのメリットにより、Hydraは設定管理を強力にサポートし、Pythonアプリケーションの設定をより直感的かつ柔軟に管理することが可能になります。

Hydraの使用法

Hydraを使用して設定を組み合わせるための一例を以下に示します。まず、次のようなディレクトリ構造と設定ファイルを考えてみましょう:

.
├── config.yaml
└── conf
    ├── database
    │   ├── mysql.yaml
    │   └── postgresql.yaml
    └── server
        ├── development.yaml
        └── production.yaml
  • config.yaml:
defaults:
  - server: development
  - database: mysql
  • conf/database/mysql.yaml:
driver: mysql
username: test
password: test
  • conf/database/postgresql.yaml:
driver: postgresql
username: postgres
password: secret
  • conf/server/development.yaml:
host: localhost
port: 8080
  • conf/server/production.yaml:
host: 0.0.0.0
port: 80

ここで、defaultsセクションには、各設定カテゴリー(serverdatabase)でデフォルトとして使用する設定がリストとして定義されています。この場合、デフォルトのserver設定はdevelopmentで、デフォルトのdatabase設定はmysqlです。

これらの設定は、コマンドラインからオーバーライドすることができます。たとえば、serverproductionに、databasepostgresqlに変更するには、次のように実行します:

python my_app.py server=production database=postgresql

この場合、Hydraはconf/server/production.yamlconf/database/postgresql.yamlの設定をロードし、それぞれの設定を組み合わせて使用します。

Pythonコードの中で設定を使用するためには、hydra.mainデコレータとcfgオブジェクトを使用します:

from omegaconf import DictConfig
import hydra

@hydra.main(config_path="conf", config_name="config")
def my_app(cfg : DictConfig) -> None:
    print(cfg.database.driver)
    print(cfg.server.host)

if __name__ == "__main__":
    my_app()

このアプリケーションを実行すると、選択された設定に基づいて、データベースのドライバー名とサーバーのホスト名が出力されます。

このように、Hydraを使用すれば、複数の設定ファイルを組み合わせて、アプリケーションの設定を柔軟に管理することができます。

Discussion