2016-04-29 9 views
1

Ich habe zwei neuronale Netze, NN1 und NN2, innerhalb des gleichen Tensorflow Graphen. Ich muss die Gewichte von NN2 mit den Gewichten von NN1 aktualisieren. Dazu führe ich session.run([w1_nn2.assign(w1_nn1), w2_nn2.assign(w2_nn1), ...]) aus, wobei wi_nnj die Gewichte sind. Werden all diese Zuweisungen als atomare Operation ausgeführt?Thread-sicheres Klonen von Netzwerkgewichten in Tensorflow?

Wenn das nicht der Fall ist (wie ich vermute), wäre das Aufrufen dieser Zuweisungen in einem Python-Thread beim Aufruf von apply_gradients() auf NN1 in einem anderen Thread nicht sicher, oder? Was wäre also der einfachste Weg dies threadsicher zu tun?

+0

Ich denke, ich kenne die Antwort auf meine eigene Frage. Da ich Python verwende und aufgrund der Funktionsweise von Multithreading in Python, werden die 'apply_gradients', die von einem Thread ausgeführt werden, niemals zur gleichen Zeit ausgeführt wie die Variablenzuweisung durch den anderen Thread, richtig? Das ist so, obwohl Tensorflow möglicherweise mehrere Threads startet, um die 'apply_gradients' und die Zuweisung auszuführen, da der Python-Code wartet, bis eine Tensorflow-Operation abgeschlossen ist, oder? – nicolas

Antwort

1

Es ist nicht atomar. Wenn Ihre Variable die Größe von GB hat, kann die Operation einige Sekunden dauern. Es ist also seltsam, dass solche großen Ops atomar sind. Auch, manchmal ist es sinnvoll, mehrere Threads zu ermöglichen, die gleiche Variable gleichzeitig zu aktualisieren, wie in getan Hogwild

Es gibt einen Parameter in verschiedenen variablen Update ops, die von simulatanous Update von mehreren Threads zu schützen, wie für variable assign op here

def assign(self, value, use_locking=False): 
    """Assigns a new value to the variable. 
    This is essentially a shortcut for `assign(self, value)`. 
    Args: 
     value: A `Tensor`. The new value for this variable. 
     use_locking: If `True`, use locking during the assignment. 
+0

Danke @YaroslavBulatov. Es macht Sinn. In der Tat ist der Kontext für meine Frage das Papier [Asynchrone Methoden für tiefes Verstärkungslernen] (http://arxiv.org/abs/1602.01783), in dem Hogwild verwendet wird. Dennoch kann es sein, dass ich nicht ganz verstehe, wie Hogwild funktioniert, aber kein Problem wäre, wenn ein Thread die Parameter des freigegebenen Netzwerks (NN1) aktualisiert, während ein anderer Thread diese Parameter in sein lokales Netzwerk (NN2) kopiert? Wenn dies geschieht, kann NN2 nach der Aktualisierung eine Mischung aus sowohl neuen Parametern (d. H. Aktualisiert mit dem Gradienten) als auch alten enthalten. – nicolas

+0

Ich denke, das ist unter gewissen Bedingungen kein Problem, Hogwild hat einige weitere Details zu diesen "Bedingungen" –