AI Platform Training でのコンテナの使用

このガイドでは、独自のカスタム コンテナをビルドして AI Platform Training でジョブを実行する方法について説明します。

コンテナを使用する際に必要な手順

次の手順では、カスタム コンテナを使用してトレーニングするための基本的なプロセスを示します。

  1. Google Cloud プロジェクトとローカル環境を設定します。
  2. カスタム コンテナを作成します。
    1. Dockerfile を作成します。Dockerfile によって、AI Platform Training と連携するようにコンテナを設定し、トレーニング アプリケーションに必要な依存関係を組み込みます。
    2. Docker コンテナをローカルでビルドしてテストします。
  3. コンテナを Container Registry に push します。
  4. カスタム コンテナで実行するトレーニング ジョブを送信します。

ハイパーパラメータ調整や GPU を使用するには、いくつかの追加設定が必要ですが、基本的なプロセスは同じです。

始める前に

Cloud Shell を使用するか、gcloud CLI がインストールされている環境を使用します。

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

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  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 をインストールします。

カスタム コンテナの作成

カスタム コンテナを作成するには、トレーニング ジョブに使用する Docker イメージを設定するための Dockerfile を作成する必要があります。その後、イメージをローカルでビルドしてテストします。

AI Platform Training で使用する Dockerfile の基礎

カスタム コンテナを作成する際は、Dockerfile を使用して、イメージをビルドするために必要なすべてのコマンドを指定します。

このセクションでは、Dockerfile の一般的な例を説明します。具体的な例については、カスタム コンテナの各チュートリアルと関連するサンプルをご覧ください。

AI Platform Training で使用する Dockerfile には、次のタスクに対処するコマンドを含める必要があります。

  • ベースイメージの選択
  • 追加の依存関係のインストール
  • イメージへのトレーニング コードのコピー
  • AI Platform Training がトレーニング コードを呼び出す際のエントリ ポイントの構成

必要に応じて、作成する Dockerfile に追加のロジックを含めることもできます。詳細については、Dockerfiles の作成方法をご覧ください。特定のコマンドごとの詳細については、Dockerfile リファレンスをご覧ください。

Dockerfile コマンド 説明
FROM image:tag ベースイメージとそのタグを指定します。

タグ付きのベースイメージの例:

  • pytorch/pytorch:latest
  • tensorflow/tensorflow:nightly
  • python:2.7.15-jessie
  • nvidia/cuda:9.0-cudnn7-runtime
WORKDIR /path/to/directory 以降の命令の実行先である、イメージ上のディレクトリを指定します。 /root
RUN pip install pkg1 pkg2 pkg3 pip を使用して追加のパッケージをインストールします。

注: ベースイメージに pip がインストールされていない場合、他のパッケージをインストールする前に、これをインストールするコマンドを含める必要があります。

パッケージの例:

  • google-cloud-storage
  • cloudml-hypertune
  • pandas
COPY src/foo.py dest/foo.py トレーニング アプリケーションのコードをイメージにコピーします。トレーニング アプリケーションの構造に応じて、おそらく複数のファイルをコピーする可能性があります。

トレーニング アプリケーションに含まれるファイルの名前の例:

  • model.py
  • task.py
  • data_utils.py
ENTRYPOINT ["exec", "file"] 実行するトレーニング コードを呼び出すためのエントリ ポイントを設定します。 ["python", "task.py"]

Dockerfile 内のロジックはニーズに応じて異なりますが、概して次のようになります。

# Specifies base image and tag
FROM image:tag
WORKDIR /root

# Installs additional packages
RUN pip install pkg1 pkg2 pkg3

# Downloads training data
RUN curl https://example-url/path-to-data/data-filename --output /root/data-filename

# Copies the trainer code to the docker image.
COPY your-path-to/model.py /root/model.py
COPY your-path-to/task.py /root/task.py

# Sets up the entry point to invoke the trainer.
ENTRYPOINT ["python", "task.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=example_custom_container_image
    export IMAGE_TAG=example_image_tag
    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 できます。

コンテナを Container Registry に push します。まだ実行していない場合は、まず gcloud auth configure-docker を実行します。

docker push $IMAGE_URI

Container Registry の権限を管理する

使用する Container Registry イメージが、AI Platform Training 上でトレーニングを実行するために使用しているプロジェクト内にある場合、このチュートリアル用に権限を構成する必要はありません。次のステップに進んでください。

Container Registry のアクセス制御は、Cloud Storage バケットに基づいてバックグラウンドで行われます。したがって、Container Registry の権限を構成する方法は、Cloud Storage の権限を構成する場合と同様です。

別のプロジェクトの Container Registry からイメージを pull する場合は、AI Platform Training サービス アカウントで他のプロジェクトからイメージにアクセスできるようにする必要があります。

  • Container Registry の権限の基礎となる Cloud Storage バケットを検索します。
  • storage.objects.get 権限と storage.objects.list 権限を含むロール(ストレージ オブジェクト閲覧者など)を AI Platform Training サービス アカウントに付与します。

AI Platform Training トレーニング ジョブの送信に使用しているプロジェクトとは異なるプロジェクトに docker イメージを push する場合は、イメージを pull するアクセス権を、Container Registry リポジトリがあるプロジェクト内の AI Platform Training サービス アカウントに付与する必要があります。サービス アカウントは、service-$CMLE_PROJ_NUM@cloud-ml.google.com.iam.gserviceaccount.com の形式で IAM コンソールに表示されます。

次のコマンドは、AI Platform Training サービス アカウントを別の Container Registry プロジェクトに追加します。

export GCR_PROJ_ID=[YOUR-PROJECT-ID-FOR-GCR]
export CMLE_PROJ_NUM=[YOUR-PROJECT-NUMBER-FOR-CMLE-JOB-SUBMISSION]
export \
SVC_ACCT=service-$CMLE_PROJ_NUM@cloud-ml.google.com.iam.gserviceaccount.com

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

詳細については、Container Registry のアクセス制御を構成する方法をご覧ください。

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

gcloud CLI を使用して、AI Platform Training にトレーニング ジョブを送信します。--master-image-uri フラグを使って URI を Docker イメージに渡します。

export BUCKET_NAME=custom_containers
export MODEL_DIR=example_model_$(date +%Y%m%d_%H%M%S)

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

カスタム コンテナでのハイパーパラメータ調整

カスタム コンテナのハイパーパラメータ調整を行うには、次の手順を行います。

  • Dockerfile: cloudml-hypertune をインストールします。
  • トレーニング コード:
    • cloudml-hypertune を使用し、そのヘルパー関数 report_hyperparameter_tuning_metric を呼び出して各トライアルの結果を報告します。
    • 各ハイパーパラメータのコマンドライン引数を追加し、パーサー(argparse など)を使用して引数を解析します。
  • ジョブ リクエスト: TrainingInput オブジェクトに HyperparameterSpec を追加します。

カスタム コンテナでのハイパーパラメータ調整を使用したトレーニングの例をご覧ください。

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

カスタム コンテナで GPU を使用してトレーニングする場合、いくつかの特殊な要件を満たす必要があります。CPU を使用したトレーニングに使用するものとは異なる Docker イメージをビルドする必要があります。

  • コンテナに CUDA ツールキットと cuDNN をプリインストールします。この要件に対処する方法としては、ベースイメージとして nvidia/cuda イメージを使用することをおすすめします。このイメージには CUDA ツールキットと cuDNN がプリインストールされているため、関連する環境変数を正しく設定するのに役立ちます。

    トレーニング構成で NVIDIA A100 GPU を使用する場合、コンテナは CUDA 11 以降を使用する必要があります。

  • トレーニングアプリケーションに必要な他のすべての依存関係(wgetcurlpip など)をインストールします。

GPU を使用してトレーニングする場合の Dockerfile の例をご覧ください。

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

TensorFlow を使用した分散トレーニングを行う場合、TPU をワーカー VM で使用できます。そのためには、TPU を使用するようトレーニング ジョブを構成し、トレーニング ジョブを送信するとき tpuTfVersion フィールドを指定する必要があります。

カスタム コンテナを使用した分散トレーニング

カスタム コンテナを使用して分散トレーニング ジョブを実行する場合、1 つのイメージのみを指定して、そのイメージをマスター、ワーカー、パラメータ サーバーとして使用できます。マスター、ワーカー、パラメータ サーバー用にそれぞれ異なるイメージをビルドして指定することもできます。その場合、依存関係は 3 つのイメージでおそらく同じになり、イメージごとに異なるコードロジックを実行できます。

コードには、環境変数 TF_CONFIGCLUSTER_SPEC を使用してクラスタの全体的な構造を記述できます。これらの環境変数は、AI Platform Training によって、トレーニング クラスタの各ノードに追加されます。詳細については、CLUSTER_SPEC についてをご覧ください。

ジョブの送信時に、TrainingInput オブジェクト内にイメージを指定できます。または、gcloud ai-platform submit training で該当するフラグを使用してイメージを指定することもできます。

次の例では、マシンタイプ(マスター、ワーカー、パラメータ サーバー)ごとに個別の Dockerfile をすでに定義していて、合計で 3 つの Dockerfile があるとします。その後、イメージに名前を付けてビルドし、テストしてから Container Registry に push します。最後に、使用する複数のイメージと、クラスタのマシン構成を指定したトレーニング ジョブを送信します。

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

export PROJECT_ID=$(gcloud config list project --format "value(core.project)")
export BUCKET_NAME=custom_containers
export MASTER_IMAGE_REPO_NAME=master_image_name
export MASTER_IMAGE_TAG=master_tag
export MASTER_IMAGE_URI=gcr.io/$PROJECT_ID/$MASTER_IMAGE_REPO_NAME:$MASTER_IMAGE_TAG
export WORKER_IMAGE_REPO_NAME=worker_image_name
export WORKER_IMAGE_TAG=worker_tag
export WORKER_IMAGE_URI=gcr.io/$PROJECT_ID/$WORKER_IMAGE_REPO_NAME:$WORKER_IMAGE_TAG
export PS_IMAGE_REPO_NAME=ps_image_name
export PS_IMAGE_TAG=ps_tag
export PS_IMAGE_URI=gcr.io/$PROJECT_ID/$PS_IMAGE_REPO_NAME:$PS_IMAGE_TAG
export MODEL_DIR=distributed_example_$(date +%Y%m%d_%H%M%S)
export REGION=us-central1
export JOB_NAME=distributed_container_job_$(date +%Y%m%d_%H%M%S)

docker build -f Dockerfile-master -t $MASTER_IMAGE_URI ./
docker build -f Dockerfile-worker -t $WORKER_IMAGE_URI ./
docker build -f Dockerfile-ps -t $PS_IMAGE_URI ./

docker run $MASTER_IMAGE_URI --epochs 1
docker run $WORKER_IMAGE_URI --epochs 1
docker run $PS_IMAGE_URI --epochs 1

docker push $MASTER_IMAGE_URI
docker push $WORKER_IMAGE_URI
docker push $PS_IMAGE_URI

gcloud ai-platform jobs submit training $JOB_NAME \
  --region $REGION \
  --master-machine-type complex_model_m \
  --master-image-uri $MASTER_IMAGE_URI \
  --worker-machine-type complex_model_m \
  --worker-image-uri $WORKER_IMAGE_URI \
  --worker-count 9 \
  --parameter-server-machine-type large_model \
  --parameter-server-image-uri $PS_IMAGE_URI \
  --parameter-server-count 3 \
  -- \
  --model-dir=gs://$BUCKET_NAME/$MODEL_DIR \
  --epochs=10

カスタム コンテナのデフォルト認証情報

カスタム コンテナを使用してトレーニングジョブを実行する場合、アプリケーションはデフォルトで Cloud ML サービス エージェント ID として実行されます。プロジェクトの Cloud ML サービス エージェントのサービス アカウント ID は、Google Cloud コンソールの [IAM] ページで確認できます。この ID の形式は、次のとおりです。

service-PROJECT_NUMBER@cloud-ml.google.com.iam.gserviceaccount.com

PROJECT_NUMBER を Google Cloud プロジェクトのプロジェクト番号に置き換えます。

AI Platform Training では、Tensorflow tfds、Google Cloud クライアント ライブラリ、またはアプリケーションのデフォルト認証情報戦略を使用する他のツールの場合、自動的に Cloud ML サービス エージェントの認証情報を使用して認証と認可を設定します。

ただし、カスタム コンテナ ジョブが他の方法で Google Cloud にアクセスする場合は、追加の構成が必要になることがあります。たとえば、gsutil を使用して Cloud Storage からデータをコピーし、boto ライブラリを使用して構成ファイルから認証情報を読み込む場合、gsutil がデフォルトの Cloud ML サービス エージェント認証情報を使用するためのコマンドを Dockerfile に追加してください。

RUN echo '[GoogleCompute]\nservice_account = default' > /etc/boto.cfg

次のステップ