Verteilte TensorFlow-Konfiguration in Compute Engine ausführen

In dieser Anleitung wird die Verwendung einer verteilten Konfiguration von TensorFlow in mehreren Google Compute Engine-Instanzen zum Trainieren eines Modells vom Typ Convolutional Neural Network mit MNIST-Dataset erläutert. Das MNIST-Dataset ermöglicht die Erkennung handgeschriebener Zahlen und ist ein weit verbreiteter Trainingssatz für maschinelles Lernen bei der Bilderkennung.

TensorFlow ist die Google Open-Source-Bibliothek für maschinelles Lernen. Sie wurde von Entwicklern und Technikern der Google-Organisation für Maschinenintelligenz entwickelt, die Teil von Google Research ist. TensorFlow wurde für die Ausführung auf mehreren Computern konzipiert, um die Trainings-Workloads zu verteilen. In dieser Anleitung führen Sie TensorFlow auf mehreren VM-Instanzen der Compute Engine aus, um das Modell zu trainieren. Alternativ können Sie die Cloud Machine Learning Engine verwenden, die für Sie die Aufgaben der Ressourcenzuweisung verwaltet und die trainierten Modelle hosten kann. Wir empfehlen, die Cloud ML Engine zu verwenden, falls nichts dagegen spricht. Weitere Informationen erhalten Sie in der Version dieser Anleitung, in der die Cloud ML Engine und Cloud Datalab verwendet werden.

Das folgende Diagramm zeigt die Architektur zum Ausführen einer verteilten Konfiguration von TensorFlow unter Compute Engine und die Verwendung von Cloud ML Engine mit Cloud Datalab, um Prognosen für Ihr trainiertes Modell auszuführen.

Image

Die vorliegende Anleitung beschreibt, wie Sie diese Architektur einrichten und nutzen können, und erläutert zugleich einige Konzepte.

Ziele

  • Compute Engine für die Erstellung eines Clusters mit virtuellen Maschinen (VMs) zur Ausführung von TensorFlow einrichten
  • Verteilten TensorFlow-Beispielcode auf Ihrem Compute Engine-Cluster zum Trainieren eines Modells ausführen, wobei der Beispielcode die neuesten TensorFlow-Bibliotheken und -Muster verwendet und so eine Referenz für den eigenen Trainingscode bietet
  • Trainiertes Modell für Cloud ML Engine errichten, um eine benutzerdefinierte API für Vorhersagen zu erstellen und Vorhersagen in einem Cloud Datalab-Notebook auszuführen

Kosten

Die geschätzten Kosten zum Ausführen dieser Anleitung (sofern Sie jede Ressource einen ganzen lang Tag nutzen) betragen laut diesem Preisrechner ca. 1,20 $.

Vorbereitung

  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 ein GCP-Projekt aus oder erstellen Sie eines.

    Zur Seite "Ressourcen verwalten"

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

    Informationen zum Aktivieren der Abrechnung

  4. Aktivieren Sie die Compute Engine und Cloud Machine Learning erforderlichen APIs.

    Aktivieren Sie die APIs.

Vorlageninstanz erstellen

In dieser Anleitung wird Cloud Shell, eine voll funktionsfähige Linux-Shell in der Google Cloud Platform Console, verwendet.

  1. Rufen Sie Cloud Shell auf.

    Cloud Shell öffnen

  2. Legen Sie Ihre Compute Engine-Standardzone und Ihr Standardprojekt fest:

    gcloud config set compute/zone us-east1-c
    gcloud config set project [YOUR_PROJECT_ID]
  3. Klonen Sie das GitHub-Repository:

    git clone https://github.com/GoogleCloudPlatform/cloudml-dist-mnist-example
    cd cloudml-dist-mnist-example
  4. Erstellen Sie die erste VM-Instanz aus einem Ubuntu Wily-Image:

    gcloud compute instances create template-instance \
    --image-project ubuntu-os-cloud \
    --image-family ubuntu-1604-lts \
    --boot-disk-size 10GB \
    --machine-type n1-standard-1
  5. Stellen Sie über SSH eine Verbindung zu der VM her:

    gcloud compute ssh template-instance
  6. Installieren Sie pip:

    sudo apt-get update
    sudo apt-get -y upgrade \
    && sudo apt-get install -y python-pip python-dev
  7. Installieren Sie TensorFlow:

    sudo pip install tensorflow
    
  8. (Optional) Befolgen Sie die Schritte zur Prüfung Ihrer Installation.

  9. Geben Sie exit ein, um zu Cloud Shell zurückzukehren.

  10. Prüfen Sie, welche Version von TensorFlow in Ihrer Cloud Shell-Instanz ausgeführt wird:

    sudo python -c 'import tensorflow as tf; print(tf.__version__)'
  11. Wenn die Version niedriger als 1.2.1 ist, benutzen Sie pip, um ein Upgrade auszuführen:

    sudo pip install --upgrade tensorflow

Cloud Storage-Bucket erstellen

Erstellen Sie als Nächstes einen Cloud Storage-Bucket, um Ihre MNIST-Dateien zu speichern. Gehen Sie dazu so vor:

  1. Erstellen Sie einen regionalen Cloud Storage-Bucket für die MNIST-Datendateien, die für die Worker-Instanzen freigegeben werden sollen:

    MNIST_BUCKET="mnist-$RANDOM"
    gsutil mb -c regional -l us-east1 gs://${MNIST_BUCKET}
  2. Laden Sie mit dem folgenden Skript die MNIST-Datendateien herunter und kopieren Sie diese in den Bucket:

    sudo ./scripts/create_records.py
    gsutil cp /tmp/data/train.tfrecords gs://${MNIST_BUCKET}/data/
    gsutil cp /tmp/data/test.tfrecords gs://${MNIST_BUCKET}/data/

Vorlagenimage und Trainingsinstanzen erstellen

Wenn Sie die Worker-, Master- und Parameterserverinstanzen erstellen möchten, wandeln Sie die Vorlageninstanz in ein Image um und verwenden Sie dieses Image, um jede neue Instanz zu erstellen.

  1. Deaktivieren Sie die automatische Löschfunktion für die VM template-instance. Dadurch bleibt das Laufwerk erhalten, wenn die VM gelöscht wird:

    gcloud compute instances set-disk-auto-delete template-instance \
    --disk template-instance --no-auto-delete
  2. Löschen Sie template-instance:

    gcloud compute instances delete template-instance
  3. Erstellen Sie das Image template-image aus dem Laufwerk template-instance:

    gcloud compute images create template-image \
    --source-disk template-instance
  4. Erstellen Sie die weiteren Instanzen. Erstellen Sie für diese Anleitung vier Instanzen mit den Namen master-0, worker-0,worker-1, und ps-0. Der Bereich storage-rw ermöglicht den Instanzen, auf Ihren Cloud Storage-Bucket zuzugreifen. Achten Sie darauf, dass die Instanznamen mit Leerzeichen voneinander getrennt werden:

    gcloud compute instances create \
    master-0 worker-0 worker-1 ps-0 \
    --image template-image \
    --machine-type n1-standard-4 \
    --scopes=default,storage-rw

Der Cluster ist für die verteilte Ausführung von TensorFlow bereit.

Verteilten TensorFlow-Code ausführen

In diesem Abschnitt führen Sie ein Skript aus, das alle Ihre VM-Instanzen anweist, TensorFlow-Code auszuführen, um das Modell zu trainieren.

Führen Sie in Cloud Shell den folgenden Befehl im Verzeichnis cloudml-dist-mnist-example aus:

./scripts/start-training.sh gs://${MNIST_BUCKET}

Das Skript namens start-training.sh verschiebt den Code auf jede VM und sendet die erforderlichen Parameter, um den TensorFlow-Prozess zum Erstellen des verteilten Clusters auf jedem Rechner zu starten. Der Ausgabestream in Cloud Shell zeigt die Verlust- und Genauigkeitswerte für das Testdataset an.

Genauigkeitswerte im Terminal

Wenn das Training abgeschlossen ist, gibt das Script den Standort der neu erstellten Modelldateien aus:

Trained model is stored in gs://${MNIST_BUCKET}/job_[TIMESTAMP]/export/Servo/[JOB_ID]/

Kopieren Sie den Standort des Bucketpfads für die Verwendung in späteren Schritten.

Modell für Prognosen veröffentlichen

Sie haben ein neues Modell generiert, mit dem Sie Prognosen erstellen können. Zum Trainieren anspruchsvollerer Modelle ist komplexerer TensorFlow-Code erforderlich. Die Konfiguration der Rechen- und Speicherressourcen ist jedoch ähnlich.

Das Trainieren des Modells ist jedoch nicht alles. Sie müssen Ihr Modell in Ihre Anwendung integrieren oder in einen API-Service mit Authentifizierung einbetten und schließlich die Skalierung anpassen. Es ist also noch eine Menge Entwicklungsarbeit nötig, bis Ihr Modell effizient und einsatzbereit ist.

Cloud ML Engine kann einen Teil dieser Arbeit erleichtern. Cloud ML Engine ist eine vollständig verwaltete Version von TensorFlow, die auf der Cloud Platform ausgeführt wird. Cloud ML Engine bietet alle leistungsfähigen Funktionen von TensorFlow ohne den Zusatzaufwand zum Einrichten einer weiteren Infrastruktur und zum Installieren von Software. Sie können Ihr verteiltes Training automatisch skalieren, sodass Tausende von CPUs oder GPUs verwendet werden, und Sie zahlen nur für das, was Sie tatsächlich nutzen.

Da TensorFlow hinter den Kulissen von Cloud ML Engine ausgeführt wird, ist Ihre gesamte Arbeit portierbar und Sie sind nicht auf ein proprietäres Tool angewiesen.

In der Anleitung Verteilte TensorFlow-Konfiguration mit Cloud Datalab verwenden wird beschrieben, wie Sie denselben Beispielcode verwenden können, um Ihr Modell mithilfe von Cloud ML Engine zu trainieren.

Sie können Cloud ML Engine so konfigurieren, dass Ihr Modell für Vorhersagen gehostet wird. Führen Sie die folgenden Schritte aus, um Ihr Modell in Cloud ML Engine zu veröffentlichen. Durch das Hosting Ihres Modells können Sie das skalierte Modell ohne großen Aufwand testen und anwenden (einschließlich aller Sicherheits-und Zuverlässigkeitsfunktionen, die Sie üblicherweise von einem durch Google verwalteten Service erwarten).

In den folgenden Schritten wird der Modellbucketpfad verwendet, der vorher vom Skript start-training.sh ausgegeben wurde.

  1. Rufen Sie den Ausgabepfad zu Ihrem Cloud Storage-Bucket mit generierten Modellen auf. Der Pfad hat das im Folgenden dargestellte Format, wobei [JOB_ID] die Job-ID ist. Er wird dann im nächsten Schritt verwendet:

    MODEL_BUCKET: gs://${MNIST_BUCKET}/job_[TIMESTAMP]/export/Servo/[JOB_ID]
  2. Definieren Sie mit dem gcloud-Befehlszeilentool eine neue Version v1 Ihres Modells und verweisen Sie auf die Modelldateien in Ihrem Bucket. Die Ausführung des folgenden Befehls kann mehrere Minuten dauern. Ersetzen Sie [YOUR_BUCKET_PATH] durch den Ausgabepfad aus dem vorherigen Schritt. Der Pfad beginnt mit gs://.

    MODEL="MNIST"
    MODEL_BUCKET=[YOUR_BUCKET_PATH]
    gcloud ml-engine models create ${MODEL} --regions us-east1
    gcloud ml-engine versions create \
     --origin=${MODEL_BUCKET} --model=${MODEL} v1
  3. Legen Sie "v1" als Standardversion für Ihr Modell fest:

    gcloud ml-engine versions set-default --model=${MODEL} v1

Das Modell kann jetzt in Cloud ML ausgeführt werden und es können Prognosen verarbeitet werden. Im nächsten Abschnitt wird Cloud Datalab verwendet, um Prognosen zu erstellen und zu visualisieren.

Prognosen mit Cloud Datalab ausführen

Erstellen Sie zum Testen Ihrer Prognosen eine Cloud-Datalab-Instanz, die interaktive Jupyter-Notebooks verwendet, um Code auszuführen.

  1. Geben Sie den folgenden Befehl in Cloud Shell ein, um eine Cloud-Datalab-Instanz zu erstellen:

    datalab create mnist-datalab
    
  2. Rufen Sie in Cloud Shell die Seite mit der Liste der Cloud Datalab-Notebooks auf. Klicken Sie dazu auf das quadratische Symbol Cloud Shell-Webvorschau rechts oben.

  3. Wählen Sie Port ändern und dann Port 8081 aus, um einen neuen Tab in Ihrem Browser zu öffnen.

  4. Erstellen Sie in der Cloud Datalab-Anwendung ein neues Notebook. Klicken Sie dazu rechts oben auf das Symbol +Notebook.

  5. Fügen Sie den folgenden Text in die erste Zelle des neuen Notebooks ein:

    %%bash
    wget https://raw.githubusercontent.com/GoogleCloudPlatform/cloudml-dist-mnist-example/master/notebooks/Online%20prediction%20example.ipynb
    cat Online\ prediction\ example.ipynb > Untitled\ Notebook.ipynb
  6. Klicken Sie auf Ausführen oben auf der Seite, um das Notebook Online prediction example.ipynb herunterzuladen. Das Skript kopiert den Inhalt des Remotenotebooks in das aktuelle Notebook.

  7. Aktualisieren Sie die Browserseite, um den neuen Notebookinhalt zu laden. Wählen Sie danach die erste Zelle aus, die den JavaScript-Code enthält, und klicken Sie dann auf Ausführen.

  8. Scrollen Sie auf der Seite nach unten bis zum Feld für das Zeichnen von Zahlen und zeichnen Sie mit dem Cursor eine Zahl:

    Die mit einem Cursor gezeichnete Zahl 3

  9. Klicken Sie in die nächste Zelle, um sie zu aktivieren. Klicken Sie dann oben auf der Seite auf den Abwärtspfeil neben der Schaltfläche Ausführen und wählen Sie Von dieser Zelle ausführen aus.

  10. Die Ausgabe der Vorhersage ist ein Array der Länge 10, in dem jeder Index (0-9) eine Zahl enthält, die mit der betreffenden Zahl übereinstimmt. Je näher diese Zahl an 1 liegt, desto eher entspricht der Index der von Ihnen eingegebenen Zahl. Der in der Liste hervorgehobene Slot 3 liegt sehr nahe an 1 und stimmt daher mit hoher Wahrscheinlichkeit mit der Zahl überein.

    PROBABILITIES
    [4.181503356903704e-07,
    7.12400151314796e-07,
    0.00017898145597428083,
    0.9955494403839111,
    5.323939553103507e-11,
    0.004269002005457878,
    7.927398321116996e-11,
    1.2688398953741853e-07,
    1.0825967819982907e-06,
    2.2037748692582682e-07]

Das Balkendiagramm in der letzten Zelle des Notebooks zeigt deutlich, dass Ihre Zahl (3) vorhergesagt wurde.

Das Balkendiagramm zeigt, dass die Zahl 3 ausgewählt wurde.

Bereinigen

So vermeiden Sie, dass Ihrem Google Cloud Platform-Konto die in dieser Anleitung verwendeten Ressourcen in Rechnung gestellt werden:

  1. Löschen Sie die Version Ihres Modells:

    gcloud ml-engine versions delete v1 --model=MNIST
  2. Löschen Sie das Modell:

    gcloud ml-engine models delete MNIST
  3. Löschen Sie Ihren Cloud Storage-Bucket:

    gsutil rm -r gs://${MNIST_BUCKET}
  4. Löschen Sie Ihre virtuellen Maschinen, einschließlich Cloud DataLab:

    gcloud compute instances delete master-0 worker-0 worker-1 ps-0 mnist-datalab
  5. Löschen Sie Ihr VM-Vorlagenimage:

    gcloud compute images delete template-image
  6. Löschen Sie Ihr persistentes Cloud Datalab-Laufwerk:

    gcloud compute disks delete mnist-datalab-pd --zone us-east1-c

Weitere Informationen

Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...