カスタム コンテナを使用した ML モデルのトレーニング

AI Platform Training ではカスタム コンテナ内でのトレーニングをサポートしています。そのため、任意の ML フレームワークまたはアルゴリズムをプリインストールした独自の Docker コンテナを導入して AI Platform Training 上で実行できます。この入門チュートリアルでは、カスタム コンテナを使用して AI Platform Training 上で PyTorch モデルをトレーニングする方法を説明します。

概要

このスタートガイドでは、AI Platform Training 上でのカスタム コンテナを使用したトレーニング プロセスについて説明します。このプロセスでトレーニングするモデルは、MNIST データセットに基づいて手書きの数字を分類する基本的なものです。

このガイドでは、次の手順を説明します。

  • プロジェクトとローカル環境を設定する
  • カスタム コンテナを作成する
    • Dockerfile を作成する
    • Docker イメージをローカルでビルドしてテストする
  • イメージを Container Registry に push する
  • カスタム コンテナで実行するトレーニング ジョブを送信する
  • ハイパーパラメータ調整ジョブを送信する
  • カスタム コンテナで GPU を使用する

始める前に

このスタートガイドでは、Google Cloud CLI がインストールされている環境を使用してください。

任意: カスタム コンテナを使用したトレーニングのコンセプトを確認します。

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

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

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

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

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

    API を有効にする

  5. Google Cloud CLI をインストールします。
  6. gcloud CLI を初期化するには:

    gcloud init
  7. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

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

  8. Google Cloud プロジェクトで課金が有効になっていることを確認します

  9. AI Platform Training & Prediction, Compute Engine and Container Registry API を有効にします。

    API を有効にする

  10. Google Cloud CLI をインストールします。
  11. gcloud CLI を初期化するには:

    gcloud init
  12. Docker をインストールします

    Ubuntu や Debian などの Linux ベースのオペレーティングシステムを使用している場合は、ユーザー名を docker グループに追加して、sudo を使わずに Docker を実行できるようにします。

    sudo usermod -a -G docker ${USER}

    docker グループにユーザー名を追加した後に、システムの再起動が必要となる場合があります。

  13. Docker を開きます。Docker が稼働中であることを確認するには、次の Docker コマンドを実行します。このコマンドにより、現在の時刻と日付が返されることを確認します。
    docker run busybox date
  14. Docker 認証ヘルパーとして gcloud を使用します。
    gcloud auth configure-docker
  15. 省略可: GPU をローカルで使用してコンテナを実行する場合は、nvidia-docker をインストールします。

Cloud Storage バケットの設定

このセクションでは、新しいバケットを作成する方法を説明します。既存のバケットを使用することもできますが、AI Platform ジョブを実行する予定のリージョンと同じリージョンにある必要があります。また、AI Platform Training を実行するプロジェクトに含まれていない場合は、明示的に AI Platform Training サービス アカウントへのアクセスを許可する必要があります。

  1. 新しいバケットに名前を指定します。名前は Cloud Storage のすべてのバケット全体で重複しないようにする必要があります。

    BUCKET_NAME="YOUR_BUCKET_NAME"

    たとえば、プロジェクト名に -aiplatform を追加したものを使います。

    PROJECT_ID=$(gcloud config list project --format "value(core.project)")
    BUCKET_NAME=${PROJECT_ID}-aiplatform
  2. 作成したバケット名を確認します。

    echo $BUCKET_NAME
  3. バケットのリージョンを選択して、REGION 環境変数を設定します。

    AI Platform Training ジョブを実行する予定のリージョンと同じリージョンを使用してください。AI Platform Training サービスに利用可能なリージョンをご覧ください。

    たとえば、次のコードは REGION を作成し、us-central1 に設定します。

    REGION=us-central1
  4. 新しいバケットを作成します。

    gsutil mb -l $REGION gs://$BUCKET_NAME

このチュートリアルのコードをダウンロードする

  1. 次のコマンドを入力して、AI Platform Training のサンプル zip ファイルをダウンロードします。

    wget https://github.com/GoogleCloudPlatform/cloudml-samples/archive/master.zip
    
  2. ファイルを解凍して、cloudml-samples-master ディレクトリを抽出します。

    unzip master.zip
    
  3. cloudml-samples-master > pytorch > containers > quickstart > mnist ディレクトリに移動します。このチュートリアルのコマンドは、mnist ディレクトリから実行する必要があります。

    cd cloudml-samples-master/pytorch/containers/quickstart/mnist
    

カスタム コンテナの作成

カスタム コンテナを作成するには、最初のステップとして、トレーニング ジョブに必要な依存関係をインストールするための Dockerfile を定義します。次に、Docker イメージをローカルでビルドしてテストします。これは、AI Platform Training で使用する前に、イメージが正常に動作することを確認するためです。

Dockerfile を作成する

このチュートリアルに用意されているサンプル Dockerfile は、次のステップを実行します。

  1. Python 依存関係が組み込まれた Python 2.7 ベースイメージを使用します。
  2. PyTorch、gcloud CLI、ハイパーパラメータ調整用の cloudml-hypertune など、追加の依存関係をインストールします。
  3. トレーニング アプリケーションのコードをコンテナにコピーします。
  4. コンテナの起動時に AI Platform Training がトレーニング コードを実行するエントリ ポイントを構成します。

必要に応じて、作成する Dockerfile に追加のロジックを含めることもできます。詳細については、Dockerfiles の作成方法をご覧ください。

# Copyright 2019 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the \"License\");
# you may not use this file except in compliance with the License.\n",
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an \"AS IS\" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Dockerfile
FROM python:2.7.16-jessie
WORKDIR /root

# Installs pytorch and torchvision.
RUN pip install torch==1.0.0 torchvision==0.2.1

# Installs cloudml-hypertune for hyperparameter tuning.
# It’s not needed if you don’t want to do hyperparameter tuning.
RUN pip install cloudml-hypertune

# Installs google cloud sdk, this is mostly for using gsutil to export model.
RUN wget -nv \
    https://dl.google.com/dl/cloudsdk/release/google-cloud-sdk.tar.gz && \
    mkdir /root/tools && \
    tar xvzf google-cloud-sdk.tar.gz -C /root/tools && \
    rm google-cloud-sdk.tar.gz && \
    /root/tools/google-cloud-sdk/install.sh --usage-reporting=false \
        --path-update=false --bash-completion=false \
        --disable-installation-options && \
    rm -rf /root/.config/* && \
    ln -s /root/.config /config && \
    # Remove the backup directory that gcloud creates
    rm -rf /root/tools/google-cloud-sdk/.install/.backup

# Path configuration
ENV PATH $PATH:/root/tools/google-cloud-sdk/bin
# Make sure gsutil will use the default service account
RUN echo '[GoogleCompute]\nservice_account = default' > /etc/boto.cfg

# Copies the trainer code
RUN mkdir /root/trainer
COPY trainer/mnist.py /root/trainer/mnist.py

# Sets up the entry point to invoke the trainer.
ENTRYPOINT ["python", "trainer/mnist.py"]

Docker イメージをローカルでビルドしてテストする

  1. 環境変数を使用して正しいイメージ URI を作成してから、Docker イメージをビルドします。-t フラグで、イメージの名前とタグとして IMAGE_REPO_NAMEIMAGE_TAG をそれぞれ指定します。これとは異なるイメージの名前とタグを選択してもかまいません。

    export PROJECT_ID=$(gcloud config list project --format "value(core.project)")
    export IMAGE_REPO_NAME=mnist_pytorch_custom_container
    export IMAGE_TAG=mnist_pytorch_cpu
    export IMAGE_URI=gcr.io/$PROJECT_ID/$IMAGE_REPO_NAME:$IMAGE_TAG
    
    docker build -f Dockerfile -t $IMAGE_URI ./
    
  2. イメージを新しいコンテナでローカルに実行して、正常に動作することを確認します。トレーナー スクリプトには --epochs フラグを渡すことに注意してください。

    docker run $IMAGE_URI --epochs 1
    

イメージを Container Registry に push する

ローカルで正常に機能することを確認したら、Docker イメージをプロジェクト内の Container Registry に push できます。

まだ実行していない場合は、まず gcloud auth configure-docker を実行します。

docker push $IMAGE_URI

ジョブを送信してモニタリングする

  1. ジョブ リクエストの環境変数を定義します。

    • MODEL_DIR は、Cloud Storage バケット内の新しいタイムスタンプ付きディレクトリ名を指定します。トレーニング完了後に保存されたモデルファイルは、このディレクトリに格納されます。
    • REGION は、AI Platform Training トレーニングに有効なリージョンを指定します。
    export MODEL_DIR=pytorch_model_$(date +%Y%m%d_%H%M%S)
    export REGION=us-central1
    export JOB_NAME=custom_container_job_$(date +%Y%m%d_%H%M%S)
    
  2. gcloud CLI を使用して、AI Platform Training にトレーニング ジョブを送信します。--master-image-uri フラグを使って URI を Docker イメージに渡します。

    gcloud ai-platform jobs submit training $JOB_NAME \
      --region $REGION \
      --master-image-uri $IMAGE_URI \
      -- \
      --model-dir=gs://$BUCKET_NAME/$MODEL_DIR \
      --epochs=10
    
  3. ジョブを送信したら、ジョブのステータスとストリームログをモニタリングできます。

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

ハイパーパラメータ調整ジョブを送信する

ハイパーパラメータ調整ジョブには、いくつかの調整が必要です。サンプルコード内の次の領域に注目してください。

  • サンプル Dockerfile には、カスタム コンテナにインストールできるよう、cloudml-hypertune パッケージが含まれています。
  • サンプルコード(mnist.py):
    • cloudml-hypertune を使用して、そのヘルパー関数 report_hyperparameter_tuning_metric を呼び出して各トライアルの結果を報告します。ジョブがハイパーパラメータ調整ジョブとして送信されない場合を除き、サンプルコードは評価後にハイパーパラメータ調整結果を報告します。
    • ハイパーパラメータごとにのコマンドライン引数を追加し、argparse を使用して引数を解析します。
  • ジョブ リクエストの本文で、TrainingInput オブジェクト内に HyperparameterSpec が指定されています。このサンプルコードでは、モデルの損失を最小化するために --lr--momentum を調整しています。
  1. config.yaml ファイルを作成して、ハイパーパラメータ仕様を定義します。MODEL_DIRJOB_NAME を再定義します。まだ作成していない場合は、REGION を定義します。

    export MODEL_DIR=pytorch_hptuning_model_$(date +%Y%m%d_%H%M%S)
    export REGION=us-central1
    export JOB_NAME=custom_container_job_hptuning_$(date +%Y%m%d_%H%M%S)
    
    # Creates a YAML file with job request.
    cat > config.yaml <<EOF
    trainingInput:
      hyperparameters:
        goal: MINIMIZE
        hyperparameterMetricTag: "my_loss"
        maxTrials: 20
        maxParallelTrials: 5
        enableTrialEarlyStopping: True
        params:
        - parameterName: lr
          type: DOUBLE
          minValue: 0.0001
          maxValue: 0.1
        - parameterName: momentum
          type: DOUBLE
          minValue: 0.2
          maxValue: 0.8
    EOF
    
  2. ハイパーパラメータ調整ジョブを AI Platform Training に送信します。

    gcloud ai-platform jobs submit training $JOB_NAME \
      --scale-tier BASIC \
      --region $REGION \
      --master-image-uri $IMAGE_URI \
      --config config.yaml \
      -- \
      --epochs=5 \
      --model-dir="gs://$BUCKET_NAME/$MODEL_DIR"
    

カスタム コンテナでの GPU の使用

GPU を使用するカスタム コンテナのジョブを送信するには、前に使用したものとは異なる Docker イメージをビルドする必要があります。GPU 用に用意されているサンプル Dockerfile は、次の要件を満たします。

  • コンテナに CUDA ツールキットと cuDNN をプリインストールします。この要件に対処する方法としては、ベースイメージとして nvidia/cuda イメージを使用することをおすすめします。このイメージには CUDA ツールキットと cuDNN がプリインストールされているため、関連する環境変数を正しく設定するのに役立ちます。
  • トレーニングアプリケーションに必要な他のすべての依存関係(wgetcurlpip など)をインストールします。
# Copyright 2019 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the \"License\");
# you may not use this file except in compliance with the License.\n",
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an \"AS IS\" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Dockerfile-gpu
FROM nvidia/cuda:9.0-cudnn7-runtime

# Installs necessary dependencies.
RUN apt-get update && apt-get install -y --no-install-recommends \
         wget \
         curl \
         python-dev && \
     rm -rf /var/lib/apt/lists/*

# Installs pip.
RUN curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \
    python get-pip.py && \
    pip install setuptools && \
    rm get-pip.py

WORKDIR /root

# Installs pytorch and torchvision.
RUN pip install torch==1.0.0 torchvision==0.2.1

# Installs cloudml-hypertune for hyperparameter tuning.
# It’s not needed if you don’t want to do hyperparameter tuning.
RUN pip install cloudml-hypertune

# Installs google cloud sdk, this is mostly for using gsutil to export model.
RUN wget -nv \
    https://dl.google.com/dl/cloudsdk/release/google-cloud-sdk.tar.gz && \
    mkdir /root/tools && \
    tar xvzf google-cloud-sdk.tar.gz -C /root/tools && \
    rm google-cloud-sdk.tar.gz && \
    /root/tools/google-cloud-sdk/install.sh --usage-reporting=false \
        --path-update=false --bash-completion=false \
        --disable-installation-options && \
    rm -rf /root/.config/* && \
    ln -s /root/.config /config && \
    # Remove the backup directory that gcloud creates
    rm -rf /root/tools/google-cloud-sdk/.install/.backup

# Path configuration
ENV PATH $PATH:/root/tools/google-cloud-sdk/bin
# Make sure gsutil will use the default service account
RUN echo '[GoogleCompute]\nservice_account = default' > /etc/boto.cfg

# Copies the trainer code
RUN mkdir /root/trainer
COPY trainer/mnist.py /root/trainer/mnist.py

# Sets up the entry point to invoke the trainer.
ENTRYPOINT ["python", "trainer/mnist.py"]

GPU Docker イメージをローカルでビルドしてテストする

  1. GPU Dockerfile を使用して、GPU トレーニング ジョブ用の新しいイメージをビルドします。CPU イメージが上書きされないように、チュートリアルで前に使用したものとは別の名前で IMAGE_REPO_NAMEIMAGE_TAG と再定義します。

    export PROJECT_ID=$(gcloud config list project --format "value(core.project)")
    export IMAGE_REPO_NAME=mnist_pytorch_gpu_container
    export IMAGE_TAG=mnist_pytorch_gpu
    export IMAGE_URI=gcr.io/$PROJECT_ID/$IMAGE_REPO_NAME:$IMAGE_TAG
    
    docker build -f Dockerfile-gpu -t $IMAGE_URI ./
    
  2. マシン上に GPU があり、すでに nvidia-docker がインストールされている場合、イメージをローカルで実行して、イメージが正常に動作することを確認できます。

    docker run --runtime=nvidia $IMAGE_URI --epochs 1
    
  3. Docker イメージを Container Registry に push します。まだ実行していない場合は、まず gcloud auth configure-docker を実行します。

    docker push $IMAGE_URI
    

ジョブを送信する

この例では、基本的な GPU スケール階層を使用してトレーニング ジョブ リクエストを送信します。GPU を使用してトレーニングする場合は、他のマシン オプションをご覧ください。

  1. MODEL_DIRJOB_NAME を再定義します。REGION をまだ定義していない場合は定義します。

    export MODEL_DIR=pytorch_model_gpu_$(date +%Y%m%d_%H%M%S)
    export REGION=us-central1
    export JOB_NAME=custom_container_job_gpu_$(date +%Y%m%d_%H%M%S)
    
  2. gcloud CLI を使用して、AI Platform Training にトレーニング ジョブを送信します。--master-image-uri フラグを使って URI を Docker イメージに渡します。

    gcloud ai-platform jobs submit training $JOB_NAME \
      --scale-tier BASIC_GPU \
      --region $REGION \
      --master-image-uri $IMAGE_URI \
      -- \
      --epochs=5 \
      --model-dir=gs://$BUCKET_NAME/$MODEL_DIR
    

次のステップ