Vertex AI Model Garden上のResNetモデルをColab Enterpriseノートブックでファインチューニングする

人類はこの時期、ジンジャーエールとコカ・コーラと午後の紅茶(無糖)を分類したくなる生き物
2023.12.26

データアナリティクス事業本部 インテグレーション部 機械学習チームの貞松です。

この記事は、ブログリレー『Google CloudのAI/MLとかなんとか』の10本目の記事になります。

3行まとめ

  • Vertex AI Model Gardenで用意されているモデルにはファインチューニングが実行可能なモデルが幾つか存在する
  • ファインチューニング可能なモデルから、ResNetモデルを例として、Colab Enterpriseのサンプルノートブックを使用したファインチューニングを実行してみる
  • ユーザー側で準備が必要なファインチューニング用のデータセットやノートブック上の設定項目を確認しつつ、ファインチューニングの手順について一通り解説する

Vertex AI Model Gardenで用意されているファインチューニング可能なモデル

Vertex AI Model Gardenで用意されているファインチューニング可能なモデルは、モデルカードの一覧にある「Fine-tunable models」セクションに含まれるモデルです。

ファインチューニング可能なモデルの一部はVertex AI PipelinesのPipelineテンプレートを使用しますが、その他大半はColab Enterpriseのノートブックサンプルを使用してファインチューニングを実行する方式です。

Vertex AI Model Gardenのモデルカード一覧からResNetモデルを選択する

今回はResNetモデルのファインチューニングを実行し、手持ちの画像データを分類できるモデルを作成していきます。

モデルカードの一覧から「ResNet (with checkpoint)」を選択します。

詳細画面で「OPEN NOTEBOOK」をクリックします。

Colab Enterpriseでファインチューニング用のサンプルノートブックが開きます。

Colab Enterpriseノートブック上でResNetモデルのファインチューニングを実行する

ファインチューニング用のデータセット準備

ファインチューニング用のデータセットとして、以下のような画像の詰め合わせを用意しました。この時期になると人類は無性にジンジャーエールとコカ・コーラと午後の紅茶(無糖)を分類したくなるものです。

用意した画像を任意のCloud Storageに配置します。

また、配置した画像ファイルとそれに対応したラベルを記載したメタデータ(CSV)を用意する必要があるので、そちらも併せて作成しておきます。フォーマットは下記の公式ドキュメントを参考にしてください。

以下、実際に作成したファイルの一部抜粋です。1列目が画像ファイルの配置されているCloud StorageのURIで、2列目がラベルです。今回は「ginger_ale」「coca_cola」「afternoon_tea」の3ラベルをそれぞれ割り当てています。

こちらのCSVファイルも任意のCloud Storageに配置しておきます。

サンプルノートブックの構成

サンプルノートブックで実行される処理はザックリ以下の通りです。

  • Colab環境に関する設定
    • ライブラリインストールやカーネルの操作など
  • Google Cloud Projectに関する設定
    • Project IDやCloud Storage Bucketの指定など
  • 定義関連
    • 各種ジョブで使用するパラメータなどの定義
  • 共通的な処理の定義
  • ファインチューニングの実行
    • Vertex AIのCustom JobとHyperparameter Jobを使用
  • ファインチューニング実行後モデルのテスト
    • モデルのデプロイ
    • デプロイされたモデルを使ってテスト画像の分類実行
  • リソースのクリーンアップ
    • 後片付け

修正が必要な箇所

「Define constants」のセクションでトレーニングに使用するコンピューティングに関する設定値の定義(コメント# Training constants.の部分)で、TRAIN_MACHINE_TYPE = "n1-highmem-16"TRAIN_ACCELERATOR_TYPE = "NVIDIA_TESLA_P100"の組み合わせで記述されていますが、後々トレーニングのジョブを実行すると「NVIDIA_TESLA_P100はn1-highmem-16でサポートされていない」旨のエラーで死にます。

公式ドキュメントを見ても、サポートされているようにしか見えないのですが…仕方がないので、色々試してみた結果正常に動作したNVIDIA_TESLA_T4に変更します。

変更後のコードは以下です。

# Training constants.
TRAINING_JOB_PREFIX = "train"
TRAIN_CONTAINER_URI = f"{REGION_PREFIX}-docker.pkg.dev/vertex-ai/vertex-vision-model-garden-dockers/tfvision-oss"
TRAIN_MACHINE_TYPE = "n1-highmem-16"
TRAIN_ACCELERATOR_TYPE = "NVIDIA_TESLA_T4" # <-ここが元々はNVIDIA_TESLA_P100だった
TRAIN_NUM_GPU = 1

必要な設定項目

サンプルノートブック内の数ヶ所で設定値の入力が必要なので、順番に入力していきます。

まずは実行環境のGoogle Cloud Projectに関する設定です。

  • PROJECT_ID
  • BUCKET_URI
  • REGION
    • リージョンについては、この後指定するメタデータ(CSV)の配置場所であるCloud Storageと同じリージョンを指定する必要があるので注意してください。

ファインチューニング用のデータセットに関する設定を入力します。

  • input_file_path
    • 前述Cloud Storageに配置したメタデータ(CSV)のURIを入力します。
  • input_file_type
    • ここではcsvを選択します。
  • num_classes
    • 今回は「ginger_ale」「coca_cola」「afternoon_tea」の3つに分類するので「3」を入力します。

ファインチューニングのベースとなるモデルを指定します。

  • experiment
    • 今回は「ResNet-50」を指定します。

ファインチューニング後モデルのテスト実行で使用するファイルを指定します。

  • test_filepath
    • これはColab Enterpriseのローカルディスク上にあるファイルを指定することになる為、予めファイルをアップロードしておいてください。
    • Colab Enterpriseのデフォルトディレクトリは/contentなので、ドラッグアンドドロップ等で普通にファイルアップロードした場合は/content/hogehoge.jpgのような指定になると思います。

ファインチューニングの実行とチューニング後のモデル評価

ここまで来ればあとはノートブックを上から順番に実行していくだけです。

最終的にチューニング後のモデルで画像分類した結果を以下に数点掲載します。

残念、午後の紅茶(無糖)だけ間違ってジンジャーエール判定されてますね、画像の枚数不足か学習イテレーションが少なかったかというところでしょうが、とりあえず他2つは上手いこと分類できているので、多少手を加えれば問題なく分類できるモデルになりそうです。

クリーンアップ

使用済みでお役御免のリソースクリーンアップは(コスト的な意味で)大事です。ノートブックの最後のセルを実行して綺麗さっぱり削除しておきましょう。

おわりに

今回はVertex AI Model Gardenで用意されているモデルの内、ResNetモデルをColab Enterpriseのサンプルノートブックでファインチューニングする方法について解説しました。

一般的にResNet等の画像分類モデルをファインチューニングする場合、指定したストレージパス以下に規定のディレクトリ構成で画像ファイルを配置するだけで済むことが多い為、正直データセットの準備はちょっと面倒な気がしましたが、Colab Enterpriseの恩恵により、サンプルノートブックに対する設定項目が明確で入力しやすい等、実行環境面でのアドバンテージはあると感じました。