Container in der AI Platform verwenden

In dieser Anleitung wird erläutert, wie Sie Ihren eigenen benutzerdefinierten Container erstellen, um Jobs auf der AI Platform auszuführen.

Verwendung von Containern

Die folgenden Schritte zeigen den grundlegenden Ablauf des Trainings mit benutzerdefinierten Containern:

  1. Richten Sie ein Google Cloud Platform-Projekt und die lokale Umgebung ein.
  2. Erstellen Sie einen benutzerdefinierten Container:
    1. Schreiben Sie ein Dockerfile, das Ihren Container für die Arbeit mit AI Platform einrichtet und Abhängigkeiten enthält, die für Ihre Trainingsanwendung erforderlich sind.
    2. Erstellen und testen Sie den Docker-Container lokal.
  3. Übertragen Sie den Container mit Push in die Container Registry.
  4. Senden Sie einen Trainingsjob, der in Ihrem benutzerdefinierten Container ausgeführt wird.

Die Verwendung von Hyperparameter-Abstimmung oder GPUs erfordert einige Anpassungen, der grundlegende Ablauf ist jedoch derselbe.

Vorbereitung

Verwenden Sie entweder Cloud Shell oder eine Umgebung, in der das Cloud SDK installiert ist.

Führen Sie die folgenden Schritte aus, um ein GCP-Konto einzurichten, die erforderlichen APIs zu aktivieren und das Cloud SDK zu installieren und zu aktivieren.

  1. Melden Sie sich in Ihrem Google-Konto an.

    Wenn Sie noch kein Konto haben, registrieren Sie sich hier für ein neues Konto.

  2. Wählen Sie in der GCP Console auf der Projektauswahlseite ein GCP-Projekt aus oder erstellen Sie ein Projekt.

    Zur Projektauswahl

  3. Prüfen Sie, ob die Abrechnung für Ihr Google Cloud Platform-Projekt aktiviert ist. So bestätigen Sie die Abrechnung für Ihr Projekt.

  4. Aktivieren Sie die AI Platform ("Cloud Machine Learning Engine"), Compute Engine und Container Registryerforderlichen APIs.

    APIs aktivieren

  5. Installieren und initialisieren Sie das Cloud SDK.
  6. Installieren Sie Docker.

    Wenn Sie ein Linux-basiertes Betriebssystem wie Ubuntu oder Debian verwenden, fügen Sie der Gruppe docker Ihren Nutzernamen hinzu, damit Sie Docker ohne sudo ausführen können:

    sudo usermod -a -G docker ${USER}

    Möglicherweise müssen Sie Ihr System neu starten, wenn Sie sich zur Gruppe docker hinzugefügt haben.

  7. Öffnen Sie Docker. Prüfen Sie, ob Docker ausgeführt wird, indem Sie den folgenden Docker-Befehl ausführen, der die aktuelle Zeit und das aktuelle Datum zurückgibt:
    docker run busybox date
  8. Verwenden Sie gcloud als Credential Helper für Docker:
    gcloud auth configure-docker
  9. Optional: Wenn Sie den Container mit GPU lokal ausführen möchten, installieren Sie nvidia-docker.

Benutzerdefinierten Container erstellen

Zum Erstellen eines benutzerdefinierten Containers müssen Sie ein Dockerfile schreiben, um das Docker-Image einzurichten, das Sie für den Trainingsjob verwenden möchten. Danach erstellen und testen Sie das Image lokal.

Dockerfile-Grundlagen für AI Platform

Zum Erstellen eines benutzerdefinierten Containers verwenden Sie ein Dockerfile, in dem Sie alle Befehle angeben, die zum Erstellen des Images erforderlich sind.

In diesem Abschnitt wird ein allgemeines Beispiel für ein Dockerfile beschrieben. In den einzelnen Anleitungen für benutzerdefinierte Container und in den zugehörigen Beispielen finden Sie spezifische Beispiele.

Zur Verwendung mit AI Platform muss das Dockerfile Befehle für die folgenden Aufgaben enthalten:

  • Basis-Image auswählen
  • Zusätzliche Abhängigkeiten installieren
  • Trainingscode in das Image kopieren
  • Einstiegspunkt für AI Platform konfigurieren, um den Trainingscode aufzurufen

Ihr Dockerfile kann je nach Ihren Anforderungen zusätzliche Logik enthalten. Weitere Informationen finden Sie in den Best Practices zum Schreiben von Dockerfiles. Informationen zu den einzelnen Befehlen finden Sie in der Dockerfile-Referenz.

Dockerfile-Befehl Beschreibung Beispiel(e)
FROM image:tag Gibt ein Basis-Image und sein Tag an.

Beispiele für Basis-Images mit Tags:

  • pytorch/pytorch:latest
  • tensorflow/tensorflow:nightly
  • python:2.7.15-jessie
  • nvidia/cuda:9.0-cudnn7-runtime
WORKDIR /path/to/directory Gibt das Verzeichnis im Image an, in dem nachfolgende Anweisungen ausgeführt werden. /root
RUN pip install pkg1 pkg2 pkg3 Installiert zusätzliche Pakete mit pip.

Hinweis: Wenn Ihr Basis-Image pip nicht enthält, müssen Sie einen Befehl zur Installation des Tools hinzufügen, bevor Sie weitere Pakete installieren.

Beispielpakete:

  • google-cloud-storage
  • cloudml-hypertune
  • pandas
COPY src/foo.py dest/foo.py Kopiert den Code für die Trainingsanwendung in das Image. Je nachdem, wie die Trainingsanwendung aufgebaut ist, umfasst dies wahrscheinlich mehrere Dateien.

Beispielnamen von Dateien in der Trainingsanwendung:

  • model.py
  • task.py
  • data_utils.py
ENTRYPOINT ["exec", "file"] Legt den Einstiegspunkt fest, über den der Trainingscode zur Ausführung aufgerufen wird. ["python", "task.py"]

Die Logik im Dockerfile kann je nach Ihren Anforderungen variieren, im Allgemeinen sieht sie jedoch so aus:

# Specifies base image and tag
FROM image:tag
WORKDIR /root

# Installs additional packages
RUN pip install pkg1 pkg2 pkg3

# Downloads training data
RUN curl https://example-url/path-to-data/data-filename --output /root/data-filename

# Copies the trainer code to the docker image.
COPY your-path-to/model.py /root/model.py
COPY your-path-to/task.py /root/task.py

# Sets up the entry point to invoke the trainer.
ENTRYPOINT ["python", "task.py"]

Docker-Container lokal erstellen und testen

  1. Erstellen Sie den richtigen Image-URI mithilfe von Umgebungsvariablen und anschließend das Docker-Image. Mit dem Flag -t wird das Image mit den Optionen für IMAGE_REPO_NAME und IMAGE_TAG benannt und mit Tags versehen. Sie können für Ihr Image einen anderen Namen und ein anderes Tag auswählen.

    export PROJECT_ID=$(gcloud config list project --format "value(core.project)")
    export IMAGE_REPO_NAME=example_custom_container_image
    export IMAGE_TAG=example_image_tag
    export IMAGE_URI=gcr.io/$PROJECT_ID/$IMAGE_REPO_NAME:$IMAGE_TAG
    
    docker build -f Dockerfile -t $IMAGE_URI ./
    
  2. Überprüfen Sie das Image, indem Sie es lokal ausführen. Das Flag --epochs wird an das Trainerskript übergeben:

    docker run $IMAGE_URI --epochs 1
    

Container mit Push in die Container Registry übertragen

Wenn die lokale Ausführung funktioniert, können Sie den Container mit Push in Ihr Projekt in der Container Registry übertragen.

Übertragen Sie den Container mit Push in die Container Registry. Führen Sie als Erstes gcloud auth configure-docker aus, wenn Sie dies noch nicht getan haben.

docker push $IMAGE_URI

Berechtigungen für Container Registry verwalten

Wenn Sie ein Container Registry-Image aus demselben Projekt verwenden, in dem Sie das Training in AI Platform ausführen, müssen Sie für diese Anleitung keine weiteren Berechtigungen konfigurieren. Sie können dann mit dem nächsten Schritt fortfahren.

Die Zugriffskontrolle für die Container Registry basiert auf einem Cloud Storage-Bucket, weshalb das Konfigurieren der Container Registry-Berechtigungen dem Konfigurieren von Cloud Storage-Berechtigungen sehr ähnlich ist.

Wenn Sie ein Image aus Container Registry per Pull in ein anderes Projekt übertragen möchten, müssen Sie dem AI Platform-Dienst Zugriff auf das Image über das andere Projekt gewähren.

  • Suchen Sie den zugrunde liegenden Cloud Storage-Bucket für Ihre Container Registry-Berechtigungen.
  • Gewähren Sie Ihrem AI Platform-Dienstkonto eine Rolle (z. B. Storage-Objekt-Betrachter), die die Berechtigungen storage.objects.get und storage.objects.list enthält.

Wenn Sie das Docker-Image per Push in ein Projekt übertragen möchten, das Sie nicht zum Senden von AI Platform-Trainingsjobs verwenden, gewähren Sie dem AI Platform-Dienstkonto Image-Pull-Zugriff auf das Projekt mit den Container Registry-Repositories. Das Dienstkonto hat das Format service-$CMLE_PROJ_NUM@cloud-ml.google.com.iam.gserviceaccount.com und befindet sich in der IAM-Konsole.

Mit dem folgenden Befehl fügen Sie dem separaten Container Registry-Projekt Ihr AI Platform-Dienstkonto hinzu:

export GCR_PROJ_ID=[YOUR-PROJECT-ID-FOR-GCR]
export CMLE_PROJ_NUM=[YOUR-PROJECT-NUMBER-FOR-CMLE-JOB-SUBMISSION]
export \
SVC_ACCT=service-$CMLE_PROJ_NUM@cloud-ml.google.com.iam.gserviceaccount.com

gcloud projects add-iam-policy-binding $GCR_PROJ_ID \
    --member serviceAccount:$SVC_ACCOUNT --role roles/ml.serviceAgent

Weitere Informationen zum Konfigurieren der Zugriffssteuerung für die Container Registry finden Sie hier.

Trainingsjob senden

Senden Sie den Trainingsjob mit dem gcloud-Tool an AI Platform. Übergeben Sie den URI mit dem Flag --master-image-uri an Ihr Docker-Image:

export BUCKET_NAME=custom_containers
export MODEL_DIR=example_model_$(date +%Y%m%d_%H%M%S)

gcloud ai-platform jobs submit training $JOB_NAME \
  --region $REGION \
  --master-image-uri $IMAGE_URI \
  -- \
  --model-dir=gs://$BUCKET_NAME/$MODEL_DIR \
  --epochs=10

Hyperparameter-Abstimmung mit benutzerdefinierten Containern

Für die Hyperparameter-Abstimmung mit benutzerdefinierten Containern müssen Sie die folgenden Anpassungen vornehmen:

Beispiel für das Training mit benutzerdefinierten Containern unter Verwendung der Hyperparameter-Abstimmung

GPUs mit benutzerdefinierten Containern verwenden

Für das Training mit GPUs muss Ihr benutzerdefinierter Container einige spezielle Anforderungen erfüllen. Sie müssen ein anderes Docker-Image erstellen als für das Training mit CPUs.

  • CUDA-Toolkit und cuDNN sind im Container vorinstalliert. Die Verwendung des Images nvidia/cuda als Basis-Image ist die empfohlene Vorgehensweise, da hier das CUDA-Toolkit und cuDNN vorinstalliert sind und die zugehörigen Umgebungsvariablen korrekt eingerichtet werden können.
  • Installieren Sie zusätzliche Abhängigkeiten, wie z. B. wget, curl, pip und alle anderen von Ihrer Trainingsanwendung benötigten Abhängigkeiten.

Beispiel für ein Dockerfile zum Training mit GPUs

TPUs mit benutzerdefinierten Containern verwenden

Wenn Sie ein verteiltes Training mit TensorFlow durchführen, können Sie TPUs auf Ihren Worker-VMs verwenden. Dazu müssen Sie den Trainingsjob für die Verwendung von TPUs konfigurieren und das Feld tpuTfVersion angeben, wenn Sie Ihren Trainingsjob senden.

Verteiltes Training mit benutzerdefinierten Containern

Wenn Sie einen verteilten Trainingsjob mit benutzerdefinierten Containern ausführen, können Sie nur ein Image angeben, das als Master, Worker und Parameterserver verwendet werden soll. Sie haben auch die Möglichkeit, für den Master, Worker und Parameterserver verschiedene Images zu erstellen und anzugeben. In diesem Fall sind die Abhängigkeiten wahrscheinlich in allen drei Images gleich und Sie können in jedem Image eine andere Codelogik ausführen.

In Ihrem Code können Sie die Umgebungsvariablen TF_CONFIG und CLUSTER_SPEC verwenden. Diese Umgebungsvariablen beschreiben die Gesamtstruktur des Clusters und werden von AI Platform in jeden Knoten des Trainingsclusters eingegeben. Mehr über CLUSTER_SPEC erfahren.

Sie können Ihre Images beim Senden eines Jobs innerhalb des Objekts TrainingInput angeben oder in gcloud ai-platform submit training über die zugehörigen Flags.

Nehmen wir für dieses Beispiel an, Sie hätten bereits drei separate Dockerfiles definiert, eines für jeden Maschinentyp (Master, Worker und Parameterserver). Anschließend benennen, erstellen und testen Sie Ihre Images und übertragen sie mit Push an die Container Registry. Zum Schluss senden Sie einen Trainingsjob, in dem die verschiedenen Images sowie die Maschinenkonfiguration für den Cluster angegeben sind.

Führen Sie als Erstes gcloud auth configure-docker aus, wenn Sie dies noch nicht getan haben.

export PROJECT_ID=$(gcloud config list project --format "value(core.project)")
export BUCKET_NAME=custom_containers
export MASTER_IMAGE_REPO_NAME=master_image_name
export MASTER_IMAGE_TAG=master_tag
export MASTER_IMAGE_URI=gcr.io/$PROJECT_ID/$MASTER_IMAGE_REPO_NAME:$MASTER_IMAGE_TAG
export WORKER_IMAGE_REPO_NAME=worker_image_name
export WORKER_IMAGE_TAG=worker_tag
export WORKER_IMAGE_URI=gcr.io/$PROJECT_ID/$WORKER_IMAGE_REPO_NAME:$WORKER_IMAGE_TAG
export PS_IMAGE_REPO_NAME=ps_image_name
export PS_IMAGE_TAG=ps_tag
export PS_IMAGE_URI=gcr.io/$PROJECT_ID/$PS_IMAGE_REPO_NAME:$PS_IMAGE_TAG
export MODEL_DIR=distributed_example_$(date +%Y%m%d_%H%M%S)
export REGION=us-central1
export JOB_NAME=distributed_container_job_$(date +%Y%m%d_%H%M%S)

docker build -f Dockerfile-master -t $MASTER_IMAGE_URI ./
docker build -f Dockerfile-worker -t $WORKER_IMAGE_URI ./
docker build -f Dockerfile-ps -t $PS_IMAGE_URI ./

docker run $MASTER_IMAGE_URI --epochs 1
docker run $WORKER_IMAGE_URI --epochs 1
docker run $PS_IMAGE_URI --epochs 1

docker push $MASTER_IMAGE_URI
docker push $WORKER_IMAGE_URI
docker push $PS_IMAGE_URI

gcloud ai-platform jobs submit training $JOB_NAME \
  --region $REGION \
  --master-machine-type complex_model_m \
  --master-image-uri $MASTER_IMAGE_URI \
  --worker-machine-type complex_model_m \
  --worker-image-uri $WORKER_IMAGE_URI \
  --worker-count 9 \
  --parameter-server-machine-type large_model \
  --parameter-server-image-uri $PS_IMAGE_URI \
  --parameter-server-count 3 \
  -- \
  --model-dir=gs://$BUCKET_NAME/$MODEL_DIR \
  --epochs=10

Weitere Informationen