画像分類組み込みアルゴリズム スタートガイド

AI Platform Training の組み込みアルゴリズムを使用すると、トレーニング アプリケーションのコードを一切作成せずに、トレーニング データの送信とアルゴリズムの選択を行い、AI Platform Training による前処理とトレーニングを実施できます。画像組み込みアルゴリズムを使用すると、最小限の構成を使用し TPU 上でトレーニングできます。結果として生成される TensorFlow SavedModel は、CPU と GPU での処理に対応しています。

概要

このチュートリアルでは、コードを一切作成せずに画像分類モデルをトレーニングします。Flowers データセットを AI Platform Training に送信してトレーニングを行い、AI Platform Prediction にモデルをデプロイして予測を取得します。結果のモデルでは、花の画像がデイジー、チューリップ、バラ、ヒマワリ、タンポラなどの種に基づいて分類されます。

始める前に

コマンドラインでこのチュートリアルを実行するには、Cloud Shell を使用するか、Cloud SDK がインストールされている環境を使用します。

次の手順に従って、GCP アカウントの設定、必要な API の有効化、Cloud SDK のインストールと有効化を行います。

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. AI Platform Training & Prediction and Compute Engine API を有効にします。

    API を有効にする

  5. Cloud SDK をインストールして初期化します。
  6. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  7. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  8. AI Platform Training & Prediction and Compute Engine API を有効にします。

    API を有効にする

  9. Cloud SDK をインストールして初期化します。

Cloud TPU にプロジェクトへのアクセスを認可する

Google Cloud プロジェクトに関連付けられた Cloud TPU サービス アカウント名を承認する手順は次のとおりです。

  1. projects.getConfig を呼び出して、Cloud TPU サービス アカウント名を取得します。例:

    PROJECT_ID=PROJECT_ID
    
    curl -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
        https://ml.googleapis.com/v1/projects/$PROJECT_ID:getConfig
    
  2. API から返された serviceAccountProjecttpuServiceAccount フィールドの値を保存します。

  3. Cloud TPU サービス アカウントを初期化します。

    curl -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
      -H "Content-Type: application/json" -d '{}'  \
      https://serviceusage.googleapis.com/v1beta1/projects/<serviceAccountProject>/services/tpu.googleapis.com:generateServiceIdentity
    

Cloud ML サービス エージェントのロールを使用して、Cloud TPU サービス アカウントをプロジェクト内のメンバーとして追加します。Google Cloud Console または gcloud コマンドを使用して、次の手順を行います。

Console

  1. Google Cloud Console にログインし、TPU を使用しているプロジェクトを選択します。
  2. [IAM と管理] > [IAM] を選択します。
  3. [追加] ボタンをクリックして、プロジェクトにメンバーを追加します。
  4. [メンバー] テキスト ボックスに TPU サービス アカウントを入力します。
  5. [ロール] プルダウン リストをクリックします。
  6. Cloud ML サービス エージェントのロールを有効にします([サービス エージェント] > [Cloud ML サービス エージェント])。

gcloud

  1. プロジェクト ID と Cloud TPU サービス アカウントが格納されている環境変数を設定します。

    PROJECT_ID=PROJECT_ID
    SVC_ACCOUNT=your-tpu-sa-123@your-tpu-sa.google.com.iam.gserviceaccount.com
    
  2. Cloud TPU サービス アカウントに ml.serviceAgent ロールを付与します。

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member serviceAccount:$SVC_ACCOUNT --role roles/ml.serviceAgent
    

サービス アカウントへのロールの付与については、IAM のドキュメントをご覧ください。

設定

このチュートリアルで使用するため、TensorFlow Flowers データセットに変更を加えて、Cloud Storage の公開バケット gs://cloud-samples-data/ai-platform/built-in/image/flowers/ でホストしました。

Console

アルゴリズムを選択する

  1. Google Cloud Console で AI Platform Training の [ジョブ] ページに移動します。

    AI Platform Training の [ジョブ] ページ

  2. [新規トレーニング ジョブ] ボタンをクリックします。下に表示されたオプションから、[組み込みアルゴリズムによるトレーニング] をクリックします。[新しいトレーニング ジョブの作成] ページが表示されます。

  3. トレーニング ジョブの作成は 4 つのステップに分かれています。最初のステップはトレーニング アルゴリズムです。[画像分類] を選択し、[次へ] をクリックします。

トレーニング データ

  1. [トレーニング データ] セクションで、一般公開の Cloud Storage バケットに置かれているサンプル データセット用のトレーニング データを選択します。

    1. [1 つの Cloud Storage ディレクトリに保存されている複数のファイルを使用する] を選択します。

    2. [ディレクトリ パス] に、「cloud-samples-data/ai-platform/built-in/image/flowers/」と入力します。

    3. [ワイルドカードの名前] には、「flowers_train*」と入力して、ディレクトリ内のすべてのトレーニング ファイルを選択します。

    4. [完全な GCS パス] に次のように表示されます。"gs://cloud-samples-data/ai-platform/built-in/image/flowers/flowers_train*"

  2. [検証データ] セクションで、一般公開の Cloud Storage バケットでホストされているサンプル データセット用の検証データを選択します。

    1. [1 つの Cloud Storage ディレクトリに保存されている複数のファイルを使用する] を選択します。

    2. [ディレクトリ パス] に、「cloud-samples-data/ai-platform/built-in/image/flowers/」と入力します。

    3. [ワイルドカードの名前] には、「flowers_validation*」と入力して、ディレクトリ内のすべての検証ファイルを選択します。

    4. [完全な GCS パス] に次のように表示されます。"gs://cloud-samples-data/ai-platform/built-in/image/flowers/flowers_validation*"

  3. AI Platform Training がトレーニングしたモデル、チェックポイント、その他のトレーニング ジョブ出力を保管する Cloud Storage バケットの出力ディレクトリを指定します。バケット内の正確なパスを入力するか、[BROWSE] ボタンをクリックしてパスを選択します。

gcloud

プロジェクト ID、Cloud Storage バケット、Cloud Storage 上のトレーニング データへのパス、使用するアルゴリズムのそれぞれを格納する環境変数を設定します。

AI Platform Training の組み込みアルゴリズムは、Container Registry でホストされている Docker コンテナにあります。

PROJECT_ID="YOUR_PROJECT_ID"
BUCKET_NAME="YOUR_BUCKET_NAME"
REGION="us-central1"

gcloud config set project $PROJECT_ID
gcloud config set compute/region $REGION

# Set paths to the training and validation data.
TRAINING_DATA_PATH="gs://cloud-samples-data/ai-platform/built-in/image/flowers/flowers_train*"
VALIDATION_DATA_PATH="gs://cloud-samples-data/ai-platform/built-in/image/flowers/flowers_validation*"

# Specify the Docker container for your built-in algorithm selection.
IMAGE_URI="gcr.io/cloud-ml-algos/image_classification:latest"

トレーニング ジョブを送信する

ジョブを送信するには、基本的なトレーニング引数と、画像分類アルゴリズムに関する基本的な引数を指定する必要があります。

トレーニング ジョブの一般的な引数:

トレーニング ジョブの引数
引数 説明
job-id トレーニング ジョブの一意の ID。トレーニング ジョブを送信した後、この ID を使用してログを検索しトレーニング ジョブのステータスを確認できます。
job-dir トレーニング ジョブが正常に完了した後に AI Platform Training がトレーニング ファイルを保存する Cloud Storage のパス。
scale-tier トレーニング用のマシンタイプを指定します。単一マシン構成を選択するには、BASIC を使用します。
master-image-uri トレーニング ジョブに使用する Docker コンテナを指定するための Container Registry URI。すでに IMAGE_URI として定義されている画像分類組み込みアルゴリズムのコンテナを使用します。
region トレーニング ジョブを実行するために利用可能なリージョンを指定します。このチュートリアルでは、us-central1 リージョンを使用できます。

画像分類組み込みアルゴリズムに固有の引数:

アルゴリズムの引数
引数 説明
training_data_path トレーニングに使用される TFRecord パスパターンのパス。
validation_data_path 検証に使用される TFRecord パスパターンのパス。
pretrained_checkpoint_path 事前にトレーニングされたチェックポイントのパス。パブリッシュされたチェックポイントを使用できます。
num_classes トレーニング / 検証データ内のクラスの数。
max_steps トレーニング ジョブを実行するステップの数。
train_batch_size トレーニング ステップごとに使用する画像の数。
num_eval_images 評価に使用される画像の合計数。
これが 0 の場合、validation_data_path 内のすべての画像が評価に使用されます。
learning_rate_decay_type トレーニング中に学習率を減衰させる方法。
warmup_learning_rate ウォームアップ フェーズの開始時の学習率。
warmup_steps ウォームアップ フェーズで実行するステップの数、またはステップ内のウォームアップ フェーズの長さ。トレーニング ジョブはウォームアップ フェーズで warmup_learning_rate を使用します。ウォームアップ フェーズが終了すると、トレーニング ジョブは initial_learning_rate を使用します。
initial_learning_rate ウォームアップ フェーズ完了後の初期学習率。
stepwise_learning_rate_steps 段階的学習率減衰型の学習率を減衰または変化させるステップ。
たとえば、100,200 は学習率がステップ 100 とステップ 200 で(stepwise_learning_rate_levels に関して)変わることを意味します。これは learning_rate_decay_type が段階的に設定されている場合にのみ使用されます。
stepwise_learning_rate_levels 段階的学習率減衰型の各ステップの学習率値。これは learning_rate_decay_type が段階的に設定されている場合にのみ使用されます。
image_size トレーニングに使用される画像サイズ(幅と高さ)。
optimizer_type トレーニングに使用されるオプティマイザ。次のいずれかになります。
{momentum, adam, rmsprop}
optimizer_arguments オプティマイザの引数。「name=value」ペアのカンマ区切りのリストです。optimizer_type と互換性がある必要があります。例:
  • Momentum オプティマイザの場合、momentum=0.9 を受け入れます。詳細については、tf.train.MomentumOptimizer をご覧ください。
  • Adam オプティマイザの場合、beta1=0.9,beta2=0.999 にすることが可能です。詳細については、tf.train.AdamOptimizer をご覧ください。
  • RMSProp オプティマイザの場合、decay=0.9,momentum=0.1,epsilon=1e-10 にすることが可能です。詳しくは、RMSPropOptimizer をご覧ください。
model_type モデルをトレーニングするために使用されるモデル アーキテクチャのタイプ。次のいずれかになります。
  • resnet-(18|34|50|101|152|200)
  • efficientnet-(b0|b1|b2|b3|b4|b5|b6|b7)
label_smoothing softmax_cross_entropy で使用されるラベル スムージング パラメータ。
weight_decay L2 正則化のための重み減衰係数。 loss = cross_entropy + params['weight_decay'] * l2_loss

画像分類アルゴリズムに関するほかのあらゆるフラグの詳細リストについては、画像分類組み込みアルゴリズムのリファレンスをご覧ください。

Console

アルゴリズムの引数

[アルゴリズムの引数] タブの最初の部分に、次の値を入力します。

  • クラス数: 5
  • 最大ステップ数: 15,000
  • トレーニングのバッチサイズ: 128
  • 評価画像の数: 1

[アルゴリズムの引数] タブの [モデル セクション] 内:

  1. [モデルタイプ] には、[Efficientnet-b4] を選択します。
  2. [Pretrained checkpoint path] は空白のままにします。
  3. [Label smoothing] と [Weight Decay] はデフォルト値のままにします。

ジョブの設定

[ジョブの設定] タブで次の操作を行います。

  1. [ジョブ ID] に一意の ID(「image_classification_example」など)を入力します。
  2. [リージョン] に使用可能なリージョン(「us-central1」など)を入力します。
  3. マシンタイプを選択するには、[スケール階層] で [CUSTOM] を選択します。カスタム クラスタ仕様を指定するためのセクションが表示されます。
    1. [マスタータイプ] には、[complex_model_m] を選択します。
    2. [ワーカータイプ] には、[cloud_tpu] を選択します。[ワーカー数] はデフォルトで 1 に設定されます。

[完了] をクリックしてトレーニング ジョブを送信します。

gcloud

  1. gcloud でジョブを送信する前に、トレーニング ジョブとアルゴリズムのすべての引数を設定します。

    DATASET_NAME="flowers"
    ALGORITHM="image_classification"
    MODEL_NAME="${DATASET_NAME}_${ALGORITHM}_model"
    
    # Give a unique name to your training job.
    DATE="$(date '+%Y%m%d_%H%M%S')"
    JOB_ID="${MODEL_NAME}_${DATE}"
    
    # Make sure you have access to this Cloud Storage bucket.
    JOB_DIR="gs://${BUCKET_NAME}/algorithms_training/${MODEL_NAME}/${DATE}"
    
  2. ジョブを送信します。

    gcloud ai-platform jobs submit training $JOB_ID \
      --region=$REGION \
      --config=config.yaml \
      --master-image-uri=$IMAGE_URI \
      -- \
      --training_data_path=$TRAINING_DATA_PATH \
      --validation_data_path=$VALIDATION_DATA_PATH \
      --job-dir=$JOB_DIR \
      --max_steps=30000 \
      --train_batch_size=128 \
      --num_classes=5 \
      --num_eval_images=100 \
      --initial_learning_rate=0.128 \
      --warmup_steps=1000 \
      --model_type='efficientnet-b4'
    

  3. ジョブが正常に送信されたら、次の gcloud コマンドを使用してログを表示できます。

    gcloud ai-platform jobs describe $JOB_ID
    gcloud ai-platform jobs stream-logs $JOB_ID
    

ジョブ ディレクトリについて

トレーニング ジョブが正常に完了すると、AI Platform Training によってトレーニング済みモデルとその他のアーティファクトが Cloud Storage バケットに作成されます。JOB_DIR 内のディレクトリ構造は次のようになっています。

  • model/(TensorFlow SavedModel ディレクトリdeployment_config.yaml ファイルも格納します)
    • saved_model.pb
    • deployment_config.yaml
  • eval/
    • events.out.tfevents.[timestamp].cmle-training-[timestamp]
    • events.out.tfevents...
    • ...
  • variables/
    • variables.data-00000-of-00001
    • variables.index

ジョブ ディレクトリには、さまざまなモデル チェックポイント ファイルも格納されます。

JOB_DIR のディレクトリ構造が上記と一致していることを確認します。

gsutil ls -a $JOB_DIR/*

トレーニング済みモデルをデプロイする

AI Platform Training は、モデルリソースとバージョン リソースを使用してトレーニング済みモデルを整理します。AI Platform Training モデルは、機械学習モデルの複数のバージョンを格納するコンテナに相当します。

モデルをデプロイするには、AI Platform Training でモデルリソースを作成し、そのモデルのバージョンを作成してから、そのモデルとバージョンを使用してオンライン予測をリクエストします。

モデルを AI Platform Training にデプロイする方法については、TensorFlow モデルをデプロイする方法をご覧ください。

Console

  1. [ジョブ] ページには、すべてのトレーニング ジョブが一覧表示されます。先ほど送信したトレーニング ジョブの名前(「image_classification」または実際に使用したジョブ名)をクリックします。

  2. [ジョブの詳細] ページでは、ジョブの全般的な進行状況を確認できます。[ログを表示] をクリックすると、進行状況の詳細が表示されます。

  3. ジョブが成功すると、[モデルをデプロイ] ボタンが上部に表示されます。[モデルをデプロイ] をクリックします。

  4. [新しいモデルとしてデプロイ] を選択し、モデル名(「algorithms_image_classification_model」など)を入力します。次に、[確認] をクリックします。

  5. [バージョンの作成] ページでバージョン名(「v1」など)を入力します。他のフィールドはすべてデフォルト設定のままにします。[保存] をクリックします。

gcloud

画像分類組み込みアルゴリズムを使用するトレーニング プロセスでは、deployment_config.yaml ファイルが生成されます。これを使用して、予測用のモデルを AI Platform Training に簡単にデプロイできます。

  1. ファイルをローカル ディレクトリにコピーし、その内容を表示します。

    gsutil cp $JOB_DIR/model/deployment_config.yaml .
    cat deployment_config.yaml
    

    deployment_config.yaml ファイルの内容は次のようになっているはずです。

    deploymentUri: gs://BUCKET_NAME/algorithms_training/flowers_image_classification/model
    framework: TENSORFLOW
    labels:
      global_step: '1000'
      job_id: flowers_image_classification_20190227060114
    runtimeVersion: '1.14'
    
  2. AI Platform Training でモデルとバージョンを作成します。

    gcloud ai-platform models create $MODEL_NAME --regions $REGION
    
    # Create a model and a version using the file above.
    VERSION_NAME="v_${DATE}"
    
    gcloud ai-platform versions create $VERSION_NAME \
      --model $MODEL_NAME \
      --config deployment_config.yaml
    

    バージョンの作成には数分かかります。

オンライン予測を取得する

予測をリクエストするときは、入力データが JSON 形式であることを確認する必要があります。

  1. トレーニング アーティファクト ファイルをダウンロードします。

    gsutil cp $JOB_DIR/artifacts/* .
    
  2. 1 つの画像の予測入力を準備します。

    オンライン予測リクエストを送信するには、gcloud コマンドライン ツールを使用して、改行で区切られた JSON ファイルに各インスタンスを書き込みます。下記の例をご覧ください。

    ターミナルで次のコマンドを実行して、AI Platform Prediction に送信できる単一インスタンスの入力を作成します。

    次の Python スクリプトは、base64 を使用して単一の画像をエンコードし、予測用に形式設定します。また、インスタンス キーを追加して、prediction_instances.json という名前のファイルに結果を書き込みます。

    import json
    import base64
    import tensorflow as tf
    
    IMAGE_URI='gs://cloud-samples-data/ai-platform/built-in/image/tutorial_examples/daisy.jpg'
    
    with tf.gfile.Open(IMAGE_URI, 'rb') as image_file:
      encoded_string = base64.b64encode(image_file.read()).decode('utf-8')
    
    image_bytes = {'b64': str(encoded_string)}
    instances = {'image_bytes': image_bytes, 'key': '1'}
    with open("prediction_instances.json","w") as f:
      f.write(json.dumps(instances))
    
  3. 予測リクエストを送信します。

    gcloud ai-platform predict --model $MODEL_NAME \
     --version $VERSION_NAME \
     --json-instances prediction_instances.json
    

予測出力には、高い確率でクラス daisy が含まれます。これは、デプロイされたモデルが、入力画像をデイジーと分類したことを示します(トレーニングは非決定論的であるため、モデルが異なる予測をする可能性もあります)。

データについて

このサンプルでトレーニングに使用している花データセットは、TensorFlow チームが提供しています。

次のステップ