スタートガイド: カスタム コンテナを使用したトレーニング

は、

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

概要

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

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

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

始める前に

このスタートガイドでは、Cloud Shell か、Cloud SDK がインストールされている環境を使用できます。

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

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

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. GCP Console で [リソースの管理] ページに移動し、既存のプロジェクトを選択するか、新しいプロジェクトを作成します。

    [リソースの管理] ページに移動

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

    課金を有効にする方法について

  4. {% dynamic if "no_credentials" in setvar.task_params %}{% dynamic setvar credential_type %}NO_AUTH{% dynamic endsetvar %}{% dynamic if not setvar.redirect_url %}{% dynamic setvar redirect_url %}https://console.cloud.google.com{% dynamic endsetvar %}{% dynamic endif %}{% dynamic endif %}{% dynamic if setvar.in_henhouse_no_auth_whitelist %}{% dynamic if not setvar.credential_type %}{% dynamic setvar credential_type %}NO_AUTH{% dynamic endsetvar %}{% dynamic endif %}{% dynamic elif setvar.in_henhouse_service_account_whitelist %}{% dynamic if not setvar.credential_type %}{% dynamic setvar credential_type %}SERVICE_ACCOUNT{% dynamic endsetvar %}{% dynamic endif %}{% dynamic endif %}{% dynamic if not setvar.service_account_roles and setvar.credential_type == "SERVICE_ACCOUNT" %}{% dynamic setvar service_account_roles %}{% dynamic endsetvar %}{% dynamic endif %}{% dynamic setvar console %}{% dynamic if "no_steps" not in setvar.task_params %}
  5. {% dynamic endif %}{% dynamic if setvar.api_list %}{% dynamic if setvar.in_henhouse_no_auth_whitelist or setvar.in_henhouse_service_account_whitelist %}GCP Console プロジェクトをセットアップします。

    プロジェクトをセットアップする

    クリックして、以下を行います。

    • プロジェクトを作成または選択します。
    • プロジェクトに{% dynamic if setvar.api_names %}{% dynamic print setvar.api_names %}{% dynamic else %}必要な{% dynamic endif %}{% dynamic if "," in setvar.api_list %} API{% dynamic elif "API" in setvar.api_names %}{% dynamic else %} API{% dynamic endif %} を有効にします。
    • {% dynamic if setvar.credential_type == 'SERVICE_ACCOUNT' %}
    • サービス アカウントを作成します。
    • JSON として秘密鍵をダウンロードします。
    • {% dynamic endif %}

    これらのリソースは、GCP Console でいつでも表示および管理できます。

    {% dynamic else %}{% dynamic if "no_text" not in setvar.task_params %}{% dynamic if setvar.api_names %}{% dynamic print setvar.api_names %}{% dynamic else %}必要な{% dynamic endif %}{% dynamic if "," in setvar.api_list %} API{% dynamic elif "API" in setvar.api_names %}{% dynamic else %} API{% dynamic endif %} を有効にします。 {% dynamic endif %}

    {% dynamic if "," in setvar.api_list %}API{% dynamic else %}API{% dynamic endif %}を有効にする

    {% dynamic endif %}{% dynamic endif %}{% dynamic if "no_steps" not in setvar.task_params %}
  6. {% dynamic endif %}{% dynamic endsetvar %}{% dynamic print setvar.console %}
  7. Cloud SDK をインストールして初期化します。
  8. gcloud beta をインストールします。
    gcloud components install beta
  9. Docker をインストールします

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

    sudo usermod -a -G docker ${USER}

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

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

Cloud Storage バケットを設定する

このセクションでは、新しいバケットの作成方法を説明します。既存のバケットを使用することもできますが、AI Platform の実行に使用するプロジェクトに属していないバケットの場合は、明示的に AI Platform のサービス アカウントにアクセス権を付与する必要があります。

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

    BUCKET_NAME="your_bucket_name"

    たとえば、プロジェクト名に -mlengine を追加して使用します。

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

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

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

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

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

    注: 使用するリージョンは、AI Platform ジョブを実行するリージョンと同一にしてください。この例では us-central1 を使用しています。「使ってみる」の説明でこのリージョンが使用されているためです。

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

  1. 次のコマンドを入力して、AI Platform のサンプル 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 で使用する前に、イメージが正常に動作することを確認するためです。

Dockerfile を作成する

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

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

必要に応じて、作成する 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.15-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

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

gcloud auth configure-docker をまだ実行していない場合は、これを実行してから、次のコマンドを実行します。

docker push $IMAGE_URI

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

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

    • MODEL_DIR は、Cloud Storage バケット内の新しいタイムスタンプ付きディレクトリ名を指定します。トレーニング完了後に保存されたモデルファイルは、このディレクトリに格納されます。
    • REGION は、AI Platform トレーニングに有効なリージョンを指定します。
    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 beta を使用して AI Platform にトレーニング ジョブを送信します。Docker イメージの URI を渡すには、
    --master-image-uri フラグを使用します(まだ gcloud beta をインストールまたは更新していない場合は、まず gcloud components install beta を実行してください)。

    gcloud beta 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 に送信します。

    gcloud beta 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 beta を使用して AI Platform にトレーニング ジョブを送信します。--master-image-uri フラグを使用して Docker イメージの URI を渡します(まだ gcloud beta をインストールまたは更新していない場合は、まず gcloud components install beta を実行してください)。

    gcloud beta 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
    

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...