AI Platform でのコンテナの使用

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

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

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

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

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

始める前に

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

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

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

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

  2. GCP Console のプロジェクト セレクタのページで、GCP プロジェクトを選択または作成します。

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

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

  4. AI Platform(Cloud Machine Learning Engine)、Compute Engine および Container Registry必要な API を有効にします。

    API を有効にする

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

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

    sudo usermod -a -G docker ${USER}

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

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

カスタム コンテナの作成

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

AI Platform で使用する Dockerfile の基礎

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

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

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

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

必要に応じて、作成する 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 上でトレーニングを実行するために使用しているプロジェクト内にある場合、このチュートリアル用に権限を構成する必要はありません。次のステップに進んでください。

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

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

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

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

次のコマンドは、AI Platform サービス アカウントを別の 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 ツールを使用して、AI Platform にトレーニング ジョブを送信します。--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 がプリインストールされているため、関連する環境変数を正しく設定するのに役立ちます。
  • トレーニングアプリケーションに必要な他のすべての依存関係(wgetcurlpip など)をインストールします。

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

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

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

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

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

コードには、環境変数 TF_CONFIGCLUSTER_SPEC を使用してクラスタの全体的な構造を記述できます。これらの環境変数は、AI Platform によって、トレーニング クラスタの各ノードに追加されます。詳細については、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

次のステップ