Kostenlose Tensorprozessoren von Google in der Colaboratory Cloud

Google hat kürzlich freien Zugriff auf seine Tensor Processing Unit (TPU) auf der Cloud-basierten Plattform für maschinelles Lernen von Colaboratory bereitgestellt. Der Tensorprozessor ist ein spezialisierter integrierter Schaltkreis (ASIC), der von Google für maschinelle Lernaufgaben unter Verwendung der TensorFlow-Bibliothek entwickelt wurde. Ich habe mich entschlossen, ein TPU-Faltungsnetzwerk auf Keras zu erlernen, das Objekte in CIFAR-10-Bildern erkennt. Der vollständige Lösungscode kann auf dem Laptop angezeigt und ausgeführt werden.


Foto cloud.google.com

Tensorprozessoren


Auf Habré wurde bereits geschrieben, wie TPUs angeordnet sind ( hier , hier und hier ) und warum TPUs für das Training neuronaler Netze gut geeignet sind . Daher werde ich nicht auf die Details der TPU-Architektur eingehen, sondern nur die Funktionen berücksichtigen, die beim Training neuronaler Netze berücksichtigt werden müssen.

Jetzt gibt es drei Generationen von Tensorprozessoren. Die TPU-Leistung der letzten und dritten Generation beträgt 420 TFlops (Billionen von Gleitkommaoperationen pro Sekunde) und enthält 128 GB Speicher mit hoher Bandbreite. Im Colaboratory sind jedoch nur TPUs der zweiten Generation verfügbar, die über 180 TFlops Leistung und 64 GB Speicher verfügen. In Zukunft werde ich diese TPUs berücksichtigen.

Der Tensorprozessor besteht aus vier Chips, von denen jeder zwei Kerne enthält, insgesamt acht Kerne in TPU. Das TPU-Training wird parallel auf allen Kernen mithilfe der Replikation durchgeführt: Eine Kopie des TensorFlow-Diagramms mit einem Achtel des Datenvolumens wird auf jedem Kern ausgeführt.

Die Basis des Tensorprozessors ist eine Matrixeinheit (MXU). Es verwendet die listige Datenstruktur eines systolischen Arrays mit 128 x 128 für eine effiziente Implementierung von Matrixoperationen. Um die Nutzung der TPU-Ausrüstungsressourcen zu maximieren, muss die Dimension des Mini-Samples oder der Mini-Features daher ein Vielfaches von 128 ( Quelle ) sein. Aufgrund der Natur des TPU-Speichersystems ist es auch wünschenswert, dass die Abmessung des Mini-Samples und der Merkmale ein Vielfaches von 8 ist.

Laborplattform


Colaboratory ist Googles Cloud-Plattform zur Weiterentwicklung der Technologie für maschinelles Lernen. Sie können eine virtuelle Maschine mit den installierten beliebten Bibliotheken TensorFlow, Keras, sklearn, pandas usw. kostenlos herunterladen. Am bequemsten ist es, wenn Sie Laptops ähnlich wie Jupyter im Labor ausführen können. Laptops werden auf Google Drive gespeichert. Sie können sie verteilen und sogar die Zusammenarbeit organisieren. So sieht der Laptop im Labor aus (das Bild kann angeklickt werden ):



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

Detaillierte Anweisungen zur Arbeit an der Colaboratory-Plattform finden Sie hier , hier und hier .

Schließen Sie den Tensorprozessor an das Labor an


Standardmäßig verwendet Colaboratory keine GPU- oder TPU-Berechnungsbeschleuniger. Sie können sie über das Menü Laufzeit -> Laufzeittyp ändern -> Hardwarebeschleuniger verbinden. Wählen Sie in der angezeigten Liste "TPU" aus:
Bild

Nach Auswahl des Beschleunigertyps wird die virtuelle Maschine, an die der Colaboratory-Laptop angeschlossen ist, neu gestartet und die TPU wird verfügbar.

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

Keras Neural Network für die CIFAR-10-Erkennung


Versuchen wir beispielsweise, ein Keras-Neuronales Netzwerk auf TPU zu trainieren, das Bilder aus dem CIFAR-10-Datensatz erkennt. Dies ist ein beliebter Datensatz, der kleine Bilder von Objekten aus 10 Klassen enthält: Flugzeug, Auto, Vogel, Katze, Hirsch, Hund, Frosch, Pferd, Schiff und LKW. Klassen überschneiden sich nicht, jedes Objekt im Bild gehört nur einer Klasse an.

Laden Sie den CIFAR-10-Datensatz mit Keras herunter:

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

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

 def create_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 

Bisher können Keras-Optimierer nicht für TPUs verwendet werden. Daher wird beim Kompilieren eines Modells der Optimierer von TensorFlow angegeben.

Wir erstellen ein Keras-Modell für die CPU, das wir im nächsten Schritt in ein Modell für TPU konvertieren werden:

 cpu_model = create_model() 

Konvertieren Sie das neuronale Keras-Netzwerk in das TPU-Modell


Modelle auf Keras und TensorFlow können ohne Änderungen auf der GPU trainiert werden. Sie können dies bisher nicht auf TPU tun, daher müssen Sie das von uns erstellte Modell in ein Modell für TPU konvertieren.

Zuerst müssen Sie herausfinden, wo sich die uns zur Verfügung stehende TPU befindet. Auf der Colaboratory-Plattform kann dies mit dem folgenden Befehl erfolgen:

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

In meinem Fall stellte sich heraus, dass die TPU-Adresse grpc://10.102.233.146:8470 . Die Adressen waren für verschiedene Starts unterschiedlich.

Jetzt können Sie das Modell für TPU mit der Funktion 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 enthält die Protokollierung auf Info-Ebene. Hier ist das Modellkonvertierungsprotokoll:

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.


Sie können sehen, dass TPU an der zuvor angegebenen Adresse gefunden wurde und 8 Kerne hat. Wir sehen auch eine Warnung, dass tpu_model experimentell ist und jederzeit geändert oder gelöscht werden kann. Ich hoffe, dass es im Laufe der Zeit möglich sein wird, Keras-Modelle ohne Konvertierung direkt auf TPU zu trainieren.

Wir trainieren Modell auf TPU


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

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

Was sind die Funktionen hier. Wir erinnern uns, dass die Mini-Stichprobengröße ein Vielfaches von 128 sein muss, um TPUs effektiv nutzen zu können. Außerdem wird an jedem TPU-Kern mit einem Achtel aller Daten in der Mini-Stichprobe trainiert. Daher setzen wir die Größe des Mini-Samples während des Trainings auf 128 * 8, wir erhalten 128 Bilder für jeden TPU-Kern. Sie können eine größere Größe verwenden, z. B. 256 oder 512, dann ist die Leistung höher.

In meinem Fall erfordert das Training einer Ära durchschnittlich 6 s.

Die Qualität der Bildung in der 50. Ära:
Epoch 50/50
- 6s - loss: 0.2727 - sparse_categorical_accuracy: 0.9006


Der Anteil der richtigen Antworten auf die Trainingsdaten betrug 90,06%. Wir überprüfen die Qualität der Testdaten mit TPU:

 scores = tpu_model.evaluate(x_test, y_test, verbose=0, batch_size=batch_size * 8) print("     : %.2f%%" % (scores[1]*100)) 

: 80.79%

Speichern Sie nun die Gewichte des trainierten Modells:

 tpu_model.save_weights("cifar10_model.h5") 

TensorFlow gibt uns eine Nachricht, 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 der virtuellen Colaboratory-Maschine gespeichert wurden. Wenn die virtuelle Maschine gestoppt wird, werden alle Daten von ihr gelöscht. Wenn Sie trainierte Gewichte nicht verlieren möchten, speichern Sie sie auf Ihrem Computer:

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

Objekte auf der CPU erkennen


Versuchen wir nun, ein auf TPU trainiertes Modell zu verwenden, um Objekte in Bildern mithilfe der CPU zu erkennen. Erstellen Sie dazu das Modell erneut und laden Sie die auf TPU trainierten Gewichte hinein:

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

Das Modell ist auf dem Zentralprozessor einsatzbereit. Versuchen wir, mit seiner Hilfe eines der Bilder der CIFAR-10-Testsuite zu erkennen:

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



Das Bild ist klein, aber Sie können verstehen, dass dies ein Flugzeug ist. Wir beginnen mit der Anerkennung:

 #      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 der Ausgabewerte von Neuronen, von denen fast alle nahe Null sind, mit Ausnahme des ersten Werts, der der Ebene entspricht.

[[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]]


Anerkennung war erfolgreich!

Zusammenfassung


Es war möglich, die Funktionsfähigkeit von TPU auf der Colaboratory-Plattform zu demonstrieren. Es kann zum Trainieren neuronaler Netze auf Keras verwendet werden. Das CIFAR-10-Dataset ist jedoch zu klein, es reicht nicht aus, um TPU-Ressourcen vollständig zu laden. Die Beschleunigung im Vergleich zur GPU stellte sich als gering heraus (Sie können sich selbst überprüfen, indem Sie die GPU als Beschleuniger anstelle der TPU auswählen und das Modell erneut trainieren).

Auf Habré gibt es einen Artikel, in dem die Leistung von TPUs und GPUs V100 beim Training des Netzwerks ResNet-50 gemessen wurde . Bei dieser Aufgabe zeigte die TPU die gleiche Leistung wie die vier V100-GPUs. Es ist schön, dass Google einen so leistungsstarken Lernbeschleuniger für neuronale Netze kostenlos zur Verfügung stellt!

Video, das das Training des neuronalen Keras-Netzwerks auf TPU demonstriert.


Nützliche Links


  1. Labor-Laptop mit vollständigem Keras TPU-Modell-Lerncode .
  2. Laborheft mit Keras TPU-Trainingsbeispiel zum Erkennen von Kleidung und Schuhen von Fashion MNIST .
  3. Tensorprozessoren in der Google Cloud .
  4. Merkmale der Architektur und Verwendung von Tensorprozessoren .

Source: https://habr.com/ru/post/de428117/


All Articles