Melatih model ML dengan penampung kustom

AI Platform Training mendukung pelatihan dalam container kustom, yang memungkinkan pengguna membawa container Docker mereka sendiri dengan framework atau algoritma ML yang telah diinstal sebelumnya untuk berjalan di AI Platform Training. Tutorial ini memberikan panduan pengantar yang menunjukkan cara melatih model PyTorch di AI Platform Training dengan container kustom.

Ringkasan

Panduan memulai ini menunjukkan proses pelatihan dengan penampung kustom di AI Platform Training, menggunakan model dasar yang mengklasifikasikan angka tulisan tangan berdasarkan set data MNIST.

Panduan ini membahas langkah-langkah berikut:

  • Penyiapan project dan lingkungan lokal
  • Membuat penampung kustom
    • Menulis Dockerfile
    • Membangun dan menguji image Docker secara lokal
  • Mengirim image ke Container Registry
  • Mengirim tugas pelatihan penampung kustom
  • Mengirim tugas penyesuaian hyperparameter
  • Menggunakan GPU dengan penampung kustom

Sebelum memulai

Untuk panduan memulai ini, gunakan lingkungan tempat Google Cloud CLI diinstal.

Opsional: Tinjau informasi konseptual tentang pelatihan dengan penampung kustom.

Selesaikan langkah-langkah berikut untuk menyiapkan akun GCP, mengaktifkan API yang diperlukan, serta menginstal dan mengaktifkan Cloud SDK.

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the AI Platform Training & Prediction, Compute Engine and Container Registry APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the AI Platform Training & Prediction, Compute Engine and Container Registry APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. Menginstal Docker.

    Jika Anda menggunakan sistem operasi berbasis Linux, seperti Ubuntu atau Debian, tambahkan nama pengguna ke grup docker agar Anda dapat menjalankan Docker tanpa menggunakan sudo:

    sudo usermod -a -G docker ${USER}

    Anda mungkin perlu memulai ulang sistem setelah menambahkan diri Anda ke grup docker.

  13. Buka Docker. Untuk memastikan Docker berjalan, jalankan perintah Docker berikut, yang menampilkan waktu dan tanggal saat ini:
    docker run busybox date
  14. Gunakan gcloud sebagai helper kredensial untuk Docker:
    gcloud auth configure-docker
  15. Opsional: Jika Anda ingin menjalankan container menggunakan GPU secara lokal, instal nvidia-docker.

Menyiapkan bucket Cloud Storage

Bagian ini menunjukkan cara membuat bucket baru. Anda dapat menggunakan bucket yang ada, tetapi harus berada di region yang sama dengan tempat Anda berencana menjalankan tugas AI Platform. Selain itu, jika ini bukan bagian dari project yang Anda gunakan untuk menjalankan Pelatihan AI Platform, Anda harus secara eksplisit memberikan akses ke akun layanan Pelatihan AI Platform.

  1. Tentukan nama untuk bucket baru Anda. Nama harus unik di semua bucket di Cloud Storage.

    BUCKET_NAME="YOUR_BUCKET_NAME"

    Misalnya, gunakan nama project Anda dengan tambahan -aiplatform:

    PROJECT_ID=$(gcloud config list project --format "value(core.project)")
    BUCKET_NAME=${PROJECT_ID}-aiplatform
  2. Periksa nama bucket yang Anda buat.

    echo $BUCKET_NAME
  3. Pilih region untuk bucket Anda dan tetapkan variabel lingkungan REGION.

    Gunakan region yang sama dengan tempat Anda berencana menjalankan tugas Pelatihan AI Platform. Lihat region yang tersedia untuk layanan Pelatihan AI Platform.

    Misalnya, kode berikut membuat REGION dan menetapkannya ke us-central1:

    REGION=us-central1
  4. Buat bucket baru:

    gcloud storage buckets create gs://$BUCKET_NAME --location=$REGION

Mendownload kode untuk tutorial ini

  1. Masukkan perintah berikut untuk mendownload file zip contoh Pelatihan AI Platform:

    wget https://github.com/GoogleCloudPlatform/cloudml-samples/archive/master.zip
    
  2. Ekstrak file untuk mengekstrak direktori cloudml-samples-master.

    unzip master.zip
    
  3. Buka direktori cloudml-samples-master > pytorch > containers > quickstart > mnist. Perintah dalam panduan ini harus dijalankan dari direktori mnist.

    cd cloudml-samples-master/pytorch/containers/quickstart/mnist
    

Membuat container kustom

Untuk membuat penampung kustom, langkah pertamanya adalah menentukan Dockerfile untuk menginstal dependensi yang diperlukan untuk tugas pelatihan. Kemudian, Anda mem-build dan menguji image Docker secara lokal untuk memverifikasinya sebelum menggunakannya dengan AI Platform Training.

Menulis Dockerfile

Contoh Dockerfile yang diberikan dalam tutorial ini menyelesaikan langkah-langkah berikut:

  1. Menggunakan image dasar Python 2.7 yang memiliki dependensi Python bawaan.
  2. Menginstal dependensi tambahan, termasuk PyTorch, gcloud CLI, dan cloudml-hypertune untuk penyesuaian hyperparameter.
  3. Menyalin kode untuk aplikasi pelatihan Anda ke dalam penampung.
  4. Mengonfigurasi titik entri untuk AI Platform Training guna menjalankan kode pelatihan saat penampung dimulai.

Dockerfile Anda dapat menyertakan logika tambahan, bergantung pada kebutuhan Anda. Pelajari lebih lanjut cara menulis 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.16-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"]

Membangun dan menguji image Docker secara lokal

  1. Buat URI image yang benar menggunakan variabel lingkungan, dan build image Docker. Flag -t memberi nama dan tag pada gambar dengan pilihan Anda untuk IMAGE_REPO_NAME dan IMAGE_TAG. Anda dapat memilih nama dan tag yang berbeda untuk gambar.

    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. Verifikasi image dengan menjalankannya secara lokal di penampung baru. Perhatikan bahwa flag --epochs diteruskan ke skrip pelatih.

    docker run $IMAGE_URI --epochs 1

Mengirim image ke Container Registry

Jika proses lokal berfungsi, Anda dapat mengirim image Docker ke Container Registry dalam project Anda.

Pertama, jalankan gcloud auth configure-docker jika Anda belum melakukannya.

docker push $IMAGE_URI

Kirim dan pantau tugas

  1. Tentukan variabel lingkungan untuk permintaan tugas Anda.

    • MODEL_DIR memberi nama direktori baru dengan stempel waktu dalam bucket Cloud Storage tempat file model tersimpan setelah pelatihan selesai.
    • REGION menentukan region yang valid untuk pelatihan 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)
    
  2. Kirim tugas pelatihan ke AI Platform Training menggunakan gcloud CLI. Teruskan URI ke image Docker Anda menggunakan flag --master-image-uri:

    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. Setelah mengirimkan tugas, Anda dapat memantau status tugas dan log streaming:

    gcloud ai-platform jobs describe $JOB_NAME
    gcloud ai-platform jobs stream-logs $JOB_NAME
    

Mengirim tugas penyesuaian hyperparameter

Ada beberapa penyesuaian yang perlu dilakukan untuk tugas penyesuaian hyperparameter. Perhatikan area ini dalam kode contoh:

  • Contoh Dockerfile menyertakan paket cloudml-hypertune untuk menginstalnya di container kustom.
  • Kode contoh (mnist.py):
    • Menggunakan cloudml-hypertune untuk melaporkan hasil setiap uji coba dengan memanggil fungsi bantuannya, report_hyperparameter_tuning_metric. Kode contoh melaporkan hasil penyesuaian hyperparameter setelah evaluasi, kecuali jika tugas tidak dikirim sebagai tugas penyesuaian hyperparameter.
    • Menambahkan argumen command line untuk setiap hyperparameter, dan menangani penguraian argumen dengan argparse.
  • Permintaan tugas menyertakan HyperparameterSpec dalam objek TrainingInput. Dalam hal ini, kita menyesuaikan --lr dan --momentum untuk meminimalkan kerugian model.
  1. Buat file config.yaml untuk menentukan spesifikasi hyperparameter Anda. Tentukan ulang MODEL_DIR dan JOB_NAME. Tentukan REGION jika Anda belum melakukannya:

    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. Kirim tugas penyesuaian hyperparameter ke 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"
    

Menggunakan GPU dengan container kustom

Untuk mengirimkan tugas penampung kustom menggunakan GPU, Anda harus mem-build image Docker yang berbeda dari yang digunakan sebelumnya. Kami telah menyediakan contoh Dockerfile untuk digunakan dengan GPU yang memenuhi persyaratan berikut:

  • Instal toolkit CUDA dan cuDNN terlebih dahulu di penampung Anda. Menggunakan image nvidia/cuda sebagai image dasar adalah cara yang direkomendasikan untuk menangani hal ini, karena image ini telah menginstal toolkit CUDA dan cuDNN terlebih dahulu, dan membantu Anda menyiapkan variabel lingkungan terkait dengan benar.
  • Instal dependensi tambahan, seperti wget, curl, pip, dan dependensi lainnya yang diperlukan oleh aplikasi pelatihan Anda.
# 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"]

Mem-build dan menguji image Docker GPU secara lokal

  1. Build image baru untuk tugas pelatihan GPU menggunakan Dockerfile GPU. Untuk menghindari penggantian image CPU, Anda harus menentukan ulang IMAGE_REPO_NAME dan IMAGE_TAG dengan nama yang berbeda dari yang digunakan sebelumnya dalam tutorial.

    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. Jika memiliki GPU yang tersedia di komputer, dan telah menginstal nvidia-docker, Anda dapat memverifikasi image dengan menjalankannya secara lokal:

    docker run --runtime=nvidia $IMAGE_URI --epochs 1
  3. Kirim image Docker ke Container Registry. Pertama, jalankan gcloud auth configure-docker jika Anda belum melakukannya.

    docker push $IMAGE_URI

Mengirim tugas

Contoh ini menggunakan tingkat skala GPU dasar untuk mengirimkan permintaan tugas pelatihan. Lihat opsi mesin lainnya untuk pelatihan dengan GPU.

  1. Tentukan ulang MODEL_DIR dan JOB_NAME. Tentukan REGION jika Anda belum melakukannya:

    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. Kirim tugas pelatihan ke AI Platform Training menggunakan gcloud CLI. Teruskan URI ke image Docker Anda menggunakan flag --master-image-uri.

    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
    

Langkah selanjutnya