Vertex AI Model Gardenを活用した効果的なモデル開発プロセスの紹介
クラウドエース宮崎です。
こんにちは!暑い季節が続いていますが、涼しい場所でリフレッシュする方法を見つけましたか?私はサウナ後の外気浴と水風呂で癒されています。
今回は6月9日にGAとなったVertex AI Model Gardenを活用して効果的なモデル開発プロセスを構築する方法を紹介します。
はじめに
- 本記事の趣旨は、「Vertex AI Model Gardenを活用して効果的なモデル開発プロセスを構築する方法を紹介」といったものになります。
標準サポートされているJupyter Notebookを使ってモデル開発をするので、今回はお試しということできっちりした構成管理等は行わないのでご容赦ください。
Vertex AI Model Gardenとは
- Google Cloudの機械学習プラットフォームであるVertex AIの一部であり、効果的なモデル開発プロセスをサポートするためのツールセットです。Model Gardenは、様々なタスクやデータセットに対応した定義済みモデルを提供しており、モデルの選択からカスタマイズ、テスト、デプロイ、運用までの各ステップで開発者を支援し、モデル開発における効率化と品質向上を実現することができます。
Model Gardenの特徴
- 定義済みモデルの提供: Model Gardenは、画像分類、物体検出、音声認識など、様々なタスクに対応した定義済みモデルを提供しています。
- モデルのカスタマイズ: 定義済みモデルを使用しながらも、開発者はモデルをカスタマイズすることができます。ファインチューニングやレイヤーの追加・削除などの手法を活用して、特定のタスクやデータに適したモデルを作成することができます。
- テスト・デプロイ・運用のサポート: Model Gardenは、モデルのテスト、デプロイ、および運用においても開発者をサポートします。テストにはモデルの評価や予測の精度を測定するためのツールやメトリクスが提供されており、モデルのパフォーマンスを評価することができます。
実際に触ってみた
入力データの作成
まず、ストレージバケットを作成します。(サポートされているリージョンは"us"、"asia"、"europe"です。)
Cloud Shell で次のコマンドを実行します。
gsutil mb -p <PROJECT ID> \
-c standard \
-l us-central1 \
gs://<BUCKET NAME>/
次に、Cloud Storageのgsutilコマンドを使用して、バケットにトレーニング画像をコピーします。
今回は、Google Cloudが一般公開している3種類の雲(巻雲、積雲、積乱雲)の画像データを使用します。
gsutil -m cp -r gs://spls/gsp223/images/* gs://<BUCKET NAME>
次に、トレーニング画像のURIと、その画像に対応するラベルが各行に含まれるCSVファイルを用意します。
このCSVファイルも一般提供されているので、先ほどのバケット名を使用して下記のコマンドを実行してローカル環境にダウンロードしてください。
gsutil cp gs://spls/gsp223/data.csv .
コピーしたCSVファイルに含まれるトレーニング画像のURIを、各自の環境のバケットURIに置き換えます。
./data.csv ファイル内の “placeholder” という文字列をBUCKET NAMEに置換しています。
sed -i -e "s/placeholder/<BUCKET NAME>/g" ./data.csv
ファイルの内容が、以下のようなトレーニング画像とラベルが各行に含まれるCSVとなっていれば大丈夫です。
gs://model-garden-data-vcm/cirrus/1.jpg,cirrus
gs://model-garden-data-vcm/cirrus/2.jpg,cirrus
gs://model-garden-data-vcm/cirrus/3.jpg,cirrus
gs://model-garden-data-vcm/cirrus/4.jpg,cirrus
gs://model-garden-data-vcm/cirrus/5.jpg,cirrus
<<省略>>
次に、このファイルを Cloud Storage バケットにアップロードします。
gsutil cp ./data.csv gs://<BUCKET NAME>
これで、入力データの準備は完了です!
Model Gardenにアクセス
Vertex Model Gardenには自然言語処理、画像生成・検知、表形式、音声認識、マルチターンチャットなど、さまざまなユースケースに対応する幅広い分野のモデルが用意されています。
これらのモデルは、大規模なデータセットとリソースを使用して事前トレーニング済みであり、ユーザーはニーズに合わせてカスタマイズできます。
事前トレーニング済みのモデルの詳細を確認
「詳細を表示」をクリックすると、OVERVIEW, USE CASES, DOCUMENTATION, PRICINGといったモデル詳細を確認することができます。
今回は、優れたパラメータ効率と高速な学習速度を実現した画像分類モデルであるtfhub/EfficientNetV2を見ていきます。
モデルのカスタマイズ
tfhub/EfficientNetV2モデルの場合、画像をコンソールよりアップロードするだけで、画像分類の動作イメージがわかります。
また、事前定義済みのモデルは、基本的にノートブックのサポートがされています。
ノートブックを開くをクリックすると、Google Colaboratoryが開きます。
Vertex AI 基盤上でモデルをデプロイするまでの道筋が、サンプルコードを交えながら記述されており、ファインチューニングやレイヤーの追加・削除などの手法を活用して、開発者はモデルをカスタマイズすることができます。
Google Colab環境で実行する場合、下記のコードを実行して、
Google Cloud AI PlatformのPythonライブラリを最新バージョンにアップグレードし、Google Colabの認証を行います。
トレーニング用の画像の準備
下記のコードを実行して、
Google Cloud AI Platformを使用して画像分類モデルのトレーニングを行うための準備をします。
以下がコードで行われる内容です。
- 必要なライブラリのインポート
- プロジェクトIDとリージョンとバケットURIの指定。
バケットURIは、トレーニングジョブの一時ファイルやチェックポイントを保存するために使用されます。リージョンは、トレーニングジョブを実行する場所を指定します。
予め、Google Cloud Storageにバケットを生成しておく必要があります。 - 3つの設定ファイルをダウンロードしてバケットにアップロードします。
これらの設定ファイルは、画像分類モデルのトレーニングに使用されます。
モデルのトレーニングとチューニング
下記のコードを実行して、
AI Platformのトレーニングジョブやモデルのデプロイに関連する定数を定義しています。
次に下記のコードを実行して、
カスタムトレーニングモデルの予測や評価に役立つ関数を定義します。また、コードの上部には必要なライブラリのインポートも含まれています。
以下が関数の説明です。
-
get_job_name_with_datetime(prefix: str) -> str
: 現在の日時を使用して、指定された接頭辞に日付と時刻を追加したジョブ名を生成します。 -
predict_custom_trained_model(project: str, endpoint_id: str, instances: Union[Dict, List[Dict]], location: str = "us-central1") -> Tuple
: AI Platform の予測サービスを使用して、カスタムトレーニングモデルに対して予測を行います。 -
load_img(path) -> Image
: 指定されたパスから画像を読み込み、PIL の Image オブジェクトとして返します。 -
display_image(image) -> None
: 指定された画像を表示します。 -
get_prediction_instances(test_filepath, new_width=-1) -> List[Dict]
: 予測のためのインスタンスデータを生成します。画像ファイルパスを指定し、必要に応じて画像のリサイズと Base64 エンコードを行います。 -
get_label_map(label_map_yaml_filepath) -> Dict
: ラベルマップファイルを読み込み、ディクショナリとして返します。 -
get_best_trial(model_dir, max_trial_count, evaluation_metric) -> Tuple
: モデルディレクトリ内のトライアル結果から、最良のトライアルディレクトリと評価結果を取得します。評価メトリックとして指定された指標に基づいて、最も優れたパフォーマンスを示すトライアルを選択します。 -
upload_checkpoint_to_gcs(checkpoint_url) -> str
: チェックポイントファイルをダウンロードし、Google Cloud Storage(GCS)にアップロードします。アップロードされたチェックポイントのURIを返します。
次に、下記のコードを実行して、モデルのトレーニング、評価、訓練に必要なパラメータの設定をします。
以下が、パラメータの説明です。
-
input_file_path
,input_file_type
,num_classes, split_ratio
,num_shard, data_converter_output_dir
: これらのパラメータはジョブの設定に使用されます。それぞれ入力ファイルのパス、入力ファイルのタイプ、クラスの数、データ分割の比率、シャードの数、出力ディレクトリを指定します。
※今回は、3種類の雲のラベルを用意したのでnum_classes
は3に指定します。 - worker_pool_specs : この部分では、ジョブを実行するためのワーカープールの仕様を定義します。ここではマシンタイプ、レプリカ数、コンテナのイメージURI、コマンド、引数が設定されています。
- aiplatform.CustomJob : AIプラットフォームのカスタムジョブを作成します。表示名、プロジェクトID、ワーカープールの仕様、ステージングバケットが指定されています。
次に、下記のコードを実行して、Google Cloud AI Platform上でハイパーパラメータチューニングを使用して機械学習モデルを訓練するための設定を行います。
以下が、パラメータの説明です。
-
experiment
: 使用するモデル(実験)を選択します。
※今回は前述したとおり、画像分類モデル“Efficientnetv2-m”を指定します。 -
common_args
: すべての実験で共通の訓練パラメータを定義します。これには、訓練データのパス、検証データのパス、目的、モデルディレクトリ、クラス数、グローバルバッチサイズ、プリフェッチバッファサイズ、訓練ステップ数、入力サイズが含まれます。 -
experiment_container_args_dict
: 各実験(モデル)に対する特定の訓練パラメータを定義します。各実験は、共通のパラメータに加えて、モデル特有のパラメータを持ちます。 -
experiment_container_args
: 選択した実験に対応するパラメータを取得します。 -
init_checkpoint
: 初期チェックポイントをGCSバケットにアップロードします。 -
worker_pool_specs
: ワーカープールの仕様を定義します。マシンタイプ、アクセラレータタイプ、アクセラレータの数、レプリカ数、そしてコンテナのイメージURIと引数が設定されます。 -
metric_spec
: モデルのパフォーマンスを最大化するようにメトリックを設定します。 -
LEARNING_RATES
: 学習率のリストをlist型で定義します。それぞれの学習率でモデルを訓練します。 -
MAX_TRIAL_COUNT
: 訓練の試行回数です。学習率のリストの要素数が試行回数となります。 -
parameter_spec
: ハイパーパラメータチューニングのためのパラメータを定義します。ここでは学習率をチューニング対象としています。
次に、下記のコードを実行して、ハイパーパラメータチューニングジョブを実行します。
最後に、下記のコードを実行して、チューニング結果から最良のモデルをTensorFlowのSavedModel形式でエクスポートします。
以下が、パラメータの説明です。
-
worker_pool_specs
: この部分では、ジョブを実行するためのワーカープールの仕様を定義します。ここではマシンタイプ、レプリカ数、コンテナのイメージURI、コマンド、引数が設定されています。 -
aiplatform.CustomJob
: AIプラットフォームのカスタムジョブを作成します。表示名、プロジェクトID、ワーカープールの仕様、ステージングバケットが指定されています。 -
model_export_custom_job.run()
: カスタムジョブを実行します。これにより、最良のモデルがTensorFlowのSavedModel形式でエクスポートされます。
デプロイ・テスト
下記のコードを実行して、モデルレジストリにモデルをデプロイします。
以下が、コードの説明です。
-
aiplatform.Model.upload
: これにより、訓練済みのモデルがAIプラットフォームにアップロードされます。アップロードするモデルの名前、モデルのURI、サービング(予測)用のコンテナのイメージURI、サービング用のコンテナの引数を指定します。 -
model.wait()
: モデルのアップロードが完了するまで待ちます。モデルがアップロードされた後、その名前が出力されます。 -
model.deploy
: アップロードしたモデルをデプロイします。デプロイするモデルの名前、マシンタイプ、トラフィック分割、アクセラレータタイプ、アクセラレータの数、最小レプリカ数、最大レプリカ数を指定します。
次に、下記のコードを実行して、テスト画像を使用して予測を実行します。
ご自身で雲の写真を撮るかフリーの画像を取得して、Google Cloud Storageにアップロードし、その画像のURIを指定してください。
※予測に使用できる画像データの最大ファイルサイズは1.5MBです。(トレーニングに使用できる画像データの最大ファイルサイズは30MBです。)
すると、下の画像のようにテストデータに対して"cirrus"(巻雲)と画像を分類してくれました。
今回用意した画像は"cumulus"(積雲)に近いものなので、正しく分類できてなかったみたいですね^^;
原因は、お試しで3種類の雲の画像データをそれぞれ20枚ずつしか用意しなかったことによる学習不足でしょう。
公式ドキュメントによると、ラベル1種類につき画像データを100枚以上用意することが推奨されているようです。
モデルとジョブの削除
最後に、下記のコードを実行して今回デモで作成したモデルとジョブを忘れずに削除します。
感想
初めてModel Gardenを使ってみましたが、簡単にモデルの作成・トレーニング・チューニング・デプロイ・テストを一通り行うことができました。
Model Gardenは、誰でも簡単に定義済みモデルやチューニングしたモデルを開発することができる動線が整備されているので、効率的で効果的なモデル開発をサポートしてくれます。
一般公開後も続々と新たな定義済みモデルが追加されているので、今後の発展も非常に楽しみです!
皆さんも是非、一般公開となったModel Garedenをモデル開発に活用してみてください!
Discussion