カスタム コンテナを使用した 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 のインストールと有効化を行います。
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the AI Platform Training & Prediction, Compute Engine and Container Registry APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the AI Platform Training & Prediction, Compute Engine and Container Registry APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- Docker をインストールします。
Ubuntu や Debian などの Linux ベースのオペレーティングシステムを使用している場合は、ユーザー名を
docker
グループに追加して、sudo
を使わずに Docker を実行できるようにします。sudo usermod -a -G docker ${USER}
docker
グループにユーザー名を追加した後に、システムの再起動が必要となる場合があります。 - Docker を開きます。Docker が稼働中であることを確認するには、次の Docker コマンドを実行します。このコマンドにより、現在の時刻と日付が返されることを確認します。
docker run busybox date
- Docker 認証情報ヘルパーとして
gcloud
を使用します。gcloud auth configure-docker
-
省略可: GPU をローカルで使用してコンテナを実行する場合は、
nvidia-docker
をインストールします。
Cloud Storage バケットの設定
このセクションでは、新しいバケットを作成する方法を説明します。既存のバケットを使用することもできますが、AI Platform ジョブを実行する予定のリージョンと同じリージョンにある必要があります。また、AI Platform Training を実行するプロジェクトに含まれていない場合は、明示的に AI Platform Training サービス アカウントへのアクセスを許可する必要があります。
-
新しいバケットに名前を指定します。名前は Cloud Storage のすべてのバケット全体で重複しないようにする必要があります。
BUCKET_NAME="YOUR_BUCKET_NAME"
たとえば、プロジェクト名に
-aiplatform
を追加したものを使います。PROJECT_ID=$(gcloud config list project --format "value(core.project)") BUCKET_NAME=${PROJECT_ID}-aiplatform
-
作成したバケット名を確認します。
echo $BUCKET_NAME
-
バケットのリージョンを選択して、
REGION
環境変数を設定します。AI Platform Training ジョブを実行する予定のリージョンと同じリージョンを使用してください。AI Platform Training サービスに利用可能なリージョンをご覧ください。
たとえば、次のコードは
REGION
を作成し、us-central1
に設定します。REGION=us-central1
-
新しいバケットを作成します。
gcloud storage buckets create gs://$BUCKET_NAME --location=$REGION
このチュートリアルのコードをダウンロードする
次のコマンドを入力して、AI Platform Training のサンプル zip ファイルをダウンロードします。
wget https://github.com/GoogleCloudPlatform/cloudml-samples/archive/master.zip
ファイルを解凍して、
cloudml-samples-master
ディレクトリを抽出します。unzip master.zip
cloudml-samples-master > pytorch > containers > quickstart > mnist
ディレクトリに移動します。このチュートリアルのコマンドは、mnist
ディレクトリから実行する必要があります。cd cloudml-samples-master/pytorch/containers/quickstart/mnist
カスタム コンテナの作成
カスタム コンテナを作成するには、最初のステップとして、トレーニング ジョブに必要な依存関係をインストールするための Dockerfile を定義します。次に、Docker イメージをローカルでビルドしてテストします。これは、AI Platform Training で使用する前に、イメージが正常に動作することを確認するためです。
Dockerfile を作成する
このチュートリアルに用意されているサンプル Dockerfile は、次のステップを実行します。
- Python 依存関係が組み込まれた Python 2.7 ベースイメージを使用します。
- PyTorch、gcloud CLI、ハイパーパラメータ調整用の
cloudml-hypertune
など、追加の依存関係をインストールします。 - トレーニング アプリケーションのコードをコンテナにコピーします。
- コンテナの起動時に AI Platform Training がトレーニング コードを実行するエントリ ポイントを構成します。
必要に応じて、作成する Dockerfile に追加のロジックを含めることもできます。詳細については、Dockerfiles の作成方法をご覧ください。
Docker イメージをローカルでビルドしてテストする
環境変数を使用して正しいイメージ URI を作成してから、Docker イメージをビルドします。
-t
フラグで、イメージの名前とタグとしてIMAGE_REPO_NAME
、IMAGE_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 ./
イメージを新しいコンテナでローカルに実行して、正常に動作することを確認します。トレーナー スクリプトには
--epochs
フラグを渡すことに注意してください。docker run $IMAGE_URI --epochs 1
イメージを Container Registry に push する
ローカルで正常に機能することを確認したら、Docker イメージをプロジェクト内の Container Registry に push できます。
まだ実行していない場合は、まず gcloud auth configure-docker
を実行します。
docker push $IMAGE_URI
ジョブを送信してモニタリングする
ジョブ リクエストの環境変数を定義します。
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)
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
ジョブを送信したら、ジョブのステータスとストリームログをモニタリングできます。
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
を調整しています。
config.yaml
ファイルを作成して、ハイパーパラメータ仕様を定義します。MODEL_DIR
とJOB_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
ハイパーパラメータ調整ジョブを 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 がプリインストールされているため、関連する環境変数を正しく設定するのに役立ちます。
- トレーニングアプリケーションに必要な他のすべての依存関係(
wget
、curl
、pip
など)をインストールします。
GPU Docker イメージをローカルでビルドしてテストする
GPU Dockerfile を使用して、GPU トレーニング ジョブ用の新しいイメージをビルドします。CPU イメージが上書きされないように、チュートリアルで前に使用したものとは別の名前で
IMAGE_REPO_NAME
とIMAGE_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 ./
マシン上に GPU があり、すでに
nvidia-docker
がインストールされている場合、イメージをローカルで実行して、イメージが正常に動作することを確認できます。docker run --runtime=nvidia $IMAGE_URI --epochs 1
Docker イメージを Container Registry に push します。まだ実行していない場合は、まず
gcloud auth configure-docker
を実行します。docker push $IMAGE_URI
ジョブを送信する
この例では、基本的な GPU スケール階層を使用してトレーニング ジョブ リクエストを送信します。GPU を使用してトレーニングする場合は、他のマシン オプションをご覧ください。
MODEL_DIR
とJOB_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)
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
次のステップ
- コンテナの使用に関連するコンセプトを理解する。
- カスタム コンテナを使用した分散トレーニングについて理解する。