[PYTHON] Versuchen Sie Daten parallel zu Distributed TensorFlow

Was ist Daten parallel?

Letztes Mal hat Distributed TensorFlow erstellt, um Parallelität zu modellieren, aber dieses Mal werde ich versuchen, durch Datenparallelität zu lernen. Es gibt zwei Arten der Parallelisierung: Modellparallelität und Datenparallelisierung. Grob gesagt sind dies jedoch die folgenden.

Die Modellparallelität hängt natürlich vom Modell ab, sodass gesagt werden kann, dass es vielseitiger ist, die Daten zu reduzieren, die gleichzeitig in der Datenparallelität verarbeitet werden.

Parameterfreigabe

Bei der Datenparallelisierung im Training werden mehrere Kopien von Modellen mit denselben Parametern erstellt, Stapel werden in kleine Stapel unterteilt, an jede Kopie des Modells übergeben und jeweils zur Berechnung des Differentials erstellt. Mit anderen Worten, es ist notwendig, für jedes Gerät ein Modell mit denselben Parametern zu haben, aber die Handhabung ist etwas schwierig zu verstehen. Ich werde diesmal keine GPU verwenden, sondern für die Berechnung und gemeinsame Nutzung von Parametern auf mehreren Geräten die offizielle Beschreibung der GPU (Verwenden von GPUs). .7 / how_tos / using_gpu / index.html # using-gpus), Sharing Variables) Wird hilfreich sein.

Mit tf.variable_scope () können Sie den Bereich einer Variablen definieren. Wenn Sie Variablen mit demselben Namen im selben Bereich verwenden möchten, können Sie get_variable () mit gesetztem Wiederverwendungsflag aufrufen. get_variable () verhält sich wie das Zurückgeben einer neuen Erstellung, wenn das Wiederverwendungsflag nicht gesetzt ist, und das Zurückgeben eines Links zu einer vorhandenen Variablen mit demselben Namen, wenn es gesetzt ist. Sie können dies verwenden, um Parameter zu teilen.

Wenn Sie später auf das Diagramm verweisen, verwenden Sie Sammlung.

Cluster-Konfiguration

In Whitepaper zu verteiltem Tensorflow verwaltet und aktualisiert der Server, der Variable verwaltet, ein Parametergerät, Parameter, und der Master arbeitet für jeden Mitarbeiter. Es gibt eine Beschreibung zum Werfen (sorry, ich habe es nicht richtig gelesen ...). Während ich diagonal darüber las, entschied ich mich, Variablen gemeinsam mit master zu verwalten und eine Konfiguration zu erstellen, bei der zwei Mitarbeiter die unterteilten Stapel verarbeiten. Es ist möglich, den Server (ps) für Parameter separat zu trennen, diesmal wird er jedoch in den Master aufgenommen.

--Erstellen Sie eine Variable mit ps-Bereich auf dem Master-Gerät --Verwenden Sie ps-Bereichsvariablen, um die Differenzierung auf jedem Arbeitsgerät zu berechnen

Ich werde es in der Abteilung beschreiben. Die Figur ist wie folgt.

data_parallel.png

Versuche dich zu bewegen

Starten Sie den grpc-Server. Die Clusterkonfiguration besteht also aus einem Master und zwei Workern

grpc_tensorflow_server --cluster_spec='master|localhost:2222,worker|localhost:2223,worker_|localhost:2224' --job_name=master --task_index=0 &
grpc_tensorflow_server --cluster_spec='master|localhost:2222,worker|localhost:2223,worker_|localhost:2224' --job_name=worker --task_index=0 &
grpc_tensorflow_server --cluster_spec='master|localhost:2222,worker|localhost:2223,worker_|localhost:2224' --job_name=worker_ --task_index=0 &

Ist es?

Ähnlich wie bei Letztes Mal lernen wir die Approximation von $ y = e ^ x $ in parallelen Daten. Siehe hier für den Code. Übrigens habe ich auch eine einzelne CPU-Version und eine modellparallele Version an derselben Stelle platziert.

Um Parameter für Master und Worker freizugeben, geben Sie einfach das Gerät und den Bereich an und ersetzen Sie den von tf.Variable () erstellten Teil zur Variablenerstellung durch get_variable (). Ich möchte es wiederverwenden, damit ich alles mit dem ps-Bereich vereinheitlichen kann. Es scheint einen Initialisierer zu übergeben, um die Variable zu initialisieren.

W1 = tf.Variable(tf.random_uniform([1,16], 0.0, 1.0))  # before
W1 = tf.get_variable("W1",shape=[1,16],initializer=tf.random_uniform_initializer(0,1)) # after

Wenn Sie es mit dem im selben Bereich gesetzten Wiederverwendungsflag aufrufen, wird es wiederverwendet. Ich bin hier etwas verwirrt, aber da der Bereich hier ein Variablenbereich ist, wird nur die Variable wiederverwendet, und das Diagramm ist eine separate Instanz.

Die Übergabe des Stapels an jeden Mitarbeiter erfolgt später in der Hauptschleife. Zu diesem Zeitpunkt verwenden wir jedoch eine Sammlung, damit wir den Ordner des Arbeitnehmers ermitteln können.

tf.add_to_collection("x",x)  #Sammle x für die spätere Verwendung
...
x0= tf.get_collection("x")[0] #Extrahieren Sie den 0. der x-Sammlung

Sammeln Sie in ähnlicher Weise die Differentiale.

Optimierung ist ein Verfahren zur Kostenberechnung - Differenzialberechnung - Parameteraktualisierung, aber ich denke, dass normalerweise optimizer.minimize () usw. verwendet wird, um alles von der Differenzialberechnung bis zur Parameteraktualisierung gleichzeitig durchzuführen. Dieses Mal werden wir das erhaltene Differential jedoch nicht sofort verwenden, also apply_gradiends () nach compute_gradients (). Als ganzer Prozess

--Differentialberechnung compute_gradients () in jedem Worker

Befolgen Sie die Anweisungen. Der Ort, an dem die Differenzierung gemittelt wird, wird von [TensorFlow-Beispielcode] umgeleitet (https://github.com/tensorflow/tensorflow/blob/master/tensorflow/models/image/cifar10/cifar10_multi_gpu_train.py).

Vergleichen wir den Konvergenzgrad.

compare.png

Blau ist die Einzel-CPU-Version und Rot ist die datenparallele Version. Da die Keime von Zufallszahlen ausgerichtet sind, überlappen sie sich fast. (Nicht genau der gleiche Wert)

Ich habe die Anzahl der Server-Computer nicht erhöht, der Overhead ist enorm, der Batch-Betrieb ist in erster Linie nicht schwer usw. In diesem Beispiel gibt es verschiedene Nachteile, sodass die parallele Version langsamer ist. Es war ungefähr doppelt so langsam.

Schließlich

Bis zu diesem Punkt besteht der Zweck darin, den Mechanismus zu verstehen, anstatt ihn zu beschleunigen. Jedes Mal, wenn ich das Ergebnis einer Verlangsamung durch Parallelisierung erhalte, geht es bei Next time endlich darum. Machen wir es zu einem Docker-Container und führen es auf der Google Clout-Plattform aus. Wenn Sie viele Container mit dem Schwung erstellen, den freien Frame von \ $ 300 zu verbrauchen, sollte er schneller sein. Das heiße Thema Alpha Go soll 1200 CPUs haben, aber ich freue mich darauf zu sehen, wie viel es für 300 Dollar leisten kann.

Recommended Posts

Versuchen Sie Daten parallel zu Distributed TensorFlow
Versuchen Sie es mit verteiltem Tensorfluss
Lernen Sie mit TensorFlow Y = 2X verteilte Daten
Daten mit TensorFlow lesen
Versuchen Sie eine Regression mit TensorFlow
Versuchen Sie es mit TensorFlow
Versuchen Sie TensorFlow MNIST mit RNN
Versuchen Sie, mit Binärdaten in Python zu arbeiten
Versuchen Sie, mit Pandas in ordentliche Daten umzuwandeln
Probieren Sie TensorFlows RNN mit einem Basismodell aus
Zundokokiyoshi mit TensorFlow
Brechen Sie Blöcke mit Tensorflow
Versuchen Sie, Doujin-Musikdaten mit Pandas zu aggregieren
Versuchen Sie Tensorflow mit einer GPU-Instanz unter AWS
Versuchen Sie, Distributed TensorFlow auf der Google Cloud Platform auszuführen
Probieren Sie Theano mit Kaggles MNIST-Daten ~ Logistic Return ~ aus
Versuchen Sie es mit Python.
Datenvisualisierung mit Pandas
Datenmanipulation mit Pandas!
Fordern Sie die Bildklassifizierung mit TensorFlow2 + Keras 3 heraus ~ Visualisieren Sie MNIST-Daten ~
Daten mit Pandas mischen
Datenerweiterung mit openCV
Daten mit Scipy normieren
Datenanalyse mit Python
LADEN SIE DATEN mit PyMysql
Versuchen Sie, COVID-19 Tokyo-Daten mit Python zu kratzen
Versuchen Sie, die Datentabelle von Azure SQL Server mit pyodbc zu extrahieren
Versuchen Sie, Daten zu erfassen, während Sie mit anaconda eine Portweiterleitung an RDS durchführen.
Versuchen Sie, Titanic-Daten mit der Vorverarbeitungsbibliothek DataLiner (Encoding) zu verarbeiten.
Versuchen Sie, Titanic-Daten mit der Vorverarbeitungsbibliothek DataLiner zu verarbeiten (Konvertierung).
Versuchen Sie, Merkmale von Sensordaten mit CNN zu extrahieren
Übersetzen Erste Schritte mit TensorFlow
Mit Python erstellte Beispieldaten
Versuchen Sie, den Boden durch Rekursion herauszufordern
Versuchen Sie die Funktionsoptimierung mit Optuna
Betten Sie Audiodaten in Jupyter ein
Zeichnen Sie Excel-Daten mit matplotlib (1)
Verwenden Sie TensorFlow mit Intellij IDEA
Künstliche Datengenerierung mit Numpy
Versuchen Sie, PythonTex mit Texpad zu verwenden.
Versuchen Sie die Kantenerkennung mit OpenCV
TensorFlow Tutorial-MNIST Daten herunterladen (Übersetzung)
Versuchen Sie, RBM mit Chainer zu implementieren.
Versuchen Sie Google Mock mit C.
Experiment zur Optimierung der Tensorflow-Daten
Versuchen Sie es mit matplotlib mit PyCharm
Versuchen Sie die GUI-Programmierung mit Hy
Versuchen Sie Auto Encoder mit Pytorch
Probieren Sie die Python-Ausgabe mit Haxe 3.2 aus
Versuchen Sie die Matrixoperation mit NumPy
Holen Sie sich Youtube-Daten mit Python
Versuchen Sie, CNN mit ChainerRL auszuführen
Probieren Sie verschiedene Dinge mit PhantomJS aus
Lernen Sie neue Daten mit PaintsChainer
Binarisieren Sie Fotodaten mit OpenCV
Versuchen Sie "100 Schläge auf Data Science" ①
Zeichnen Sie Excel-Daten mit matplotlib (2)