組み込みの画像分類アルゴリズムを使用したトレーニング

AI Platform Training での組み込みアルゴリズムを使用したトレーニングでは、データセットを送信し、トレーニング コードを一切作成せずに、モデルをトレーニングできます。このページでは、組み込みの画像分類アルゴリズムの仕組みと使い方について説明します。

概要

組み込みの画像分類アルゴリズムは、トレーニングと検証のデータセットを使用してモデルを継続的にトレーニングし、トレーニング ジョブの過程で生成された最も正確な SavedModel を出力します。ハイパーパラメータ調整を使用してモデルの精度を最適化することもできます。エクスポートされた SavedModel は、ローカルでの予測に直接使用することも、本番環境サービス用に AI Platform Prediction にデプロイすることもできます。

制限事項

組み込みの画像検出アルゴリズムでは、単一 CPU、GPU、TPU によるトレーニングがサポートされています。結果として生成される SavedModel は、CPU および GPU での処理と互換性があります。

次の機能は、組み込み画像分類アルゴリズムを使用したトレーニングではサポートされていません。

  • 分散トレーニングAI Platform Training で TensorFlow 分散トレーニング ジョブを実行するには、トレーニング アプリケーションを作成する必要があります。
  • マルチ GPU トレーニング。組み込みアルゴリズムによって使用される GPU は一度に 1 つだけです。1 台のマシンで複数の GPU を使用したトレーニングを行うには、トレーニング アプリケーションを作成する必要があります。マシンタイプの詳細については、こちらをご覧ください。

サポートされているマシンタイプ

次の AI Platform Training スケール階層とマシンタイプがサポートされています。

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

入力データをトレーニング用にフォーマットする

組み込みの画像分類アルゴリズムでは、入力データを tf.Examples としてフォーマットし、TFRecord ファイルに保存する必要があります。tf.Example データ構造と TFRecord ファイル形式はいずれも、TensorFlow を使用した効率的なデータ読み取りに対応するように設計されています。

TFRecord は、一連のバイナリ レコードを格納するシンプルな形式です。この場合、すべてのレコードに画像のバイナリ表現が含まれています。各画像は、そのクラスラベルと組み合わせて tf.Example として表されます。多数の tf.Example を 1 つの TFRecord ファイルに保存できます。また、複数の TFRecord ファイル間で大きなデータセットをシャーディングすることもできます。

詳細については、TFRecord と tf.Example をご覧ください。

画像を TFRecord に変換する

TensorFlow には、画像を JPEG から TFRecord 形式に変換するために使用できるスクリプトが用意されています。

このスクリプトは次の場合に使用できます。

  • 画像を Cloud Storage に格納する。
  • Cloud Storage 内の画像へのパスおよびそれぞれの対応するラベルを含む CSV ファイルが存在する。例:

    gs://cloud-ml-data/img/flower_photos/daisy/754296579_30a9ae018c_n.jpg,daisy
    gs://cloud-ml-data/img/flower_photos/dandelion/18089878729_907ed2c7cd_m.jpg,dandelion
    
  • これらの CSV ファイルを Cloud Storage に格納する。

次の例は、スクリプトの実行方法を示しています。

  1. スクリプトをダウンロードします。

    curl https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/jpeg_to_tf_record.py > ./jpeg_to_tf_record.py
    
  2. プロジェクト ID とバケット名の変数をまだ設定していない場合は設定します。

    PROJECT_ID="YOUR_PROJECT_ID"
    BUCKET_NAME="YOUR_BUCKET_NAME"
    
  3. 対象のデータセットについて、考えられるすべてのラベルのリストを一時ファイルに作成します。

    cat << EOF > /tmp/labels.txt
    daisy
    dandelion
    roses
    sunflowers
    tulips
    EOF
    
  4. 一般公開されている cloud-ml-data バケットおよび独自のラベルリストに含まれている花データを使用してスクリプトを実行します。

    python -m jpeg_to_tf_record.py \
           --train_csv gs://cloud-ml-data/img/flower_photos/train_set.csv \
           --validation_csv gs://cloud-ml-data/img/flower_photos/eval_set.csv \
           --labels_file /tmp/labels.txt \
           --project_id $PROJECT_ID \
           --output_dir gs://$BUCKET_NAME/flowers_as_tf_record
    

Cloud Storage バケットの権限を確認する

データを保存するには、AI Platform Training ジョブの実行に使用している Google Cloud プロジェクトの Cloud Storage バケットを使用します。それ以外の場合は、データが保存されている Cloud Storage バケットへのアクセス権を AI Platform Training に付与します。

必須の入力形式

組み込みの画像分類アルゴリズムを使用してトレーニングするには、次のフィールドを含む tf.Example として画像データを構造化する必要があります。

  • image/encoded は、RAW 画像文字列です。

  • image/class/label は、対応する画像の単一の整数ラベルです。 インスタンスごとに複数のラベルを指定することはできません。

    データセットに使用される整数ラベルのセットは、1 から始まる連続したシーケンスにする必要があります。たとえば、データセットに 5 つのクラスがある場合、各ラベルは範囲 [1, 5] 内の整数でなければなりません。

例:

{
    'image/encoded': '<encoded image data>',
    'image/class/label': 2
}

最適な SavedModel を出力として取得する

トレーニング ジョブが完了したら、そのジョブの送信時に jobDir として指定した Cloud Storage バケットに TensorFlow SavedModel が書き込まれます。SavedModel は jobDir/model に書き込まれます。たとえば、ジョブを gs://your-bucket-name/your-job-dir に送信した場合、SavedModel は gs://your-bucket-name/your-job-dir/model に書き込まれます。

ハイパーパラメータ調整を有効にしている場合は、トレーニング プロセスの中で最も精度が高かった TensorFlow SavedModel が返されます。たとえば、2,500 トレーニング ステップで構成されるトレーニング ジョブを送信し、2,000 ステップにおける精度が最も高かった場合、その特定の時点で保存された TensorFlow SavedModel が返されます。

AI Platform Training の各トライアルでは、最も精度が高い TensorFlow SavedModel が Cloud Storage バケット内の個別のディレクトリに書き込まれます。例: gs://your-bucket-name/your-job-dir/model/trial_{trial_id}

出力の SavedModel の署名は次のとおりです。

signature_def['serving_default']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['image_bytes'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: Placeholder:0
    inputs['key'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: key:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['classes'] tensor_info:
        dtype: DT_INT64
        shape: (-1)
        name: ArgMax:0
    outputs['key'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: Identity:0
    outputs['probabilities'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 1000)
        name: softmax_tensor:0
  Method name is: tensorflow/serving/predict

入力:

  • image_bytes: RAW(デコードされていない)画像バイト。tf.Example に格納される image/encoded と同じです。
  • key: 予測入力の文字列値の識別子。この値は出力 key に渡されます。バッチ予測において予測出力を入力にマッピングするのに役立ちます。

出力:

  • classes: 予測クラス(整数)ラベル。最も可能性が高いラベルです。
  • key: 出力キー。
  • probabilities: 各 class(0 から num_classes の範囲)の probability(0~1)

次に、予測の入力と出力の例を示します。

prediction_input: {
  'image_bytes': 'some_raw_image_bytes',
  'key': ['test_key'])
}

prediction_output: {
  'probabilities': [[0.1, 0.3, 0.6]],
  'classes': [2],
  'key': ['test_key'],
}

構成例

gcloud を使用してジョブを送信する場合は、マシンタイプとハイパーパラメータ調整仕様の config.yaml ファイルを作成する必要があります。Google Cloud Console を使用する場合は、このファイルを作成する必要はありません。トレーニング ジョブの送信方法をご覧ください。

次のサンプル config.yaml ファイルは、トレーニング ジョブ用の TPU リソースを割り当てる方法を示しています。

cat << EOF > config.yaml
trainingInput:
  # Use a cluster with many workers and a few parameter servers.
  scaleTier: CUSTOM
  masterType: n1-highmem-16
  masterConfig:
    imageUri: gcr.io/cloud-ml-algos/image_classification:latest
  workerType:  cloud_tpu
  workerConfig:
   imageUri: gcr.io/cloud-ml-algos/image_classification:latest
   acceleratorConfig:
     type: TPU_V2
     count: 8
  workerCount: 1
EOF

次に、config.yaml ファイルを使用して、トレーニング ジョブを送信します。

ハイパーパラメータ調整構成

ハイパーパラメータ調整を使用するには、ハイパーパラメータ調整構成をマシン構成と同じ config.yaml ファイルに含めます。

各ハイパーパラメータの簡単な説明については、Google Cloud Console 内で確認できます。より包括的な説明については、組み込みの画像分類アルゴリズムのリファレンスをご覧ください。

次のサンプル config.yaml ファイルは、トレーニング ジョブ用の TPU リソースを割り当てる方法を示しています。また、ハイパーパラメータ調整構成が含まれています。

cat << EOF > config.yaml
trainingInput:
  # Use a cluster with many workers and a few parameter servers.
  scaleTier: CUSTOM
  masterType: n1-highmem-16
  masterConfig:
    imageUri: gcr.io/cloud-ml-algos/image_classification:latest
  workerType:  cloud_tpu
  workerConfig:
   imageUri: gcr.io/cloud-ml-algos/image_classification:latest
   tpuTfVersion: 1.14
   acceleratorConfig:
     type: TPU_V2
     count: 8
  workerCount: 1
  # The following are hyperparameter configs.
  hyperparameters:
   goal: MAXIMIZE
   hyperparameterMetricTag: top_1_accuracy
   maxTrials: 6
   maxParallelTrials: 3
   enableTrialEarlyStopping: True
   params:
   - parameterName: initial_learning_rate
     type: DOUBLE
     minValue: 0.001
     maxValue: 0.2
     scaleType: UNIT_LOG_SCALE
EOF

画像分類トレーニング ジョブを送信する

このセクションでは、組み込み画像分類アルゴリズムを使用するトレーニング ジョブの送信方法について説明します。

Console

アルゴリズムを選択する

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

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

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

  3. [新しいトレーニング ジョブの作成] ページで、[画像分類] を選択し、[次へ] をクリックします。

トレーニング データと検証データを選択する

  1. [トレーニング データ] のプルダウン ボックスで、1 つのファイルを使用するか、複数のファイルを使用するかを指定します。

    • 1 つのファイルを使用する場合は、[GCS バケットに格納されている単一ファイルを使用する] を選択したままにします。
    • 複数のファイルを使用する場合は、[1 つの Cloud Storage ディレクトリに保存されている複数のファイルを使用する] を選択します。
  2. [ディレクトリ パス] で [参照] をクリックします。右パネルで、トレーニング データをアップロードしたバケットの名前をクリックし、ファイルに移動します。

    複数のファイルを選択する場合は、[ワイルドカードの名前] にワイルドカード文字を入力します。パスが正しいことを確認できるように、下に [Complete GCS path] が表示されます。

  3. [検証データ] のプルダウン ボックスで、1 つのファイルを使用するか、複数のファイルを使用するかを指定します。

    • 1 つのファイルを使用する場合は、[GCS バケットに格納されている単一ファイルを使用する] を選択したままにします。
    • 複数のファイルを使用する場合は、[1 つの Cloud Storage ディレクトリに保存されている複数のファイルを使用する] を選択します。
  4. [ディレクトリ パス] で [参照] をクリックします。右パネルで、トレーニング データをアップロードしたバケットの名前をクリックし、ファイルに移動します。

    複数のファイルを選択する場合は、[ワイルドカードの名前] にワイルドカード文字を入力します。パスが正しいことを確認できるように、下に [Complete GCS path] が表示されます。

  5. [出力ディレクトリ] に、AI Platform Training によってトレーニング ジョブからの出力が保存される Cloud Storage バケットへのパスを入力します。Cloud Storage バケットのパスを直接入力するか、[参照] ボタンをクリックしてパスを選択します。

    ストレージを整理するため、このトレーニング ジョブ用の新しいディレクトリを Cloud Storage バケットに作成します。これは [参照] ペインで行うことができます。

    [次へ] をクリックします。

アルゴリズム引数を設定する

アルゴリズム固有の各引数には、ハイパーパラメータ調整なしのトレーニング ジョブのデフォルト値が表示されます。アルゴリズム引数でハイパーパラメータ調整を有効にする場合は、最小値と最大値を指定する必要があります。

すべてのアルゴリズム引数の詳細については、Google Cloud Console 内のリンクをたどって、組み込みの画像分類のリファレンスをご覧ください。

ジョブを送信する

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

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

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

gcloud

  1. ジョブの環境変数を設定します。

    PROJECT_ID="YOUR_PROJECT_ID"
    BUCKET_NAME="YOUR_BUCKET_NAME"
    
    # Specify the same region where your data is stored
    REGION="YOUR_REGION"
    
    gcloud config set project $PROJECT_ID
    gcloud config set compute/region $REGION
    
    # Set Cloud Storage paths to your training and validation data
    # Include a wildcard if you select multiple files.
    TRAINING_DATA_PATH="gs://${BUCKET_NAME}/YOUR_DATA_DIRECTORY/train-*.tfrecord"
    VALIDATION_DATA_PATH="gs://${BUCKET_NAME}/YOUR_DATA_DIRECTORY/eval-*.tfrecord"
    
    # Specify the Docker container for your built-in algorithm selection
    IMAGE_URI="gcr.io/cloud-ml-algos/image_classification:latest"
    
    # Variables for constructing descriptive names for JOB_ID and JOB_DIR
    DATASET_NAME="flowers"
    ALGORITHM="image_classification"
    MODEL_NAME="${DATASET_NAME}_${ALGORITHM}"
    DATE="$(date '+%Y%m%d_%H%M%S')"
    
    # Specify an ID for this job
    JOB_ID="${MODEL_NAME}_${DATE}"
    
    # Specify the directory where you want your training outputs to be stored
    JOB_DIR="gs://${BUCKET_NAME}/algorithm_training/${JOB_ID}"
    
  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
    

次のステップ