2017-03-15 3 views
0

Frage: Wie der Titel seed, ich wandern Wann sollten wir die Config place_pruned_graph in GraphOptions verwenden. Was ist der Zweck dieser Konfiguration?Wann sollten wir die Konfiguration "place_pruned_graph" verwenden?

Ich bin auf den Kommentar zu dieser Konfiguration nicht klar:

// Only place the subgraphs that are run, rather than the entire graph. 
    // 
    // This is useful for interactive graph building, where one might 
    // produce graphs that cannot be placed during the debugging 
    // process. In particular, it allows the client to continue work in 
    // a session after adding a node to a graph whose placement 
    // constraints are unsatisfiable. 

Wir wissen, dass Tensorflow eine gesamte Grafik in mehrere Teilgraphen in normalen partitionieren. Und the following code von CreateGraphs von direct_session.cc nimmt den Else-Zweig in normal. (Soweit ich sehen kann, fand ich nie den Fall die if-Zweig (so dass ich nicht weiß, wann sollten wir es auslösen).

if (options_.config.graph_options().place_pruned_graph()) { 
    // Because we are placing pruned graphs, we need to create a 
    // new SimpleGraphExecutionState for every new unseen graph, 
    // and then place it. 
    SimpleGraphExecutionStateOptions prune_options; 
    prune_options.device_set = &device_set_; 
    prune_options.session_options = &options_; 
    prune_options.stateful_placements = stateful_placements_; 
    TF_RETURN_IF_ERROR(SimpleGraphExecutionState::MakeForPrunedGraph(
     execution_state_->original_graph_def().library(), prune_options, 
     execution_state_->original_graph_def(), subgraph_options, 
     &temp_exec_state_holder, &client_graph)); 
    execution_state = temp_exec_state_holder.get(); 
    } else { 
    execution_state = execution_state_.get(); 
    TF_RETURN_IF_ERROR(
     execution_state->BuildGraph(subgraph_options, &client_graph)); 
    } 

Antwort

1

Die kurze Antwort? nie. Die längere Antwort mich erfordert zu erklären, warum diese Option überhaupt existiert.

warum also TensorFlow um diese gewundene Konfigurationsoption und Logik damit umgehen? es ist ein historischer Zufall, der kam wann haben tensorflow::DirectSession und tensorflow::GrpcSession unterschiedliche interne Implementierungen:

  1. Die tensorflow::GrpcSession verwendet eine einzige SimpleGraphExecutionState für das gesamte Diagramm in einer Sitzung. Der Nettoeffekt davon war, dass der Platzierer - der für das Zuordnen von Geräten zu jedem Knoten in dem Graph verantwortlich ist - laufen würde, bevor der Graph gelöscht wurde.

  2. Die tensorflow::DirectSession ursprünglich verwendet eine SimpleGraphExecutionState für jeden beschnittenen Untergraphen, mit einigen speziellen Logik für die Freigabe der Platzierungen von statusbehafteten Knoten zwischen Aufrufen. Daher würde der Placer ausführen, nachdem das Diagramm beschnitten wurde und unterschiedliche Entscheidungen darüber treffen konnte, wo Stateful-Knoten platziert werden sollten.

Der Vorteil des tensorflow::GrpcSession Ansatzes (place_pruned_graph = false) ist, dass es unter Berücksichtigung aller den Colocation-Einschränkungen in der grafischen Darstellung erfolgt, wenn die Platzierung Algorithmus ausgeführt wird, auch wenn sie nicht auftreten, ausgeführt in den Subgraphen werden. Wenn Sie beispielsweise eine Einbettungsmatrix haben und diese mit der Option SparseApplyAdagrad op (die only has a CPU implementation) optimieren möchten, würde TensorFlow herausfinden, dass die Einbettungsmatrix auf der CPU platziert werden sollte.

dagegen, wenn Sie keine Vorrichtung für die Einbettung Matrix spezifiziert und festgelegt placed_pruned_graph = true die Matrix würde (höchstwahrscheinlich) auf GPU platziert werden, wenn Sie seine initializer lief, weil alle Ops in der Initialisierung Subgraphen auf GPU runnable wäre . Da Variablen sich nicht zwischen den Geräten bewegen können, ist TensorFlow nicht in der Lage, den Untergraphen zu erstellen, der SparseApplyAdagrad auf der Matrix ausgeführt hat. Dies war ein real issue in der frühesten Version von TensorFlow.

Warum also Unterstützung place_pruned_graph = true überhaupt? Es stellt sich heraus, dass es nützlich ist, wenn TensorFlow interaktiv verwendet wird. Die placed_pruned_graph = false Option ist unerbittlich: Sobald das Diagramm für eine Sitzung einen Knoten enthält, der nicht platziert werden kann, ist diese Sitzung nutzlos, da der Platzierungsalgorithmus für den gesamten Graphen ausgeführt wird und bei jedem Aufruf fehlschlägt und daher keine Schritte ausgeführt werden können . Wenn Sie ein tf.InteractiveSession verwenden, gehen wir davon aus, dass Sie ein REPL (oder Jupyter-Notebook) verwenden, und dass es vorteilhaft ist, wenn Sie nach einem solchen Fehler fortfahren können. Daher setzen wir in einem tf.InteractiveSessionplace_pruned_graph = true, so dass Sie die Sitzung nach dem Hinzufügen eines nicht verschiebbaren Knotens weiter verwenden können (solange Sie nicht versuchen, diesen Knoten in einem beschnittenen Untergraphen auszuführen).

Es gibt wahrscheinlich einen besseren Ansatz als place_pruned_graph = true für die interaktive Verwendung, aber wir haben nicht untersucht, eine hinzuzufügen. Vorschläge sind immer willkommen auf der GitHub issues page.

Verwandte Themen