ModelのExampleより)Pythonのargparseでシェルから引数を受け取りPythonスクリプト内でパラメータに設定するパターンは、記述が長くなりがちな上、どのパラメータがmodel/preprocess/optimizerのものなのか区別がつきにくく見通しが悪いといった課題があります。私は実験用のパラメータ類は全てYAMLに記述して管理しています。YAMLで記述することでパラメータを階層立てて構造的に記述することができ、パラメータの見通しがぐっとよくなります。0.001パラメータチューニングの際には、シェルスクリプトからyqコマンドで書き換えながらPythonスクリプトに流すという運用をしていたのですが、yqコマンドでがちゃがちゃ書き直しているうちにデフォルト値が分からなくなるという悩みがありました。YAMLによるパラメータ管理のベストプラクティスを模索している折に、Hydraというツールが登場したので、家の実験管理周りをHydraを使って整理してみました。Researchが提供している設定ファイルを管理しやすくするためのツールです。様々な設定をYAML形式で記述し、そのYAMLの設定群を簡単にPythonスクリプト内に流し込むことに主眼を置いているツールであり、ExampleにはDatabaseの設定があるなど機械学習以外の用途での使用も想定しているツールです。HydraによるYAMLの読み込み以下のようにYAMLファイルにパラメータを設定し、PythonスクリプトでHydraのデコレータを付与した関数を用意することでDictの形式でパラメータを読み込むことができるようになります。postgre_userコマンドラインでYAMLのパラメータをkey=valueの形で渡すと、対象の値を書き換えてPythonスクリプトに持ち込むことができます。元のYAMLファイルには影響はありません。ymym複数のYAMLファイルの管理Hydraでは設定ファイルを複数のYAMLファイルに分割して運用することも想定しています。NNとLightGBMのパラメータを別々のYAMLファイルに記述して使用するモデルをハイパラに設定してそれに応じて対応するモデルのYAMLを読み込といった感じです。0.5Hydraの出力ディレクトリHydraはPythonスクリプトが最終的にどんなYAMLファイルの内容で実行されたかを出力ディレクトリ(デフォルトではoutputs/)を生成して保管してくれます。my_app.logこの出力ディレクトリには少し注意が必要で、Pythonスクリプトでhydraのデコレータをつけた関数の中ではcwdがこの出力ディレクトリになってしまいます。pd.read_csv('data/train.csv')といったファイル読み込みを使用とするとcwdの違いから事故ることが多いので、hydraが用意してくれている関数を使ってオリジナルのプロジェクトルートのパスを取得するとよいでしょう。MLflowでパラメータ/実験を管理するでは、機械学習の実験に対して「YAMLで記述したハイパーパラメータの読み込みとグリッドサーチにHydraを」「どのパラメータで実験しどんな結果になったかの記録をMLflow」で行います。今回も題材は例によってLivedoorのニュースコーパスのテキスト分類です。データの読み込み、加工等の諸々の関数を定義します。preprocessor次にハイパーパラメータを記述するYAMLファイルです。3今回はYAMLは分割せずひとつのファイルにすべて記述しています。個人的にはYAMLを細く分割しすぎると変更忘れや修正がおっくうになるので、それほど複雑でなければ単一のYAMLにまとめて記述してしまった方が良いと思います。続いてTrain&Testの関数です。writer.log_torch_model(model)ここで出てくるwriterというインスタンスはMLflowのClientをラップしてログの記録やArtifactの保存を行うクラスのインスタンスです。IDを引き回さないといけないためラッパークラスを作っています。self.client.set_terminated(self.run_id)最後にHydraのデコレータを付与したmain関数です。データをローカルのcsvから読み込むため、Hydraのutilを使ってプロジェクトルートのパスを取得しています。main()HydraにはMulti-runという機能があり、これはコマンドラインから呼ぶ際にパラメータのkey=valueでvalue値をカンマ区切りで記述し-mオプションをつけると、全パラメータの組み合わせを実行してくれるというものです。出力は各パラメータの組み合わせのたびに保存されるので、この機能を使ってパラメータのグリッドサーチを行うことができます。-m上記を実行すれば各実験の内容がMLflow上に記録されます。Hydraでグリッドサーチした結果をMLflowに記録しておけば、実験結果の比較も容易です。以下は各実験のパラメータを表示しながら、Accuracyをプロットしているところです。Researchが開発している設定管理ツールのHydraの使い方と、Hydra+MLflowでハイパーパラメータの入出力を管理するやり方を紹介しました。argparseを使ってパラメータ入力を行うのと比べて、YAMLでのパラメータ管理は見通しがよくHydraと組み合わせることで設定をいじりながらPythonと組み合わせることも簡単になります。これを機にハイパーパラメータの管理をYAML+Hydraに移行してみてはいかがでしょうか。-りたーんず!-月別アーカイブカテゴリーはてなブログをはじめよう!ymym3412さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。