入門指南:透過自訂容器進行訓練

AI Platform 支援在自訂容器中進行訓練,可讓使用者使用自己的 Docker 容器,以及其中可能已預先安裝的任何機器學習架構或演算法,在 AI Platform 上加以執行。本教學課程將逐步說明如何使用自訂容器在 AI Platform 上訓練 PyTorch 模型。

總覽

這份入門指南示範在 AI Platform 上使用自訂容器進行訓練的程序。此程序使用的基本模型將使用根據 MNIST 資料集分類手寫數字。

本指南包含以下步驟:

  • 設定專案和本機環境
  • 建立自訂容器
    • 編寫 Dockerfile
    • 在本機建構並測試 Docker 映像檔
  • 將映像檔推送至 Container Registry
  • 提交自訂容器訓練工作
  • 提交超參數調整工作
  • 透過自訂容器使用 GPU

事前準備

進行本入門指南中的操作時,請使用任何已安裝 Cloud SDK 的環境。

選擇性步驟:請檢閱透過自訂容器進行訓練的相關概念資訊

完成下列步驟以設定 GCP 帳戶、啟用必要的 API,以及安裝並啟動 Cloud SDK。

  1. 登入您的 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. 使用 gcloud 做為 Docker 的憑證輔助程式:
    gcloud auth configure-docker
  9. 選擇性步驟:如要在本機環境中使用 GPU 來執行容器,請安裝 nvidia-docker

設定 Cloud Storage 值區

本節說明如何建立新值區。您可以使用現有值區,但該值區必須與您預計要執行的 AI Platform 工作位於相同地區。此外,如果該值區不屬於在您用來執行 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 環境變數。

    使用的地區必須與您預計要執行 AI Platform 工作的地區相同。請參閱 AI Platform 服務的可用地區

    例如,下列程式碼會建立 REGION,並將其設為 us-central1

    REGION=us-central1
  4. 建立新值區:

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

下載本教學課程使用的程式碼

  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 納入其他邏輯。進一步瞭解如何編寫 Dockerfile

# 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

如果本機執行成功,您即可將 Docker 映像檔推送至專案中的 Container Registry。

請先執行 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 工具將訓練工作提交至 AI Platform。使用 --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
    
  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 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 映像檔。我們提供的範例 Dockerfile 可搭配符合下列條件的 GPU 使用:

  • 在容器中預先安裝 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。請先執行 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 工具將訓練工作提交至 AI Platform。使用 --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
    

後續步驟