MNIST auf Cloud TPU ausführen (TF 2.x)


Diese Anleitung enthält eine allgemeine Beschreibung des MNIST-Modells, Anleitungen zum Herunterladen des TensorFlow-TPU-Codebeispiels für MNIST und eine Anleitung zum Ausführen des Codes in der Cloud TPU.

Haftungsausschluss

In dieser Anleitung wird ein Dataset eines Drittanbieters verwendet. Google bietet keine Zusicherungen, Gewährleistungen oder andere Garantien hinsichtlich der Gültigkeit oder anderer Aspekte dieses Datasets.

Modellbeschreibung

Das MNIST-Dataset enthält eine große Anzahl von Bildern handschriftlicher Ziffern im Bereich von 0 bis 9 sowie die Labels, die die Ziffer in jedem Bild identifizieren.

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:

  • 60.000 Trainingsdatenbeispiele
  • 10.000 Testdatenbeispiele
  • 5.000 Validierungsdatenbeispiele

Das Modell besteht aus sieben Ebenen:

  • 2 x Faltung
  • 2 x max. Pooling
  • 2 x Dichte (vollständig verbunden)
  • 1 x Dropout

Verlust wird über kategoriale Cross-Entropie berechnet.

Diese Version des MNIST-Modells verwendet die Keras API, die neben anderen Methoden zum Erstellen und Ausführen eines Modells für maschinelles Lernen auf einer Cloud TPU empfohlen wird.

Keras vereinfacht den Modellentwicklungsprozess, indem der Großteil der Implementierungen auf untergeordneter Eben ausgeblendet wird, wodurch auch ein Wechsel zwischen TPU und anderen Testplattformen wie GPUs oder CPUs erleichtert wird.

Lernziele

  • Cloud Storage-Bucket zum Speichern der Dataset- und Modellausgabe erstellen
  • Trainingsjob ausführen
  • Ausgabeergebnisse überprüfen

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Hinweise

Dieser Abschnitt enthält Informationen zum Einrichten eines Cloud Storage-Buckets und einer Compute Engine-VM.

  1. Öffnen Sie ein Cloud Shell-Fenster.

    Cloud Shell öffnen

  2. Erstellen Sie eine Variable für Ihre Projekt-ID.

    export PROJECT_ID=project-id
    
  3. Konfigurieren Sie die Google Cloud CLI so, dass das Projekt verwendet wird, in dem Sie eine Cloud TPU erstellen möchten.

    gcloud config set project ${PROJECT_ID}
    

    Wenn Sie diesen Befehl zum ersten Mal in einer neuen Cloud Shell-VM ausführen, wird die Seite Authorize Cloud Shell angezeigt. Klicken Sie unten auf der Seite auf Authorize, um gcloud das Ausführen von Google Cloud API-Aufrufen mit Ihren Anmeldedaten zu erlauben.

  4. Erstellen Sie ein Dienstkonto für das Cloud TPU-Projekt.

    gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID
    

    Der Befehl gibt ein Cloud TPU-Dienstkonto im folgenden Format zurück:

    service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
    

  5. Erstellen Sie mit dem folgenden Befehl einen Cloud Storage-Bucket:

    gsutil mb -p ${PROJECT_ID} -c standard -l us-central1 gs://bucket-name
    

    Dieser Cloud Storage-Bucket speichert die Daten, die Sie zum Trainieren Ihres Modells verwenden, und die Trainingsergebnisse. Mit dem in dieser Anleitung verwendeten gcloud-Befehl werden Standardberechtigungen für das Cloud TPU-Dienstkonto eingerichtet, das Sie im vorherigen Schritt eingerichtet haben. Wenn Sie detailliertere Berechtigungen benötigen, können Sie die Berechtigungen auf Zugriffsebene anpassen.

  6. Starten Sie mit dem Befehl gcloud eine Compute Engine-VM und eine Cloud TPU. Der verwendete Befehl hängt davon ab, ob Sie TPU-VMs oder TPU-Knoten verwenden. Weitere Informationen finden Sie unter Systemarchitektur.

    TPU-VM

    $ gcloud compute tpus tpu-vm create mnist-tutorial \
    --zone=us-central1-b \
    --accelerator-type=v3-8 \
    --version=tpu-vm-tf-2.16.1-pjrt \
    --preemptible
    

    Beschreibung der Befehls-Flags

    zone
    Die Zone, in der Sie die Cloud TPU erstellen möchten.
    accelerator-type
    Der Beschleunigertyp gibt die Version und Größe der Cloud TPU an, die Sie erstellen möchten. Weitere Informationen zu unterstützten Beschleunigertypen für die einzelnen TPU-Versionen finden Sie unter TPU-Versionen.
    version
    Die Cloud TPU-Softwareversion.
    preemptible
    Die TPUs auf Abruf kosten weniger, können aber jederzeit heruntergefahren werden.

    TPU-Knoten

    $ gcloud compute tpus execution-groups create \
    --name=mnist-tutorial \
    --zone=us-central1-b \
    --tf-version=2.12.0 \
    --machine-type=n1-standard-1 \
    --accelerator-type=v3-8 \
    --preemptible
    

    Beschreibung der Befehls-Flags

    name
    Der Name der zu erstellenden Cloud TPU.
    zone
    Die Zone, in der Sie die Cloud TPU erstellen möchten.
    tf-version
    Die TensorFlow-Version, mit der der Befehl gcloud auf der VM installiert wird.
    machine-type
    Der Maschinentyp der Compute Engine-VM, die erstellt werden soll.
    accelerator-type
    Der Typ der zu erstellenden Cloud TPU.
    preemptible
    Die TPUs auf Abruf kosten weniger, können aber jederzeit heruntergefahren werden.

    Weitere Informationen zum Befehl gcloud finden Sie in der gcloud-Referenz.

  7. Wenn der Befehl gcloud compute tpus ausgeführt wurde, sollten Sie prüfen, ob die Shell-Eingabeaufforderung von username@projectname zu username@vm-name geändert wurde. Diese Änderung bedeutet, dass Sie jetzt bei Ihrer Compute Engine-VM angemeldet sind.

    Wenn Sie nicht mit der Compute Engine-Instanz verbunden sind, können Sie die Verbindung mit dem folgenden Befehl herstellen:

    TPU-VM

    gcloud compute tpus tpu-vm ssh mnist-tutorial --zone=us-central1-b
    

    TPU-Knoten

    gcloud compute ssh mnist-tutorial --zone=us-central1-b
    

    Führen Sie im weiteren Verlauf dieser Anleitung jeden Befehl, der mit (vm)$ beginnt, in Ihrem VM-Sitzungsfenster aus.

  8. Erstellen Sie eine Umgebungsvariable für den TPU-Namen.

    TPU-VM

    (vm)$ export TPU_NAME=local
    

    TPU-Knoten

    (vm)$ export TPU_NAME=mnist-tutorial
    
  9. Installieren Sie TensorFlow-Anforderungen.

    Der verwendete Befehl hängt davon ab, ob Sie TPU-VMs oder TPU-Knoten verwenden.

    TPU-VM

    (vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
    

    TPU-Knoten

    (vm)$ pip3 install --user tensorflow-model-optimization>=0.1.3
    

Modell trainieren

Der Quellcode für das MNIST-TPU-Modell ist auf GitHub verfügbar.

  1. Legen Sie die folgenden Variablen fest: Ersetzen Sie bucket-name durch den Namen Ihres Buckets.

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/mnist
    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/data
    
  2. Legen Sie die Umgebungsvariable PYTHONPATH fest.

    TPU-VM

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/tpu/models"
    

    TPU-Knoten

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
    
  3. Wenn Sie beim Erstellen Ihrer TPU den Parameter --version auf eine Version festlegen, die auf -pjrt endet, legen Sie die folgenden Umgebungsvariablen fest, um die PJRT-Laufzeit zu aktivieren:

      (vm)$ export NEXT_PLUGGABLE_DEVICE_USE_C_API=true
      (vm)$ export TF_PLUGGABLE_DEVICE_LIBRARY_PATH=/lib/libtpu.so
    
  4. Wechseln Sie zum Verzeichnis, in dem sich das Modell befindet:

    TPU-VM

    (vm)$ cd /usr/share/tpu/models/official/legacy/image_classification
    

    TPU-Knoten

    (vm)$ cd /usr/share/models/official/legacy/image_classification
    
  5. Führen Sie das MNIST-Trainingsskript aus:

    (vm)$ python3 mnist_main.py \
      --tpu=${TPU_NAME} \
      --model_dir=${MODEL_DIR} \
      --data_dir=${DATA_DIR} \
      --train_epochs=10 \
      --distribution_strategy=tpu \
      --download
    

    Beschreibung der Befehls-Flags

    tpu
    Der Name der Cloud TPU. Wenn beim Einrichten der Compute Engine VM und Cloud TPU kein Name angegeben wird, wird standardmäßig Ihr Nutzername verwendet.
    model_dir
    Der Cloud Storage-Bucket, in dem während des Trainings Prüfpunkte und Zusammenfassungen gespeichert werden. Sie können einen vorhandenen Ordner verwenden, um zuvor generierte Prüfpunkte zu laden, die auf einer TPU mit derselben Größe und TensorFlow-Version erstellt wurden.
    data_dir
    Der Cloud Storage-Pfad der Trainingseingabe. In diesem Beispiel ist er auf das Dataset "fake_imagenet" festgelegt.
    train_epochs
    Die Anzahl der Epochen zum Trainieren des Modells.
    distribution_strategy
    Zum Trainieren des ResNet-Modells auf einer Cloud TPU setzen Sie distribution_strategy auf tpu.
    download
    Wenn dieser Wert auf true gesetzt ist, lädt das Skript das MNIST-Dataset herunter und vorverarbeitet es vor, falls es noch nicht heruntergeladen wurde.

Auf einer Cloud TPU v3-8 wird das Trainingsskript in weniger als 5 Minuten ausgeführt. Die Ausgabe sieht in etwa so aus:

Run stats:
{
  'accuracy_top_1': 0.9762369990348816,
  'eval_loss': 0.07863274961709976,
  'loss': 0.1111728847026825,
  'training_accuracy_top_1': 0.966645359992981
}

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

  1. Trennen Sie die Verbindung zur Compute Engine-Instanz, sofern noch nicht geschehen:

    (vm)$ exit
    

    Die Eingabeaufforderung sollte nun username@projectname lauten und angeben, dass Sie sich in Cloud Shell befinden.

  2. Löschen Sie Ihre Cloud TPU- und Compute Engine-Ressourcen. Der Befehl zum Löschen Ihrer Ressourcen hängt davon ab, ob Sie TPU-VMs oder TPU-Knoten verwenden. Weitere Informationen finden Sie unter Systemarchitektur.

    TPU-VM

    $ gcloud compute tpus tpu-vm delete mnist-tutorial \
    --zone=us-central1-b
    

    TPU-Knoten

    $ gcloud compute tpus execution-groups delete mnist-tutorial \
    --zone=us-central1-b
    
  3. Prüfen Sie, ob die Ressourcen gelöscht wurden. Führen Sie dazu gcloud compute tpus execution-groups list aus. Der Löschvorgang kann einige Minuten dauern. Die Ausgabe des folgenden Befehls sollte keine der in dieser Anleitung erstellten Ressourcen enthalten:

    TPU-VM

    $ gcloud compute tpus tpu-vm list --zone=us-central1-b

    TPU-Knoten

    $ gcloud compute tpus execution-groups list --zone=us-central1-b
  4. Löschen Sie Ihren Cloud Storage-Bucket wie unten gezeigt mit gsutil. Ersetzen Sie bucket-name durch den Namen des Cloud Storage-Buckets.

    $ gsutil rm -r gs://bucket-name
    

Nächste Schritte

In den Cloud TPU-Anleitungen von TensorFlow wird das Modell in der Regel mithilfe eines Beispiel-Datasets trainiert. Die Ergebnisse dieses Trainings sind nicht für Inferenzen verwendbar. Wenn Sie ein Modell für die Inferenz verwenden möchten, können Sie die Daten mit einem öffentlich verfügbaren Dataset oder Ihrem eigenen Dataset trainieren. Für TensorFlow-Modelle, die auf Cloud TPUs trainiert wurden, müssen im Allgemeinen Datasets im TFRecord-Format erforderlich sein.

Mit dem Beispiel für das Dataset-Konvertierungstool können Sie ein Bildklassifizierungs-Dataset in das TFRecord-Format konvertieren. Wenn Sie kein Bildklassifizierungsmodell verwenden, müssen Sie das Dataset selbst in das TFRecord-Format konvertieren. Weitere Informationen finden Sie unter TFRecord und tf.Example.

Hyperparameter-Feinabstimmung

Sie können die Hyperparameter des Modells abstimmen, um die Leistung des Modells mit Ihrem Dataset zu verbessern. Informationen zu den Hyperparametern, die alle von der TPU unterstützten Modelle gemeinsam sind, finden Sie auf GitHub. Informationen zu modellspezifischen Hyperparametern finden Sie im Quellcode des jeweiligen Modells. Weitere Informationen zur Abstimmung von Hyperparametern finden Sie unter Übersicht über die Abstimmung von Hyperparametern und Hyperparameter abstimmen.

Inferenz

Nachdem Sie Ihr Modell trainiert haben, können Sie es für Inferenzen (auch Vorhersage genannt) verwenden. Mit dem Cloud TPU-Inferenzkonverter-Tool können Sie ein TensorFlow-Modell für die Inferenz in Cloud TPU v5e vorbereiten und optimieren. Weitere Informationen zur Inferenz in Cloud TPU v5e finden Sie unter Einführung in Cloud TPU v5e-Inferenz.