W&Bスイープでハイパーパラメータ調整
目次
- はじめに
- モデルパフォーマンスの改善
- ハイパーパラメータの調整
- nbdevとnbconvertの使用方法
- トレーニングスクリプトのエクスポート
- トレーニングスクリプトの実行方法
- ヘルプメニューの利用
- バッチサイズの変更方法
- ハイパーパラメータの最適化ツール
- weights and biases sweepsの使用方法
- YAML構成ファイルの作成
- スイープの実行方法
- データセットの最適化
モデルパフォーマンスの改善
こんにちは、再びお会いしましょう。元の課題であるモデルパフォーマンスの改善に取り組みましょう。どのようにしてすべてを改善し、ユニオンメトリクスの共通項を増やすことができるでしょうか。
前回のビデオでは、ベースラインノートブックをリファクタリングしました。今度はすべてをtrain.pyファイルにエクスポートする必要があります。
このタスクには複数の方法があります。すべてのセルを個別にエクスポートし、train.pyファイルにコピー&ペーストする方法があります。またはnbdevやnbconvertなどの半自動的な方法を使用することもできます。
ここではシンプルに、手動の方法を選びました。すべてのセルを統合し、それらをtrain.pyファイルにコピー&ペーストしました。
ファイルの末尾には、configに依存するtrain関数があります。追加したものはpauseとargsの機能です。これにより、引数を動的にオーバーライドすることができます。Pythonプログラムを対話型のコマンドラインインターフェースに変換するためのツールは多数あります。私はデフォルトのPythonアークパスを使用していますが、Fast AIを使用している場合は、組み込みのコールパスデコレータを使用してスクリプトをコマンドラインインターフェースに変換することもできます。
環境内でpython train.pyファイルを呼び出すだけです。
これにより、ファイルがノートブックで表示されるのと同じ方法で実行されます。ただし、デフォルトのアークで実行されるため、既にそのような実行がいくつかあるため、それほど興味深くありません。キャンセルしてしまいましょう。
ワークスペースに移動して、ログを確認しましょう。
削除するために部分実行をクリックしてください。
ご案内したように、私たちは現在対話型Pythonプログラムを使用できるので、この機能を利用しましょう。python train.py.helpを呼び出すと、オーバーライド可能なすべてのパラメータが表示されます。
また、バッチサイズを変更してみましょう。バッチサイズ16に変更してみます。
バッチサイズは、引数名と新しい値を渡すことでオーバーライドすることができます。これにより、デフォルト値8をオーバーライドしてバッチサイズ16で新しい実行が作成されます。ワークスペースでこれを確認しましょう。
実行をクリックし、概要タブにスクロールダウンします。バッチサイズが16になっていることを確認できます。
この実行もキャンセルしましょう。
実際に行いたいのは、ハイパーパラメータスペースの探索ですが、nbdevやnbconvertのように手動では行いたくありません。ハイパーパラメータ最適化を統一的に行う方法を定義したいのです。
それが、weights and biases sweepsです。わずか数行のコードで既にインストール済みのトレーニングスクリプトを使用して大規模なハイパーパラメータの調整を実行できます。いくつかの時間でハイパーパラメータのチューニングを完了することができます。
では、具体的にどのように実行するのでしょうか?weights and biasesに自動的にコードを実行させる方法はどのように指示するのでしょうか?これはyaml構成ファイルを使用して行われます。
まず、実行したいスクリプトを定義します。教育目的のため、train.pyとします。
次に、ハイパーパラメータスペースの探索方法を定義します。グリッド、ランダム、アンバイアス、最適化検索が提供されています。さらなる詳細情報については、weights and biases sweepsのドキュメントをご覧ください。
また、Sweepが属するプロジェクトを定義する必要があります。メインワークスペースを汚染しないために、別のプロジェクトを使用することもありますが、ここでは前と同じプロジェクトを使用します。
次に、監視するメトリックを定義します。今回の場合、ユニオンメトリクスの平均を最大化したいです。
最後に、ハイパーパラメータスペースを定義します。予測ログのデフォルト値を変更するような引数の上書きに使用したり、連続パラメータのサンプリングに分布を使用したりすることができます。今回は学習率をサンプリングし、値の最小値と最大値の対数の範囲で試してみます。また、離散パラメータの場合は値のリストを渡すこともできます。データセットが非常に小さいため、より多くのオプティマイザの更新を得るためにバッチサイズを小さくしてみます。また、画像サイズも少し大きくしてみます。これにより、小さなオブジェクトのセグメンテーションのモデルパフォーマンスが向上するはずです。最後に、異なる画像バックボーンを試してみましょう。これは私のお気に入りの4つのバックボーンですが、お好みに応じてTorch Visionのモールからさまざまなバックボーンを試してみてください。タスクやデータセットに応じて、さまざまなバックボーンを試すことができます。Torch Visionのモールは最新の技術で定期的にトレーニングされているため、非常に効果的です。スイープの構成ファイルが完成しました。では、ターミナルに切り替えてスイープを開始しましょう。1db sweepを使用してスイープを開始できます。次に、スイープの構成ファイルを渡します。スイープが作成されました。リンクをクリックすると、スイープのワークスペースにリダイレクトされますが、まだ空です。概要タブをクリックして、スイープの作成に使用された構成ファイルが表示されます。また、エージェントを起動するための推奨スイープコマンドも表示されます。ターミナルで示されたコマンドと同じです。50回の実行から始めましょう。このコマンドを実行すると、エージェントが起動し、スイープのワークスペースにランが追加され始めます。
ランが追加されてくるにつれ、プロットが自動的に更新されるのを確認できます。しかし、もう一つサプライズがあります。別のマシンで作業していることをお伝えしましたが、以前とは別のマシンを使用しています。このマシンには2つのGPUが搭載されています。Nvidia SMIコマンドを使用して、利用可能なGPUを確認できます。最初のGPUは使用中であり、2番目のGPUは待機中です。それを修正しましょう。新しいターミナルを開いて、Cuda visible device環境変数をオーバーライドし、コードを2番目のGPUで実行することを強制しましょう。このコマンドは、2番目のGPU上で新しいエージェントを作成します。さらに、50回のクォータも指定します。これは、クラスターや複数のGPUを搭載したマシンのような大規模な計算センターにアクセスできる場合に非常に強力です。さらに、並列してエージェントを起動し、スイープの実行時間を大幅に短縮することができます。ワークスペースに移動すると、2つのランが並列して追加されていることがわかります。素晴らしいですね。2つのエージェントが並行してスイープを完了するのにかかる時間を半分に減らすことができます。
次のビデオでは、完了したスイープの結果を詳しく調べていきます。