Container in AI Platform Training verwenden

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

Verwendung von Containern

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

  1. Richten Sie ein Google Cloud-Projekt und Ihre lokale Umgebung ein.
  2. Erstellen Sie einen benutzerdefinierten Container:
    1. Schreiben Sie ein Dockerfile, das Ihren Container für die Arbeit mit AI Platform Training einrichtet und die 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 bei Ihrem Google-Konto an.

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

  2. Wählen Sie in der Cloud Console auf der Seite für die Projektauswahl ein Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

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

    Aktivieren Sie die APIs

  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 Training

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 Training 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 Training 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 per 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 auch Trainings auf AI Platform Training ausführen, müssen Sie für diese Anleitung keine weiteren Berechtigungen konfigurieren und können mit dem nächsten Schritt fortfahren.

Die Zugriffssteuerung 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 der Container Registry per Pull in ein anderes Projekt übertragen möchten, müssen Sie dem AI Platform Training-Dienstkonto 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 Training-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 Training-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 wird Ihr AI Platform Training-Dienstkonto in Ihr separates Container Registry-Projekt aufgenommen:

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 Training. Ü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:

  • Im Dockerfile: Installieren Sie cloudml-hypertune.
  • Im Trainingscode:
    • Verwenden Sie cloudml-hypertune und rufen Sie die zugehörige Hilfsfunktion report_hyperparameter_tuning_metric auf, um die Ergebnisse der einzelnen Tests zu melden.
    • Fügen Sie für jeden Hyperparameter Befehlszeilenargumente hinzu und verwenden Sie zum Parsen von Argumenten einen Argumentparser wie z. B. argparse.
  • In der Jobanfrage: Fügen Sie dem TrainingInput-Objekt eine HyperparameterSpec hinzu.

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.

  • Installieren Sie das CUDA-Toolkit und cuDNN in Ihrem Container. 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 ausfü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 Training 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, falls noch nicht geschehen.

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

Standardanmeldedaten in benutzerdefinierten Containern

Wenn Sie einen Trainingsjob mit benutzerdefinierten Containern ausführen, läuft Ihre Anwendung standardmäßig als Cloud ML-Dienst-Agent-Identität. Die Dienstkonto-ID des Cloud ML-Dienst-Agents für Ihr Projekt finden Sie auf der Seite "IAM" in der Cloud Console. Diese ID hat das folgende Format:

service-PROJECT_NUMBER@cloud-ml.google.com.iam.gserviceaccount.com

Ersetzen Sie PROJECT_NUMBER durch die Projektnummer für Ihr Google Cloud-Projekt.

AI Platform Training verwendet automatisch die Anmeldedaten für den Cloud ML-Dienst-Agent, um die Authentifizierung und Autorisierung einzurichten, wenn Sie TensorFlow tfds, Google Cloud-Clientbibliotheken oder andere Tools verwenden, die nach der Strategie der Standardanmeldedaten für Anwendungen arbeiten.

Wenn Sie jedoch möchten, dass Ihr benutzerdefinierter Containerjob auf andere Weise auf Google Cloud zugreift, ist unter Umständen eine zusätzliche Konfiguration erforderlich. Wenn Sie beispielsweise mit gsutil Daten aus Cloud Storage kopieren und mit der boto-Bibliothek Anmeldedaten aus einer Konfigurationsdatei laden, fügen Sie einen Befehl in Ihr Dockerfile ein, der dafür sorgt, dass gsutil die Standardanmeldedaten für den Cloud ML-Dienst-Agent verwendet:

RUN echo '[GoogleCompute]\nservice_account = default' > /etc/boto.cfg

Weitere Informationen