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.
code: def _create_proxy(self, graph_item, gradient, target):
      # Do not replicate sparse variables
      if (
          not isinstance(gradient, ops.Tensor)
          or self.worker_device in self.target_device
      ):  # meaning the variable is local
          return None
      d = device_spec.DeviceSpecV2.from_string(self.worker_device)
      master_var = graph_item.trainable_var_op_to_var.get(target.op)
      master_var_device = device_spec.DeviceSpecV2.from_string(
          master_var.device
      )
      device_type = (
          "GPU"
          if master_var_device.device_type
          and master_var_device.device_type.upper() == "GPU"
          else "CPU"
      )
      device_index = (
          0 if device_type == "CPU" else master_var_device.device_index
      )
      proxy_var_device = device_spec.DeviceSpecV2(
          job=d.job,
          replica=d.replica,
          task=d.task,
          device_type=device_type,
          device_index=device_index,
      )
      return ProxyVariable(master_var, graph_item, proxy_var_device)
  
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 14 for calling the PSSynchronizer obj's underlying member method code with example usage: obj._create_proxy(graph_item, gradient, target) and returns: ProxyVariable, None