Melatih model ML dengan container kustom

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

Ringkasan

Panduan memulai ini menunjukkan proses pelatihan dengan container kustom pada Pelatihan AI Platform, menggunakan model dasar yang mengklasifikasikan digit 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 container kustom
  • Mengirim tugas penyesuaian hyperparameter
  • Menggunakan GPU dengan container kustom

Sebelum memulai

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

Opsional: Tinjau informasi konseptual tentang pelatihan dengan container kustom.

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

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  4. Aktifkan API AI Platform Training & Prediction, Compute Engine and Container Registry.

    Mengaktifkan API

  5. Menginstal Google Cloud CLI.
  6. Untuk initialize gcloud CLI, jalankan perintah berikut:

    gcloud init
  7. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  8. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  9. Aktifkan API AI Platform Training & Prediction, Compute Engine and Container Registry.

    Mengaktifkan API

  10. Menginstal Google Cloud CLI.
  11. Untuk initialize gcloud CLI, jalankan perintah berikut:

    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 bucket tersebut harus berada di region yang sama dengan tempat Anda berencana menjalankan tugas AI Platform. Selain itu, jika bukan bagian dari project yang Anda gunakan untuk menjalankan AI Platform Training, Anda harus secara eksplisit memberikan akses ke akun layanan AI Platform Training.

  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 tempat Anda berencana menjalankan tugas Pelatihan AI Platform. Lihat region yang tersedia untuk layanan AI Platform Training.

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

    REGION=us-central1
  4. Buat bucket baru:

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

Download 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 ini 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 container kustom, langkah pertamanya adalah menentukan Dockerfile untuk menginstal dependensi yang diperlukan untuk tugas pelatihan. Kemudian, Anda akan mem-build dan menguji image Docker secara lokal untuk memverifikasinya sebelum menggunakannya dengan AI Platform Training.

Menulis Dockerfile

Contoh Dockerfile yang disediakan 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 container.
  4. Mengonfigurasi titik entri untuk Pelatihan AI Platform guna menjalankan kode pelatihan Anda saat container dimulai.

Dockerfile Anda dapat menyertakan logika tambahan, tergantung 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 gambar yang benar dengan menggunakan variabel lingkungan, dan bangun image Docker. Flag -t memberi nama dan memberi tag pada gambar dengan pilihan Anda untuk IMAGE_REPO_NAME dan IMAGE_TAG. Anda dapat memilih nama dan tag yang berbeda untuk gambar Anda.

    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 container baru. Perhatikan bahwa flag --epochs diteruskan ke skrip pelatih.

    docker run $IMAGE_URI --epochs 1

Mengirim image ke Container Registry

Jika operasi lokal berfungsi, Anda dapat mengirim image Docker ke Container Registry di project Anda.

Pertama-tama, 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 Anda disimpan setelah pelatihan selesai.
    • REGION menentukan wilayah yang valid untuk pelatihan Pelatihan 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. Kirim tugas pelatihan ke Pelatihan AI Platform menggunakan gcloud CLI. Teruskan URI ke image Docker 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 harus dilakukan untuk tugas penyesuaian hyperparameter. Perhatikan area ini dalam kode contoh:

  • Contoh Dockerfile menyertakan paket cloudml-hypertune untuk menginstalnya di penampung khusus.
  • Kode contoh (mnist.py):
    • Menggunakan cloudml-hypertune untuk melaporkan hasil dari setiap uji coba dengan memanggil fungsi helpernya, report_hyperparameter_tuning_metric. Kode contoh melaporkan hasil penyesuaian hyperparameter setelah evaluasi, kecuali jika tugas tersebut 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 akan 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 Pelatihan 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"
    

Menggunakan GPU dengan container kustom

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

  • Prainstal toolkit CUDA dan cuDNN di container Anda. Menggunakan image nvidia/cuda sebagai image dasar adalah cara yang direkomendasikan untuk menangani hal ini, karena toolkit CUDA dan cuDNN sudah terinstal sebelumnya, serta membantu Anda menyiapkan variabel lingkungan terkait dengan benar.
  • Instal dependensi tambahan, seperti wget, curl, pip, dan 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"]

Membangun dan menguji image Docker GPU secara lokal

  1. Buat image baru untuk tugas pelatihan GPU Anda menggunakan GPU Dockerfile. Untuk menghindari penggantian image CPU, Anda harus menentukan ulang IMAGE_REPO_NAME dan IMAGE_TAG dengan nama yang berbeda dari yang Anda gunakan 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 di komputer, dan telah menginstal nvidia-docker, Anda dapat memverifikasi gambar dengan menjalankannya secara lokal:

    docker run --runtime=nvidia $IMAGE_URI --epochs 1
  3. Mengirim 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 Pelatihan AI Platform menggunakan gcloud CLI. Teruskan URI ke image Docker 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