Kostenlose Tensor-Prozessoren von Google im Cloud-Labor

  • Tutorial
Vor kurzem hat Google freien Zugang zu seinen Tensor-Prozessoren (Tensor Processing Unit, TPU) im cloudbasierten maschinellen Lernlabor gewährt . Der Tensor-Prozessor ist ein spezialisierter integrierter Schaltkreis (ASIC), der von Google für maschinelle Lernaufgaben unter Verwendung der TensorFlow-Bibliothek entwickelt wurde. Ich entschloss mich, ein TP-Keras-Faltungsnetzwerk zu unterrichten, das Objekte in CIFAR-10-Bildern erkennt. Der vollständige Lösungscode kann auf einem Laptop angezeigt und ausgeführt werden .


Fotos cloud.google.com

Tensor-Prozessoren


Auf Habré haben sie bereits darüber geschrieben, wie TPUs ( hier , hier und hier ) angeordnet sind und warum TPUs zum Erlernen neuronaler Netzwerke geeignet sind . Daher werde ich nicht auf die Details der TPU-Architektur eingehen, sondern nur die Funktionen berücksichtigen, die beim Training von Neon-Netzwerken berücksichtigt werden müssen.

Jetzt gibt es drei Generationen von Tensor-Prozessoren, die Leistung von TPU ist die neueste, die dritte Generation ist 420 TFlops (Billionen von Gleitkommaoperationen pro Sekunde) und enthält 128 GB Speicher mit hoher Bandbreite. Im Colaboratory stehen jedoch nur TPUs der zweiten Generation mit 180 TFlops Leistung und 64 GB Arbeitsspeicher zur Verfügung. In Zukunft werde ich diese TPUs betrachten.

Der Tensorprozessor besteht aus vier Chips, die jeweils zwei Kerne und insgesamt acht Kerne in der TPU enthalten. Die Schulung zu TPU wird auf allen Kernen mithilfe von Replikation parallel durchgeführt: Jeder Kern führt eine Kopie des TensorFlow-Diagramms mit einem Achtel der Daten aus.

Die Basis des Tensorprozessors ist die Matrixeinheit (MXU). Es nutzt die clevere Datenstruktur des 128 × 128 systolischen Arrays zur effizienten Implementierung von Matrixoperationen. Um die Ressourcen der TPU-Ausrüstung optimal zu nutzen, muss die Dimension der Mini-Stichprobe oder der Attribute ein Vielfaches von 128 sein ( Quelle ). Aufgrund der Besonderheiten des TPU-Speichersystems ist es auch wünschenswert, dass die Abmessung des Mini-Samples und der Merkmale ein Vielfaches von 8 sind.

Collaboration-Plattform


Collaboration ist die Cloud-Plattform von Google zur Förderung von Machine Learning-Technologien. Darauf können Sie eine kostenlose virtuelle Maschine mit installierten populären Bibliotheken TensorFlow, Keras, Sklearn, Pandas usw. erhalten. Am bequemsten ist es, dass Sie Laptops wie Jupyter auf Colaboratory ausführen können. Laptops werden auf Google Drive gespeichert. Sie können sie verteilen und sogar die Zusammenarbeit organisieren. Hier ist der Laptop auf Colaboratory (das Bild ist anklickbar ):



Sie schreiben Code in einem Browser in einem Laptop, der auf einer virtuellen Maschine in der Google Cloud ausgeführt wird. Das Auto wird Ihnen für 12 Stunden gegeben, danach hält es an. Nichts hindert Sie jedoch daran, eine andere virtuelle Maschine auszuführen und weitere 12 Stunden zu arbeiten. Denken Sie daran, dass nach dem Stoppen einer virtuellen Maschine alle Daten von ihr gelöscht werden. Vergessen Sie daher nicht, die erforderlichen Daten auf Ihrem Computer oder Google Drive zu speichern. Laden Sie die virtuelle Maschine nach dem Neustart erneut.

Detaillierte Anweisungen zum Arbeiten auf der Colaboratory-Plattform finden Sie hier , hier und hier .

Wir verbinden den Tensorprozessor bei Colaboratory


Standardmäßig verwendet Collaboration keine GPU- oder TPU-Rechenbeschleuniger. Sie können diese im Menü Laufzeit -> Laufzeittyp ändern -> Hardwarebeschleuniger verbinden.
Bild

Wählen Sie in der angezeigten Liste "TPU" aus: Nach Auswahl des Beschleunigertyps wird die virtuelle Maschine, mit der der Laptop verbunden ist, neu gestartet, und die TPU wird verfügbar.

Wenn Sie Daten auf die virtuelle Maschine hochladen, werden diese während des Neustarts gelöscht. Daten erneut herunterladen müssen.

Keras neuronales Netzwerk zur Erkennung von CIFAR-10


Versuchen wir als Beispiel, ein neuronales Netzwerk in Keras in TPU zu lernen, das Bilder aus dem CIFAR-10-Datensatz erkennt . Dies ist ein beliebter Datensatz mit kleinen Bildern von 10 Klassenobjekten: einem Flugzeug, einem Auto, einem Vogel, einer Katze, einem Hirsch, einem Hund, einem Frosch, einem Pferd, einem Schiff und einem Lastwagen. Klassen überlappen sich nicht, jedes Objekt im Bild gehört nur einer Klasse an.

Laden Sie den CIFAR-10-Datensatz mit Keras:

(x_train, y_train), (x_test, y_test) = cifar10.load_data()

Um ein neuronales Netzwerk zu erstellen, habe ich eine eigene Funktion gestartet. Wir werden dasselbe Modell zweimal erstellen: Die erste Version des Modells für TPU, auf der wir trainieren, und die zweite für die CPU, in der wir Objekte erkennen werden.

defcreate_model():
    input_layer = Input(shape=(32, 32, 3), dtype=tf.float32, name='Input')
    x = BatchNormalization()(input_layer)
    x = Conv2D(32, (3, 3), padding='same', activation='relu')(x)
    x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
    x = MaxPooling2D(pool_size=(2, 2))(x)
    x = Dropout(0.25)(x)
    x = BatchNormalization()(x)
    x = Conv2D(64, (3, 3), padding='same', activation='relu')(x)
    x = Conv2D(64, (3, 3), activation='relu')(x)
    x = MaxPooling2D(pool_size=(2, 2))(x)
    x = Dropout(0.25)(x)
    x = Flatten()(x)
    x = Dense(512, activation='relu')(x)
    x = Dropout(0.5)(x)
    output_layer = Dense(10, activation='softmax')(x)
    model = Model(inputs=[input_layer], outputs=[output_layer])
    model.compile(
        optimizer=tf.train.AdamOptimizer(0.001),
        loss=tf.keras.losses.sparse_categorical_crossentropy,
        metrics=['sparse_categorical_accuracy'])
    return model

Derzeit können die Keras-Optimierer nicht auf TPUs verwendet werden. Beim Kompilieren des Modells wird der Optimierer von TensorFlow angezeigt.

Erstellen Sie ein Keras-Modell für eine CPU, das im nächsten Schritt in ein Modell für TPU konvertiert wird:

cpu_model = create_model()

Wir konvertieren das neuronale Netzwerk auf Keras in ein Modell für TPU


Keras- und TensorFlow-Modelle können ohne Änderungen an der GPU trainiert werden. Derzeit ist dies auf TPU nicht möglich, daher müssen wir das von uns erstellte Modell in ein Modell für TPU konvertieren.

Zuerst müssen Sie wissen, wo das TPU für uns verfügbar ist. Auf der Colaboratory-Plattform kann dies mit dem folgenden Befehl ausgeführt werden:

TPU_WORKER = 'grpc://' + os.environ['COLAB_TPU_ADDR']

In meinem Fall war die TPU-Adresse eine solche - grpc://10.102.233.146:8470. Die Adressen waren für verschiedene Starts unterschiedlich.

Jetzt können Sie ein Modell für TPU mit der Funktion erhalten keras_to_tpu_model:

tf.logging.set_verbosity(tf.logging.INFO)
tpu_model = tf.contrib.tpu.keras_to_tpu_model(
    cpu_model,
    strategy=tf.contrib.tpu.TPUDistributionStrategy(
        tf.contrib.cluster_resolver.TPUClusterResolver(TPU_WORKER)))

Die erste Zeile beinhaltet die Protokollierung auf der Info-Ebene. Folgendes befindet sich im Modellkonvertierungsprotokoll: Sie können feststellen, dass TPU an der zuvor angegebenen Adresse gefunden wurde. Es hat 8 Kerne. Wir sehen auch eine Warnung, die experimentell ist und jederzeit geändert oder gelöscht werden kann. Ich hoffe, dass es möglich ist, Keras-Modelle ohne Transformation direkt auf TPU zu trainieren.

INFO:tensorflow:Querying Tensorflow master (b'grpc://10.102.233.146:8470') for TPU system metadata.
INFO:tensorflow:Found TPU system:
INFO:tensorflow:*** Num TPU Cores: 8
INFO:tensorflow:*** Num TPU Workers: 1
INFO:tensorflow:*** Num TPU Cores Per Worker: 8
...
WARNING:tensorflow:tpu_model (from tensorflow.contrib.tpu.python.tpu.keras_support) is experimental and may change or be removed at any time, and without warning.


tpu_model

Wir vermitteln das Modell auf TPU


Das Modell für TPU kann auf übliche Weise für Keras trainiert werden, indem die Methode aufgerufen wird fit:

history = tpu_model.fit(x_train, y_train,
    batch_size=128*8,
    epochs=50,
    verbose=2)

Was sind die Funktionen hier? Wir erinnern uns daran, dass die Mini-Sample-Größe ein Vielfaches von 128 sein muss, um die TPU effektiv nutzen zu können. Darüber hinaus wird ein Achtel aller Daten in der Mini-Probe auf jedem TPU-Kern ausgeführt. Daher wird beim Training die Größe der Mini-Probe auf 128 * 8 eingestellt, es werden 128 Bilder für jeden TPU-Kern erhalten. Sie können eine größere Größe verwenden, z. B. 256 oder 512, dann ist die Leistung höher.

In meinem Fall sind durchschnittlich 6 Sekunden erforderlich, um eine Epoche zu trainieren.

Bildungsqualität in der 50. Epoche: Der Anteil der richtigen Antworten auf die Trainingsdaten betrug 90,06%. Überprüfen Sie die Qualität der Testdaten mit TPU:
Epoch 50/50
- 6s - loss: 0.2727 - sparse_categorical_accuracy: 0.9006




scores = tpu_model.evaluate(x_test, y_test, verbose=0, batch_size=batch_size * 8)
print("Доля верных ответов на тестовых данных: %.2f%%" % (scores[1]*100))

Доля верных ответов на тестовых данных: 80.79%

Sparen Sie jetzt das Gewicht des trainierten Modells:

tpu_model.save_weights("cifar10_model.h5")

TensorFlow meldet, dass die Gewichte von der TPU zur CPU übertragen werden:
INFO:tensorflow:Copying TPU weights to the CPU

Es ist zu beachten, dass die Gewichte des trainierten Netzwerks auf der Festplatte des virtuellen Computers des Labors gespeichert wurden. Wenn die virtuelle Maschine gestoppt ist, werden alle Daten von ihr gelöscht. Wenn Sie die trainierten Gewichte nicht verlieren möchten, speichern Sie sie auf Ihrem Computer:

from google.colab import files
files.download("cifar10_model.h5")

Erkennen Sie Objekte in der CPU


Versuchen wir nun, ein TPU-trainiertes Modell zu verwenden, um Objekte in Bildern mithilfe der CPU zu erkennen. Dazu erstellen wir ein neues Modell und laden TPU-trainierte Gewichte hinein:

model = create_model()
model.load_weights("cifar10_model.h5")

Das Modell kann auf dem zentralen Prozessor verwendet werden. Versuchen wir mit seiner Hilfe eines der Bilder des Testsets CIFAR-10 zu erkennen:

index=111
plt.imshow(toimage(x_test[index]))
plt.show()



Das Bild ist klein, aber man kann verstehen, dass dies ein Flugzeug ist. Führen Sie die Anerkennung aus:

# Названия классов из набора данных CIFAR-10
classes=['самолет', 'автомобиль', 'птица', 'кот', 'олень', 'собака', 'лягушка', 'лошадь', 'корабль', 'грузовик']
x = x_test[index]
# Добавляем размерность, т.к. Keras распознает массив изображений
x = np.expand_dims(x, axis=0)
# Запускаем распознавание
prediction = model.predict(x)
# Печатаем значения на выходе из сети
print(prediction)
# Печатаем название класса объекта
prediction = np.argmax(prediction)
print(classes[prediction])

Wir erhalten eine Liste mit Ausgabewerten von Neuronen, von denen fast alle nahe bei Null sind, außer dem ersten Wert, der der Ebene entspricht. Anerkennung war erfolgreich!

[[9.81738389e-01 2.91262069e-07 1.82225723e-02 9.78524668e-07
5.89265142e-07 6.76223244e-10 1.03252004e-10 9.23009047e-09
3.71878523e-05 3.16599618e-08]]
самолет




Ergebnisse


Die Leistung von TPU konnte auf der Plattform von Laboratory demonstriert werden. Mit ihr können neuronale Netze auf Keras trainiert werden. Der CIFAR-10-Datensatz ist jedoch zu klein, es reicht nicht aus, um die TPU-Ressourcen vollständig zu laden. Die Beschleunigung im Vergleich zur GPU erwies sich als gering (Sie können dies selbst überprüfen, indem Sie GPU statt TPU als Beschleuniger wählen und das Modell erneut trainieren).

Auf Habré gibt es einen Artikel, in dem die Leistung von TPU und GPU V100 im Schulungsnetzwerk ResNet-50 gemessen wurde . Bei dieser Aufgabe zeigte das TPU die gleiche Leistung wie die vier V100-GPUs. Es ist schön, dass Google einen so mächtigen Beschleuniger für das Lernen neuronaler Netzwerke kostenlos gibt!

Ein Video, das den Unterricht des neuronalen Keras-Netzwerks auf TPU demonstriert.


Nützliche Links


  1. Colaboratorys Laptop mit vollständigem Keras TPU-Modell-Lerncode .
  2. Colaboratorys Laptop mit einem Beispiel von Keras 'TPU-Modell zur Erkennung von Kleidern und Schuhen von Fashion MNIST .
  3. Tensor-Prozessoren in der Google-Cloud .
  4. Merkmale der Architektur und Verwendung von Tensorprozessoren .

Jetzt auch beliebt: