W&B Automationsを用いたモデルCIのチュートリアル
W&B Automationsを使用して、すべての新しい候補モデルに対して評価を実行する例をご紹介します(ハンズオン用Colabはこちら)。
本ブログ記事はCarey Phelps, Thomas Capelleによって執筆され、W&B Fully Connectedで公開された"A Tutorial on Model CI with W&B Automations"の日本語訳です。
イントロダクション
このレポートでは、Weights & BiasesのAutomations機能を使って新しいモデル候補の自動評価をトリガーする方法を学びます。これにより、各モデルのパフォーマンスを同じテストセットで標準化された評価スイートを用いて簡単に比較することができます。これは、異なるチームが新しいモデルを訓練し、パフォーマンスを評価して性能低下を特定し、最終的には最新のモデルを本番環境にデプロイするというプロダクションMLパイプラインを構築する際に強力な機能です。
W&Bを用いたモデルCIの概要
数ステップの簡単な手順でモデルのテストを自動化できます:
W&Bで訓練と評価のジョブを作成 します
新しいモデルに対して評価ジョブを簡単に再実行するための自動化を設定します
新しいバージョンが利用可能になるたびに、モデルを自動的にテストします
Automationsを使って「モデルCI(継続的インテグレーション)」を実際に動かしてみましょう。
1. モデルの訓練とテスト
W&Bアカウントを作成する
まだW&Bアカウントを持っていない場合は、モデルの追跡のためにW&Bにサインアップしてください。次に、ローカルマシンにwandbをインストールし、アカウントにログインします:
pip install wandb
wandb login
環境構築
examplesのフォルダを開いて、必要なライブラリをインストールします。:
# in your terminal
git clone https://github.com/nejumi/examples.git
cd examples/examples/wandb-automations
pip install -r requirements.txt
ディレクトリ内のファイルを閲覧して、実行するコードの概要を把握しておきましょう:
train.py:モデルを訓練し、訓練メトリクスを出力します
eval.py:訓練されたモデルを評価し、テストセットでのモデルの予測をログに記録します
utils.py:W&B Artifactsを使用してsave_modelとload_modelの関数を定義しています
モデルバージョンをログしてリンクする
この例では、MNISTデータセットを用いて簡単なモデルを訓練します。
ターミナルで、以下のコマンドを実行してモデルの訓練を開始しましょう:
python train.py
上記の動画内の例では、Apple MacBookで実行するために、--device=mps オプションを渡します 😎
新しいモデルバージョンを登録済みのモデルにリンクする
このスクリプトはutils.pyを使用して訓練されたモデルをArtifactとして保存し、そのモデルを自動的にモデルレジストリにリンクします。次のステップで評価する際に、このモデルレジストリからモデルを取得します。
ターミナルで、以下のコマンドを実行してモデルの評価を開始します:
python eval.py
このスクリプトはutil.pyを使用して、レジストリから保存されたモデルを取得し、ホールドアウトされたテストセットで予測を行います。
(任意)ジョブの名前を変更する
ジョブがGitリポジトリから作成されると、リポジトリ内のスクリプトへの完全なパスを含めようとするため、名前が非常に長くなることがあります。UI上でジョブ名の右にある名前変更アイコンをクリックすることで、ジョブの名前を簡単に変更することができます。
(任意)テーブルにカスタム列を追加する
テーブルで、列名の隣にあるメニューをクリックし、新しい列を挿入し、セル式として row["label"] == row["pred"] を入力します。これにより、モデルが正確な予測をした場合に各行を「True」と表示し、不正確な予測の場合は「False」と表示します。
次に、その新しい列でグループ化して、正確または不正確にラベル付けされた行をすべて確認します。
この例では、223の例が正確に、43の例が不正確にラベル付けされたことがわかります。
2. Automationのセットアップ
次に、評価を自動化したいと考えています。これは、新しい有望な候補モデルが得られるたびに、それを自動的にテストし、結果をW&Bに報告できるようにすることを意味します。
Automationを作成する
登録済みのモデルでAutomationを設定します。これは、テストが必要な新しい候補モデルが来たときにそれを監視するツールです。
モデルレジストリで、新しく登録されたMNIST Classifierモデルを見つけます。右側のメニューをクリックし、次に「New automation」をクリックします。
Automationを作成するための設定を入力してください:
イベントタイプ (Event type):登録済みのモデルに新しいバージョンが追加される
登録モデル (Registered model):MNIST Classifier
ジョブ (Job):wandb_automations/job-eval
宛先プロジェクト (Destination project):wandb_automations
キュー (Queue):"Starter queue"を作成する
Automationの名前 (Automation name):Model CI
Starter queueを表示する
Automationを作成すると、キューへのリンクを含むツールチップが表示されます。その「View queue(キューを表示)」をクリックします。または、そのリンクを見逃した場合は、Launchページを開いて、Starter queueの隣にある「View queue(キューを表示)」をクリックします。
Starter queueを開いたとき、最初はジョブがキューに入っていない状態で、エージェントもまだ動作していないはずです。
エージェントを起動する
次に、キューからジョブを実行する軽量なプロセス、すなわちエージェントを設定します。この例では、ローカルマシン上でDockerを使うシンプルな方法を用いますが、Launchはプロダクションワークフローでクラウドの計算能力を活用するために、スケーラブルなKubernetesクラスタをサポートしていますので、そちらも是非ご活用ください。
ローカルマシンでDockerが動作していない場合は、Docker Desktopをインストールしてください。
pip install wandb --upgrade
wandb launch-agent -e examples -q "Starter queue"
3. モデルを自動的にテストする
最後に、新しいモデルを訓練し、それが自動的に評価される様子を見てみましょう。
訳者注: 今回のサンプルコードではutils.py内でモデルレジストリへの登録まで実行しているために手動でモデルレジストリにモデルを登録することなくAutomationも自動的にキックされていますが、あくまでトリガーは「モデルレジストリに登録済みのモデルに新しいバージョンが追加される」であることにご注意ください。
新しいモデルを訓練する
wandb-automationsリポジトリで、モデル訓練スクリプトを再実行し、新しいモデルを試してみましょう:
python train.py --model_name="resnet18"
ターミナルで、評価ジョブが自動的にダウンロードされ、ローカルマシンで設定される様子を確認してください。
UI上で評価結果を見てみましょう。これで、テストの結果を確認することができました。
これでゴールです!🎉
W&Bを用いてモデルのテストの自動化に成功しました。
ご意見やフィードバックを共有してください!W&B JapanコミュニティSlackでお待ちしております。