Verteilten TensorFlow-Code mit Cloud ML Engine und Cloud Datalab verwenden

In dieser Anleitung wird gezeigt, wie Sie mit einer verteilten Konfiguration von TensorFlow-Code in Python ein Convolutional Neural Network-Modell mithilfe des MNIST-Datasets in Google Cloud Machine Learning Engine trainieren. Mit TensorBoard visualisieren Sie den Trainingsprozess und mit Google Cloud Datalab testen Sie die Vorhersagen.

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 zum Verteilen der Trainingsarbeitslasten durch die Ausführung auf mehreren Computern entwickelt. Dabei stellt Cloud Machine Learning Engine einen verwalteten Dienst für die verteilte Ausführung von TensorFlow-Code mithilfe von Dienst-APIs bereit.

In dieser Anleitung wird der Begriff Knoten für einen Anwendungscontainer verwendet, der während des Trainings parallele Berechnungen durchführt.

Informationen zu den Daten

Das MNIST-Dataset ermöglicht das Erkennen handschriftlicher Ziffern und wird beim maschinellen Lernen häufig als Trainings-Dataset für die Bilderkennung genutzt.

Das Dataset enthält eine große Anzahl von Bildern handgeschriebener Ziffern im Bereich von 0 bis 9 sowie die Labels zur Identifizierung der Ziffer in jedem Bild.

In dieser Anleitung wird ein ML-Modell trainiert, um Bilder basierend auf dem MNIST-Dataset zu klassifizieren. Nach dem Training klassifiziert das Modell eingehende Bilder in zehn Kategorien (0 bis 9) basierend auf den Erkenntnissen, die es über handgeschriebene Bilder aus dem MNIST-Dataset gewonnen hat. Sie können dem Modell dann ein Bild senden, das es zuvor noch nicht gesehen hat. Das Modell identifiziert die Ziffer im Bild basierend auf den beim Training gewonnen Erkenntnissen.

Das MNIST-Dataset besteht aus drei Teilen:

  • 55.000 Trainingsdatenbeispiele
  • 10.000 Testdatenbeispiele
  • 5.000 Validierungsdatenbeispiele

Weitere Informationen zum Dataset finden Sie auf der Website der MNIST-Datenbank.

Neuronale Netze verstehen

Bei der Computerprogrammierung weisen Menschen einen Computer an, ein Problem zu lösen, indem sie jeden Schritt dafür mit einer Vielzahl von Codezeilen festlegen. Im Gegensatz dazu soll mit maschinellem Lernen und neuronalen Netzen der Computer Probleme über Beispiele lösen.

Ein neuronales Netzwerk ist eine mathematische Funktion, die in der Lage ist, die erwartete Ausgabe für eine bestimmte Eingabe von Trainings-Datasets zu erlernen. Die folgende Abbildung veranschaulicht ein neuronales Netzwerk, das für die Ausgabe von "cat" (Katze) von einem Katzenbild trainiert wurde.

Ein neuronales Netzwerkmodell ist eine Funktion, die durch Beispiele trainiert werden kann.

Die Abbildung zeigt, dass ein neuronales Netzwerkmodell aus mehreren Ebenen von Berechnungseinheiten besteht, wobei für jede Ebene konfigurierbare Parameter verwendet werden. Beim Trainieren eines Modells sollen diese Parameter für Ergebnisse mit einem Höchstmaß an Genauigkeit optimiert werden. Der Trainingsalgorithmus führt bei der Verarbeitung von Batches von Trainings-Datasets über das Modell Anpassungen durch. Wenn Sie den Trainingsprozess auf mehrere Berechnungsknoten verteilen, müssen Sie gewährleisten, dass Sie die Änderung der Parameter, die von allen Knoten gemeinsam benutzt werden, verfolgen können.

Architektur des verteilten Trainings

Für das Trainieren eines Modells mit mehreren Knoten gibt es drei grundlegende Strategien:

  • Datenparalleles Training mit synchronen Aktualisierungen.
  • Datenparalleles Training mit asynchronen Aktualisierungen.
  • Modellparalleles Training.

Der Beispielcode in dieser Anleitung verwendet ein datenparalleles Training mit asynchronen Aktualisierungen auf Cloud ML Engine. Dabei wird ein Trainingsjob mithilfe der folgenden Knotenarten ausgeführt:

  • Parameterserverknoten. Aktualisiert Parameter mit Gradientenvektoren von Worker- und Chief-Worker-Knoten.
  • Worker-Knoten. Berechnet einen Gradientenvektor aus dem Trainings-Dataset.
  • Chief-Worker-Knoten. Koordiniert die Vorgänge mehrerer Worker und dient gleichzeitig als eigener Worker-Knoten.

Da Sie die datenparallele Strategie unabhängig von der Modellstruktur anwenden können, ist diese ein guter Ausgangspunkt für die Anwendung der verteilten Trainingsmethode auf Ihr benutzerdefiniertes Modell. Bei einem datenparallelen Training wird das gesamte Modell von allen Worker-Knoten genutzt. Jeder Knoten berechnet Gradientenvektoren unabhängig vom Trainings-Dataset in der gleichen Art wie die Minibatchverarbeitung. Die berechneten Gradientenvektoren werden im Parameterserverknoten erfasst und die Modellparameter mit den zusammengefassten Gradientenvektoren aktualisiert. Wenn Sie 10.000 Batches zwischen zehn Worker-Knoten verteilen, verarbeitet jeder Knoten etwa 1.000 Batches.

Das datenparallele Training kann mit synchronen oder asynchronen Aktualisierungen durchgeführt werden. Bei asynchronen Aktualisierungen wendet der Parameterserver jeden Gradientenvektor direkt nach dem Erhalt von einem der Worker-Knoten separat an, wie im folgenden Diagramm gezeigt.

Datenparalleles Training mit asynchronen Aktualisierungen.

Eine typische Bereitstellung besteht aus einigen Parameterserverknoten, einem einzelnen Chief-Worker-Knoten und mehreren Worker-Knoten. Wenn Sie einen Trainingsjob über die Dienst-API senden, werden diese Knoten automatisch in Ihrem Projekt bereitgestellt.

Das folgende Diagramm stellt die Architektur für die Durchführung eines verteilten Trainingsjobs auf Cloud ML Engine und für die Verwendung von Cloud Datalab zur Durchführung von Vorhersagen mit Ihrem trainierten Modell dar.

Von der Anleitung verwendete Architektur.

Ziele

  • Ausführung des verteilten TensorFlow-Beispielcodes auf Cloud ML Engine.
  • Bereitstellung des trainierten Modells auf Cloud ML Engine zum Erstellen einer benutzerdefinierten API für Vorhersagen.
  • Visualisierung des Trainingsprozesses mit TensorBoard.
  • Test der Vorhersagen mit Cloud Datalab.

Kosten

In dieser Anleitung werden kostenpflichtige Komponenten der Cloud Platform verwendet, darunter:

  • Cloud ML Engine
  • Google Cloud Storage
  • Google Compute Engine
  • Nichtflüchtiger Speicher der Compute Engine

Die geschätzten Kosten zum Ausführen dieser Anleitung (sofern Sie jede Ressource einen ganzen 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 Google Cloud Platform-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 AI Platform ("Cloud Machine Learning Engine") and Compute Engine erforderlichen APIs.

    Aktivieren Sie die APIs.

Google Cloud SDK-Komponenten prüfen

  1. Rufen Sie Cloud Shell auf.

    Cloud Shell öffnen

  2. Listen Sie die Modelle auf, um zu prüfen, ob der Befehl eine leere Liste zurückgibt:

    gcloud ai-platform models list
    

    Prüfen Sie, ob der Befehl eine leere Liste zurückgibt:

    Listed 0 items.

Wenn Sie bereits mit Cloud ML Engine gearbeitet haben, erhalten Sie eine Liste aller Modelle, die mit Ihrem Konto verknüpft sind.

Beispieldateien herunterladen

Laden Sie die Beispieldateien herunter und legen Sie Ihr aktuelles Verzeichnis fest.

git clone https://github.com/GoogleCloudPlatform/cloudml-dist-mnist-example
cd cloudml-dist-mnist-example

Cloud Storage-Bucket für MNIST-Dateien erstellen

  1. Erstellen Sie einen Cloud Storage-Bucket vom Typ regional zum Speichern der MNIST-Datendateien, die zum Trainieren des Modells verwendet werden.

    PROJECT_ID=$(gcloud config list project --format "value(core.project)")
    BUCKET="${PROJECT_ID}-ml"
    gsutil mb -c regional -l us-central1 gs://${BUCKET}
    
  2. Laden Sie mit dem folgenden Skript die MNIST-Datendateien herunter und kopieren Sie diese in den Bucket.

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

Modell auf Cloud Machine Learning Engine trainieren

  1. Senden Sie einen Trainingsjob an Cloud ML Engine.

    JOB_NAME="job_$(date +%Y%m%d_%H%M%S)"
    gcloud ai-platform jobs submit training ${JOB_NAME} \
        --package-path trainer \
        --module-name trainer.task \
        --staging-bucket gs://${BUCKET} \
        --job-dir gs://${BUCKET}/${JOB_NAME} \
        --runtime-version 1.2 \
        --region us-central1 \
        --config config/config.yaml \
        -- \
        --data_dir gs://${BUCKET}/data \
        --output_dir gs://${BUCKET}/${JOB_NAME} \
        --train_steps 10000
    

    Die Option --train_steps gibt die Gesamtzahl der Trainingsbatches an.

    Sie können die Menge an Ressourcen steuern, die dem Trainingsjob zugewiesen werden. Geben Sie dazu in der Konfigurationsdatei config/config.yaml eine Skalierungsstufe an. Wenn die Ausführung des Auftrags auf mehreren Knoten startet, wird der gleiche Python-Code, der im Trainerverzeichnis mit dem Parameter --package-path festgelegt ist, auf allen Knoten bereitgestellt. Die Dateien im Trainerverzeichnis und deren Funktionen sind in der folgenden Tabelle aufgeführt:

    Datei Beschreibung
    "setup.py" Setupskript zur Installation zusätzlicher Module auf Knoten.
    "model.py" TensorFlow-Code zur Definition des Convolutional Neural Network-Modells.
    "task.py" TensorFlow-Code zur Ausführung der Trainingsaufgabe. Experiment API wird zur Ausführung der Trainingsschleife in verteilter Form verwendet.
  2. Öffnen Sie die ML Engine-Seite in Google Cloud Platform Console, um den ausgeführten Job zu ermitteln.

    CLOUD ML ENGINE öffnen

  3. Klicken Sie auf die Job-ID, um einen Link zur Log-Anzeige zu ermitteln. Der Beispielcode zeigt den Trainingsfortschritt in Logs an. Beispielsweise wird in jedem Worker-Knoten ein Trainingsverlustwert angezeigt, der den Gesamtverlustwert des Dataset in einem einzelnen Trainingsbatch in Intervallen wiedergibt. Darüber hinaus zeigt der Chief-Worker-Knoten den Verlust und die Genauigkeit der Testdaten an. Am Ende des Trainings wird die abschließende Bewertung in Bezug auf die Testdaten angezeigt. In diesem Beispiel wurde beim Training eine Genauigkeit von 99,3 % für die Testdaten erreicht.

    Saving dict for global step 10008: accuracy = 0.9931, global_step = 10008, loss = 0.0315906
  4. Nach dem Training wird das trainierte Modell in den Storage-Bucket exportiert. Den Speicherpfad für das Verzeichnis, das die Binärdatei des Modells enthält, finden Sie mithilfe von diesem Befehl:

    gsutil ls gs://${BUCKET}/${JOB_NAME}/export/Servo | tail -1

    Die Ausgabe sollte in etwa folgendes Aussehen haben:

    gs://${BUCKET}/job_[TIMESTAMP]/export/Servo/[JOB_ID]/

Trainingsprozess mit TensorBoard visualisieren

Nach dem Training werden die zusammengefassten Daten in gs://${BUCKET}/${JOB_NAME} gespeichert. Sie können diese mit TensorBoard visualisieren.

  1. Führen Sie in Cloud Shell den im Folgenden aufgeführten Befehl zum Start von TensorBoard durch.

    tensorboard --port 8080 --logdir gs://${BUCKET}/${JOB_NAME}
  2. Zum Öffnen eines neuen Browserfensters wählen Sie rechts oben in der Cloud Shell-Symbolleiste im Menü Webvorschau die Option Vorschau auf Port 8080 aus.

  3. Im neuen Fenster können Sie mit TensorBoard die Trainingszusammenfassung anzeigen und die Netzwerkgrafik visualisieren. Drücken Sie Strg+C, um TensorBoard in Cloud Shell zu beenden.

    TensorBoard zeigt Trainingszusammenfassung und Netzwerkgrafik an.

Trainiertes Modell für Vorhersagen bereitstellen

Das trainierte Modell für Vorhersagen stellen Sie mit der Binärdatei des Modells bereit.

  1. Stellen Sie das Modell bereit und legen Sie die Standardversion fest.

    MODEL_NAME=MNIST
    gcloud ai-platform models create --regions us-central1 ${MODEL_NAME}
    VERSION_NAME=v1
    ORIGIN=$(gsutil ls gs://${BUCKET}/${JOB_NAME}/export/Servo | tail -1)
    gcloud ai-platform versions create \
        --origin ${ORIGIN} \
        --model ${MODEL_NAME} \
        ${VERSION_NAME}
    gcloud ai-platform versions set-default --model ${MODEL_NAME} ${VERSION_NAME}
    

    Für MODEL_NAME und VERSION_NAME lassen sich beliebige Werte festlegen. Sie können aber denselben Namen nicht noch einmal verwenden. Der letzte Befehl ist für die erste Version nicht notwendig, da diese automatisch zum Standard wird. Es wird empfohlen, die Standardversion explizit festzulegen.

    Es kann ein paar Minuten dauern, bis das bereitgestellte Modell verfügbar ist. Wenn es nicht verfügbar ist, wird bei Anfragen ein HTTP 503-Fehler zurückgegeben.

  2. Testen Sie die Vorhersage-API mithilfe einer Beispielanfragedatei.

    ./scripts/make_request.py

    Dieses Skript erstellt eine JSON-Datei namens request.json, die zehn Testbilder für Vorhersagen enthält.

  3. Senden Sie eine Anfrage für eine Onlinevorhersage.

    gcloud ai-platform predict --model ${MODEL_NAME} --json-instances request.json

    Es sollte eine Antwort in folgender Form zurückgegeben werden:

    CLASSES  PROBABILITIES
    7        [3.437006127094938e-21, 5.562060376991084e-16, 2.5538862785511466e-19, 7.567420805782991e-17, 2.891652426709158e-16, 2.2750016241705544e-20, 1.837758172149778e-24, 1.0, 6.893573298530907e-19, 8.065571390565747e-15]
    2        [1.2471907477623206e-23, 2.291396136267388e-25, 1.0, 1.294716955176118e-32, 3.952643278911311e-25, 3.526924652059716e-36, 3.607279481567486e-25, 1.8093850397574458e-30, 7.008172489249426e-26, 2.6986217649454554e-29]
    ...
    9        [5.124952379488745e-22, 1.917571388490136e-20, 2.02434602684524e-21, 2.1246177460406675e-18, 1.8790316524963657e-11, 2.7904309518969085e-14, 7.973171243464317e-26, 6.233734909559877e-14, 9.224547341257772e-12, 1.0]
    

CLASSES ist die wahrscheinlichste Zahl für das angegebene Bild und PROBABILITIES die Wahrscheinlichkeit für jede Zahl.

Vorhersagen mit Cloud Datalab ausführen

Erstellen Sie zum Testen Ihrer Vorhersagen 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 --zone us-central1-a
  2. Starten Sie bei Bedarf in Cloud Shell die Seite mit der Liste der Cloud Datalab-Notebooks, indem Sie auf Cloud Shell-Webvorschau (das quadratische Symbol rechts oben) klicken.

  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 Datalab-Anwendung ein neues Notebook, indem Sie links oben auf das Symbol + Notebook klicken.

  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 den Befehl Ausführen oben auf der Seite, um das Onlinevorhersage-Notebook example.ipynb herunterzuladen, und kopieren Sie seinen Inhalt in das aktuelle Notebook.

  7. Aktualisieren Sie die Browserseite, um den neuen Notebookinhalt zu laden. Wählen Sie anschließend die erste Zelle mit dem JavaScript-Code aus und klicken Sie auf den Befehl Ausführen, um den Code auszufü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.

    Zahl 3 von Hand gezeichnet.

  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 gibt ein Klassen-Label und eine Liste der Wahrscheinlichkeiten zurück. Das Klassen-Label gibt eine Vorhersage zu der von Ihnen eingegebenen Zahl an. In der Liste der Wahrscheinlichkeiten enthält jeder Index von 0-9 eine Zahl. Je näher diese Zahl bei 1 liegt, desto wahrscheinlicher stimmt der Index mit der von Ihnen eingegebenen Zahl überein. Im folgenden Beispiel können Sie erkennen, dass der in der Liste hervorgehobene Slot 3 sehr nahe an 1 liegt. Entsprechend beträgt die Vorhersage 3.

    CLASSES
    3
    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]
    
  11. Die letzte Zelle im Notebook enthält ein Balkendiagramm, das anzeigt, dass Ihre Zahl vorhergesagt wurde.

    Balkendiagramm enthält Balken bei der Zahl 3.

Bereinigen

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

Sie löschen alle Ressourcen am einfachsten, indem Sie das für die Anleitung erstellte Projekt löschen.

  1. Rufen Sie in der GCP Console die Seite Projekte auf.

    Zur Seite Projekte

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie auf Löschen delete.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Beenden, um das Projekt zu löschen.

Weitere Informationen

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

Feedback geben zu...

AI Platform für TensorFlow