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

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

總覽

這份入門指南會示範在 AI Platform 上以自訂容器進行訓練的程序,我們將以根據 MNIST 資料集來分類手寫數字的基本模型做說明。

本指南包含以下步驟:

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

事前準備

參考這份入門指南時,請使用 Cloud Shell 或任何已安裝 Cloud SDK 的環境。

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

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

  1. 登入您的 Google 帳戶。

    如果您沒有帳戶,請申請新帳戶

  2. 在 GCP 主控台中,前往「Manage resources」(管理資源) 頁面,選取或建立專案。

    前往「Manage resources」(管理資源) 頁面

  3. 請確認您已啟用 Google Cloud Platform 專案的計費功能。

    瞭解如何啟用計費功能

  4. 啟用AI Platform ("Cloud Machine Learning Engine"), Compute Engine and Container Registry API。

    啟用 API

  5. 安裝並初始化 Cloud SDK
  6. 安裝 gcloud beta
    gcloud components install beta
  7. 安裝 Docker

    如果您是使用 Ubuntu 或 Debian 等以 Linux 為基礎的作業系統,請將您的使用者名稱加入 docker 群組,以便能在不使用 sudo 的情況下執行 Docker:

    sudo usermod -a -G docker ${USER}

    將自己加入 docker 群組後,您可能需要重新啟動系統。

  8. 開啟 Docker。如要確認 Docker 正在運作,請執行下列 Docker 指令,可傳回目前的時間和日期:
    docker run busybox date
  9. 使用 gcloud 做為 Docker 的憑證輔助程式:
    gcloud auth configure-docker
  10. 選用:如要在本機環境中使用 GPU 來執行容器,請安裝 nvidia-docker

設定 Cloud Storage 值區

本節說明如何建立新值區。您可以使用現有值區,但如果該值區並不屬於用來執行 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 環境變數。

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

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

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

    附註:使用的地區必須與您預計要執行 AI Platform 工作的地區相同。本範例使用 us-central1,因為這是入門指南操作說明中所使用的地區。

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

  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

如果本機執行成功,您即可將容器推送至專案中的 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 beta 提交訓練工作至 AI Platform。使用
    --master-image-uri 標記將 URI 傳遞至您的 Docker 映像檔 (如果您尚未安裝或更新 gcloud beta,請先執行 gcloud components install beta)。

    gcloud beta 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 beta 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. 如果您已安裝 nvidia-docker,機器上也有可用的 GPU,您就能直接在本機環境中執行下列指令來驗證映像檔:

    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 beta 提交訓練工作至 AI Platform。使用 --master-image-uri 標記將 URI 傳遞至您的 Docker 映像檔:(如果您尚未安裝或更新 gcloud beta,請先執行 gcloud components install beta)。

    gcloud beta 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
    

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
AI Platform