class_docstr: PS Synchronizer.
  
  Synchronizes gradient updates using a Parameter Server.
  
  For in-graph synchronization, this just aggregates gradients on a worker's CPU.
  
  For between-graph synchronization, this aggregates gradients on a pre-defined
  (defined in the Strategy) parameter server.
  
  To keep this gradient aggregation in sync, the chief gives each worker a token
  for each variable for the workers to mark when their variable update is complete.
docstr: Prune the control dependencies between the train_op on non-master replica and update op.
  
  Since the replicator will replicate the entire graph, the update op on non-master replica
  will also be replicated. If the train_op on non-master replica is fetched (which is the case
  in our current feed-fetch remap implementation), it will trigger those update ops and result
  in an unnecessary update over the trainable variables.
  This function prunes the control dependencies between train_op and any variable that bases on
  a PS syncer to avoid this situation.
docstr_tok: ["Prune","the","control","dependencies","between","the","train_op","on","non-master","replica","and","update","op",".","Since","the","replicator","will","replicate","the","entire","graph",",","the","update","op","on","non-master","replica","will","also","be","replicated",".","If","the","train_op","on","non-master","replica","is","fetched","(","which","is","the","case","in","our","current","feed-fetch","remap","implementation",")",",","it","will","trigger","those","update","ops","and","result","in","an","unnecessary","update","over","the","trainable","variables",".","This","function","prunes","the","control","dependencies","between","train_op","and","any","variable","that","bases","on","a","PS","syncer","to","avoid","this","situation","."]
code: def _prune_control_dependencies(
      self, graph_item, var_op_name, master_replica=0
  ):
      """
      Prune the control dependencies between the train_op on non-master replica and update op.
  
      Since the replicator will replicate the entire graph, the update op on non-master replica
      will also be replicated. If the train_op on non-master replica is fetched (which is the case
      in our current feed-fetch remap implementation), it will trigger those update ops and result
      in an unnecessary update over the trainable variables.
      This function prunes the control dependencies between train_op and any variable that bases on
      a PS syncer to avoid this situation.
      """
      for i in range(self.num_replicas):
          if i == master_replica:
              continue
          this_var_op_name = ops.prepend_name_scope(
              var_op_name, replica_prefix(i)
          )
          _, _, update_op = graph_item.var_op_name_to_grad_info_v2[
              this_var_op_name
          ]
          source_op = self._get_optimizer_source_op(update_op)
          remove_from_control_consumers(
              get_control_consumers(source_op), source_op
          )
  
imports: from functools import partial
  from typing import List
  from tensorflow.python import ops
  from tensorflow.python.framework import device_spec, dtypes, constant_op
  from tensorflow.python.platform import tf_logging
  from tensorflow.python.ops import math_ops, data_flow_ops, gen_control_flow_ops, control_flow_ops, gen_math_ops, gen_array_ops
  from autodist.const import MAX_INT64, AUTODIST_PREFIX
  from autodist.kernel.common import utils, variable_utils
  from autodist.kernel.common.op_info import UPDATE_OP_VAR_POS
  from autodist.kernel.common.proxy_variable import ProxyVariable
  from autodist.kernel.common.utils import get_op_name, get_consumers, get_ancestors, traverse, update_consumers, update_control_consumers, replica_prefix, strip_replica_prefix, get_control_consumers, remove_from_control_consumers, get_index_from_tensor_name, update_colocation_group
  from autodist.kernel.common.variable_utils import get_read_var_ops
  from autodist.kernel.synchronization.synchronizer import Synchronizer
  from autodist.proto import synchronizers_pb2
label_desc: Use image node_id 5 for calling the PSSynchronizer obj's underlying member method code with example usage: obj._prune_control_dependencies(graph_item, var_op_name, master_replica) without return types