Hydra Integration
https://github.com/facebookresearch/fairseq/blob/main/docs/hydra_integration.md
- Hydraはオープンソースフレームワークで、研究開発をシンプルにする
- 主な特徴は、動的に階層的なコンフィギュレーションを作成し、コンフィギュレーションファイルやコマンドラインによってそれを上書きできること
- 名前の由来は多数の似たジョブを実行する能力から、たくさんの頭を持つヒドラから
Motivation
- 最近までfairseqのすべてのコンポーネントは共有のargsネームスペースを通して設定されていた
- コンポーネントは自身のadd_argsメソッドを宣言してargparseパーサを更新し、他のコンポーネントの引数と名前が衝突しないようにする
- これはfairseqが大きくなり他のアプリと統合されるにつれて問題になった
- 各コンポーネントを設定する方法を決めるために、a) どんなargsがこのコンポーネントによって追加されたかを調べて、b) コードを読んで他で追加されたどの共有引数を使っているかを把握する必要があった
- モデルを再現するには、何十ものコマンドラインスイッチを含むコマンドを共有する必要があった
- 上記のようなモデルは後方互換のためまだサポートされているが、将来非推奨です
- fairseqの新しいコンポーネントは、そのコンポーネントを設定するのに必要な全パラメータをカプセル化するデータクラスを作ります
- そのデータクラスはコンポーネントと一緒に登録され、このコンフィグレーションオブジェクトを構築し、コンポーネントのコンストラクタに提供します
- パラメーターの共有はオプションでまだ機能するが、"source of truth"を明示的に指し示す必要があることに注意(下記の継承の例を参照)
- これらの変更はfairseqのコンポーネントをより独立かつ再利用可能にします
- コンポーネントを作るには、そのデータクラスをイニシャライズしていくつかのデフォルトを上書きするだけでよい
- 階層化された YAML 設定ファイルによって、fairseq を完全に、あるいは部分的に設定できるようになりました
- 可用性高まる
Creating or migrating components
- 新しいコンポーネントはデータクラスを提供する必要があります
- このデータクラスは通常コンポーネントと同じファイルに配置され、引数として
register_*()
関数に渡されます - すべてのfairseqアプリケーションに存在するべきTop-level configはglobal configファイルに置かれ
FairseqConfig
オブジェクトに追加される - 各データクラスは、NamedTupleに似た、古いデータ・オブジェクトで、
@dataclass
デコレータでデコレートされ通常FairseqDataclass
を継承する - 各フィールドは型を持たなければならず、一般的にはメタデータ(ヘルプ文字列など)とデフォルト値を持つ
- 各フィールドのデータ型として許されるのは、プリミティブ型またはその他のコンフィグ・オブジェクトのみである
Inheriting values
- コンポーネントによっては、値を共有する必要がある。例えば、学習率スケジューラとオプティマイザは、ともに学習率の初期値を知っている必要があるかもしれない
- デフォルトで同じ階層の別のconfigからその値を継承するフィールドを宣言することができます
-
II("")
は変数埋め込みのシンタックスシュガーとして使用できる
Tasks and Models
- TaskやModelの作成は以前度同じく動作しますが、
LegacyFairseq*
ベースクラスから継承したレガシーな実装は除きます - 新しいコンポーネントは
FairseqTask
とFairseqModel
を継承しデータクラスをregister_*()
関数へ与えます
Other Components
- 他のコンポーネントは以前と同じように動作しますが、コンストラクタの引数としてコンフィギュレーション・データクラスを取るようになりました
- 新しいコンポーネントのセットに対して新しいレジストリを追加する場合は、fairseq/dataclass/config.pyのFairseqConfigオブジェクトに追加する必要があります
Training with fairseq-hydra-train
- Hydraによるコンフィグレーションの柔軟性を完全に活用するために、
fairseq-hydra-train
で新しいモデルを訓練したいかもしれない -
fairseq-train
のようなレガシーCLIツールはまだサポートされているが徐々に非推奨になる - 起動時にHydraは必要なすべてのデータクラスの階層を含む設定オブジェクトを作成し、そのデフォルト値をコードに入力します
- デフォルト値は
farseq/config
にあるYAMLファイルの値で上書きされ、それからさらにコマンドライン引数の値で上書きされる - ユースケース
- Override default values through command line
-
Replace bundled configs with an external config
-
farseq/config
のconfigは使われずexternal configで上書きしない限り各データクラスのデフォルトが使われる - modelやdatasetなどトップレベルのフィールドの名前を持つmain config fileとして同じ場所にディレクトリ構造を作り、トップレベルのconfig fileの特定のセクションを入力する意味のある名前でconfig fileを置き換えることで、configを分割することもできる
- その後、コマンドラインで正しい設定を指定したり、メイン設定のデフォルトを指定したり、あるいはスイープとしてそれらすべてを起動することもできます(この方法についてはHydraのドキュメントを参照してください)
-
-
Add an external config directory to Hydra search path
- これにより、デフォルトのコンフィギュレーション(バンドルされているコンフィギュレーション・ファイルの使用を含む)を組み合わせながら、コンフィギュレーションの一部に独自のコンフィギュレーション・ファイルを指定することができる。