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:
- Richten Sie ein Google Cloud-Projekt und Ihre lokale Umgebung ein.
- Erstellen Sie einen benutzerdefinierten Container:
- 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.
- Erstellen und testen Sie den Docker-Container lokal.
- Übertragen Sie den Container mit Push in die Container Registry.
- 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.
Hinweis
Verwenden Sie entweder Cloud Shell oder eine Umgebung, in der die gcloud CLI 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.
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the AI Platform Training & Prediction, Compute Engine and Container Registry APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the AI Platform Training & Prediction, Compute Engine and Container Registry APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- 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 ohnesudo
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. - Ö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
- Verwenden Sie
gcloud
als Credential Helper für Docker:gcloud auth configure-docker
- 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:
|
WORKDIR /path/to/directory |
Gibt das Verzeichnis im Image an, in dem nachfolgende Anweisungen ausgeführt werden. | /root |
|
Installiert zusätzliche Pakete mit pip .Hinweis: Wenn Ihr Basis-Image |
Beispielpakete:
|
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:
|
|
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
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ürIMAGE_REPO_NAME
undIMAGE_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 ./
Ü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
undstorage.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
Trainingsjob senden
Senden Sie den Trainingsjob mit der gcloud CLI 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 Hilfsfunktionreport_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
.
- Verwenden Sie
- In der Jobanfrage: Fügen Sie dem
TrainingInput
-Objekt eineHyperparameterSpec
hinzu.
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.
Wenn Ihre Trainingskonfiguration NVIDIA A100-GPUs verwendet, muss für Ihren Container CUDA 11 oder höher verwendet werden.
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 Google 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.
Nächste Schritte
- Konzepte bei der Verwendung von Containern
- PyTorch-Modell mithilfe von benutzerdefinierten Containern trainieren
- Verteiltes Training mit benutzerdefinierten Containern