PyTorch を使用した ML モデルのトレーニング

このチュートリアルでは、PyTorch 機械学習フレームワークを使用するトレーニング ジョブを実行する方法を説明します。このチュートリアルでは、PyTorch を使用するようにジョブを構成する方法と、AI Platform Training でサポートされている他の ML フレームワークとの違いについて説明します。その後、サンプル PyTorch コードを使用してトレーニング ジョブを実行する方法を説明します。このジョブでは、Chicago Taxi Trips データセットのデータに基づいてモデルをトレーニングします。

このチュートリアルでは、GPUハイパーパラメータ調整によって PyTorch を使用する方法についても説明します。

PyTorch コンテナ

AI Platform Training のランタイム バージョンには、PyTorch が依存関係として含まれていません。PyTorch を使用するトレーニング ジョブを実行するには、AI Platform Training で使用するビルド済みの PyTorch コンテナを指定します。

トレーニング用にビルド済みコンテナを構成するには、カスタム コンテナと同じ構文を使用します。ただし、独自の Docker コンテナを作成する必要はありません。代わりに、AI Platform で提供されるコンテナ イメージの URI を指定して、作成する Python トレーニング パッケージを指定します。

AI Platform には、次のビルド済み PyTorch コンテナがあります。

コンテナ イメージの URI PyTorch バージョン サポートされるプロセッサ
gcr.io/cloud-ml-public/training/pytorch-xla.1-11 1.11 CPU、TPU
gcr.io/cloud-ml-public/training/pytorch-gpu.1-11 1.11 GPU
gcr.io/cloud-ml-public/training/pytorch-xla.1-10 1.10 CPU、TPU
gcr.io/cloud-ml-public/training/pytorch-gpu.1-10 1.10 GPU
gcr.io/cloud-ml-public/training/pytorch-xla.1-9 1.9 CPU、TPU
gcr.io/cloud-ml-public/training/pytorch-gpu.1-9 1.9 GPU
gcr.io/cloud-ml-public/training/pytorch-xla.1-7 1.7 CPU、TPU
gcr.io/cloud-ml-public/training/pytorch-gpu.1-7 1.7 GPU
gcr.io/cloud-ml-public/training/pytorch-xla.1-6 1.6 CPU、TPU
gcr.io/cloud-ml-public/training/pytorch-gpu.1-6 1.6 GPU
gcr.io/cloud-ml-public/training/pytorch-cpu.1-4 1.4 CPU
gcr.io/cloud-ml-public/training/pytorch-gpu.1-4 1.4 GPU

これらのコンテナ イメージは Deep Learning Containers から派生したもので、Deep Learning Containers による依存関係が含まれます。

ビルド済みのコンテナでは使用できない PyTorch のバージョンを使用する場合は、カスタム コンテナの使用に関するガイドをご覧ください。

始める前に

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

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

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

  4. AI Platform Training & Prediction 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 API を有効にします。

    API を有効にする

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

    gcloud init

サンプルコードのダウンロード

次のコマンドを実行して、サンプルの PyTorch トレーニング アプリケーションをダウンロードし、トレーニング アプリケーションがあるディレクトリに移動します。

git clone --depth=1 \
  https://github.com/GoogleCloudPlatform/ai-platform-samples.git

cd ai-platform-samples/training/pytorch/structured/python_package

必要であれば、トレーニング コードの構造を確認します。

ls -pR

PyTorch トレーニング アプリケーションは trainer/ ディレクトリにあります。setup.py には、トレーニング アプリケーションをパッケージ化するための構成情報が含まれています。

Cloud Storage バケットを作成する

パッケージ化されたトレーニング コードと、トレーニング ジョブで作成するモデル アーティファクトを格納する Cloud Storage バケットを作成します。次のコマンドを実行します。

gsutil mb -l us-central1 gs://BUCKET_NAME

BUCKET_NAME は、バケットに付ける一意の名前に置き換えます。詳しくは、バケット名の要件をご覧ください。

Google Cloud プロジェクト内の既存の Cloud Storage バケットを使用することもできます。このチュートリアルでは、必ず us-central1 リージョンのバケットを使用してください。

PyTorch モデルのトレーニング

このチュートリアルでは、AI Platform Training で PyTorch モデルをトレーニングする方法をいくつか説明します。次の場合について説明します。

  • CPU プロセッサを搭載した仮想マシン(VM)インスタンスの場合
  • GPU プロセッサを搭載した VM の場合
  • CPU プロセッサを搭載した VM でハイパーパラメータ調整を使用する場合

上のいずれかを選択してください。このチュートリアルの残りの部分では、ここで選択した方法に対応するタブにある手順に沿って操作してください。別の構成でトレーニングを行う場合は、このセクションで説明する手順を繰り返してください。

トレーニング ジョブを作成するための準備

トレーニング ジョブを作成する前に、トレーニング コードがあることを確認します。さらに、ローカル環境で構成オプションを指定します。

CPU

トレーニング ジョブを作成するときに使用する複数の bash 変数を設定します。

BUCKET_NAME=BUCKET_NAME
JOB_NAME=getting_started_pytorch_cpu
JOB_DIR=gs://${BUCKET_NAME}/${JOB_NAME}/models

BUCKET_NAME は、前のセクションで作成した Cloud Storage バケットの名前に置き換えます。

GPU

  1. PyTorch のトレーニング コードで、トレーニング ジョブで使用する VM 上の GPU が認識されていることを確認し、PyTorch でテンソルとモジュールを GPU を適切に移動できるようにします。

    提供されたサンプルコードを使用する場合は、コードを実行するマシンに GPU があるかどうかを検出するロジックがサンプルコードに含まれているため、何もする必要はありません。

    cuda_availability = torch.cuda.is_available()
    if cuda_availability:
      device = torch.device('cuda:{}'.format(torch.cuda.current_device()))
    else:
      device = 'cpu'

    トレーニング コードを変更する場合は、CUDA セマンティクスの PyTorch ガイドを参照して、GPU が使用されるように構成してください。

  2. トレーニング ジョブを作成するときに使用する複数の bash 変数を設定します。

    BUCKET_NAME=BUCKET_NAME
    JOB_NAME=getting_started_pytorch_gpu
    JOB_DIR=gs://${BUCKET_NAME}/${JOB_NAME}/models
    

    BUCKET_NAME は、前のセクションで作成した Cloud Storage バケットの名前に置き換えます。

ハイパーパラメータ調整

このチュートリアルのサンプルコードでは、テストの失敗を最小限に抑えるために、学習率とバッチサイズのパラメータを調整します。

  1. トレーニング コードが AI Platform Training でのハイパーパラメータ調整に対応していることを確認します。

  2. 次のコマンドを実行して config.yaml ファイルを作成し、ハイパーパラメータ調整オプションを指定します。

    cat > config.yaml <<END
    trainingInput:
      hyperparameters:
        goal: MINIMIZE
        hyperparameterMetricTag: test_loss
        maxTrials: 2
        maxParallelTrials: 2
        enableTrialEarlyStopping: True
        params:
        - parameterName: learning-rate
          type: DOUBLE
          minValue: 0.0001
          maxValue: 1
          scaleType: UNIT_LOG_SCALE
        - parameterName: batch-size
          type: INTEGER
          minValue: 1
          maxValue: 256
          scaleType: UNIT_LINEAR_SCALE
    END
    

    これらのオプションでは、モデルの損失を最小限にするため、--learning-rate--batch-size のハイパーパラメータを調整します。

  3. トレーニング ジョブを作成するときに使用する複数の bash 変数を設定します。

    BUCKET_NAME=BUCKET_NAME
    JOB_NAME=getting_started_pytorch_hptuning
    JOB_DIR=gs://${BUCKET_NAME}/${JOB_NAME}/models
    

    BUCKET_NAME は、前のセクションで作成した Cloud Storage バケットの名前に置き換えます。

これらの Bash 変数は次の目的で使用されます。

  • JOB_NAME は AI Platform Training ジョブの識別子です。この識別子は、Google Cloud プロジェクト内の AI Platform Training ジョブの中で一意にする必要があります。
  • JOB_DIR は、AI Platform Training でトレーニング アプリケーションのアップロード先を指定するために使用されます。トレーニング アプリケーションは、トレーニング終了時に JOB_DIR を使用してモデル アーティファクトのエクスポート先を決定します。

トレーニング ジョブの作成

次のコマンドを実行して、トレーニング ジョブを作成します。

CPU

gcloud ai-platform jobs submit training ${JOB_NAME} \
  --region=us-central1 \
  --master-image-uri=gcr.io/cloud-ml-public/training/pytorch-xla.1-10 \
  --scale-tier=BASIC \
  --job-dir=${JOB_DIR} \
  --package-path=./trainer \
  --module-name=trainer.task \
  -- \
  --train-files=gs://cloud-samples-data/ai-platform/chicago_taxi/training/small/taxi_trips_train.csv \
  --eval-files=gs://cloud-samples-data/ai-platform/chicago_taxi/training/small/taxi_trips_eval.csv \
  --num-epochs=10 \
  --batch-size=100 \
  --learning-rate=0.001

GPU

gcloud ai-platform jobs submit training ${JOB_NAME} \
  --region=us-central1 \
  --master-image-uri=gcr.io/cloud-ml-public/training/pytorch-gpu.1-10 \
  --scale-tier=CUSTOM \
  --master-machine-type=n1-standard-8 \
  --master-accelerator=type=nvidia-tesla-p100,count=1 \
  --job-dir=${JOB_DIR} \
  --package-path=./trainer \
  --module-name=trainer.task \
  -- \
  --train-files=gs://cloud-samples-data/ai-platform/chicago_taxi/training/small/taxi_trips_train.csv \
  --eval-files=gs://cloud-samples-data/ai-platform/chicago_taxi/training/small/taxi_trips_eval.csv \
  --num-epochs=10 \
  --batch-size=100 \
  --learning-rate=0.001

ハイパーパラメータ調整

gcloud ai-platform jobs submit training ${JOB_NAME} \
  --region=us-central1 \
  --master-image-uri=gcr.io/cloud-ml-public/training/pytorch-xla.1-10 \
  --scale-tier=BASIC \
  --job-dir=${JOB_DIR} \
  --package-path=./trainer \
  --module-name=trainer.task \
  --config=config.yaml \
  -- \
  --train-files=gs://cloud-samples-data/ai-platform/chicago_taxi/training/small/taxi_trips_train.csv \
  --eval-files=gs://cloud-samples-data/ai-platform/chicago_taxi/training/small/taxi_trips_eval.csv \
  --num-epochs=10

トレーニング ジョブのガイドで、構成フラグとその使用によるトレーニングのカスタマイズ方法を学習します。

このコマンドは次のようなメッセージを返します。

Job [JOB_NAME] submitted successfully.
Your job is still active. You may view the status of your job with the command

  $ gcloud ai-platform jobs describe JOB_NAME

or continue streaming the logs with the command

  $ gcloud ai-platform jobs stream-logs JOB_NAME
jobId: JOB_NAME
state: QUEUED

次のコマンドを使用して、ジョブのステータスをモニタリングできます。

gcloud ai-platform jobs describe ${JOB_NAME}

次のコマンドを使用して、ジョブのトレーニング ログをストリーミングできます。

gcloud ai-platform jobs stream-logs ${JOB_NAME}

トレーニング ジョブが終了すると、トレーニング済みの ML モデルが、model.pth というファイルに保存されます。このファイルは、指定した JOB_DIR Cloud Storage ディレクトリ内のタイムスタンプ付きのディレクトリにあります。

次のステップ