(self, dequeue_fn)
return (train_step, host_call, captured_scaffold_fn,
            captured_training_hooks)
Converts user provided model_fn` as a single train step on TPU.

    The user provided `model_fn` takes input tuple
    (features, labels) and produces the EstimatorSpec with train_op and loss for
    train `mode`. This usually represents a single train computation on CPU.

    For TPU training, a train (computation) step is first wrapped in a
    tf.while_loop control flow to repeat for many times and then replicated to
    all TPU shards. Besides the input should be taken from TPU infeed rather
    than input pipeline (input_fn) directly. To fit TPU loop and replicate
    pattern, the original train computation should be reformed, which is the
    returned `train_step`.

    Args:
      dequeue_fn: The function to retrieve inputs, features and labels, from TPU
        infeed dequeue channel.

    Returns:
      A tuple of train_fn, host_calls, and captured scaffold_fn. The train_fn
      representing the train step for TPU.
Converts user provided model_fn` as a single train step on TPU.
Converts user provided model_fn as a single train step on TPU .
def convert_to_single_tpu_train_step(self, dequeue_fn):
    """Converts user provided model_fn` as a single train step on TPU.

    The user provided `model_fn` takes input tuple
    (features, labels) and produces the EstimatorSpec with train_op and loss for
    train `mode`. This usually represents a single train computation on CPU.

    For TPU training, a train (computation) step is first wrapped in a
    tf.while_loop control flow to repeat for many times and then replicated to
    all TPU shards. Besides the input should be taken from TPU infeed rather
    than input pipeline (input_fn) directly. To fit TPU loop and replicate
    pattern, the original train computation should be reformed, which is the
    returned `train_step`.

    Args:
      dequeue_fn: The function to retrieve inputs, features and labels, from TPU
        infeed dequeue channel.

    Returns:
      A tuple of train_fn, host_calls, and captured scaffold_fn. The train_fn
      representing the train step for TPU.
    """

    host_call = _OutfeedHostCall(self._ctx)
    captured_scaffold_fn = _CapturedObject()
    captured_training_hooks = _CapturedObject()

    def train_step(loss, *cache):
      """Training step function for use inside a while loop."""
      del loss  # unused; required in function signature.
      inputs = dequeue_fn()
      features, labels = inputs.features_and_labels()

      # Consume the current cache
      estimator_spec = self._verify_estimator_spec(
          self._call_model_fn(features, labels, cache=cache))

      # Retrieve the new returned cache
      """
        `cache` consists of a list of tensors, potentially empty (of length 0)
      """
      cache = estimator_spec.cache
      loss, train_op = estimator_spec.loss, estimator_spec.train_op

      if isinstance(estimator_spec, model_fn_lib._TPUEstimatorSpec):  # pylint: disable=protected-access
        captured_scaffold_fn.capture(estimator_spec.scaffold_fn)
      else:
        captured_scaffold_fn.capture(None)

      captured_training_hooks.capture(estimator_spec.training_hooks)

      tracing_ops = []
      if tensor_tracer.TensorTracer.is_enabled():
        tt = tensor_tracer.TensorTracer()
        loss, tracing_ops = tt.trace_tpu(ops.get_default_graph(), loss,
                                         self._ctx.num_replicas)

      # We must run train_op to update the variables prior to running the
      # outfeed.
      with ops.control_dependencies([train_op]+tracing_ops):
        host_call_outfeed_ops = []
        if (isinstance(estimator_spec, model_fn_lib._TPUEstimatorSpec)  # pylint: disable=protected-access
            and estimator_spec.host_call is not None):
          host_call.record({'host_call': estimator_spec.host_call})
          host_call_outfeed_ops = host_call.create_enqueue_op()
        with ops.control_dependencies(host_call_outfeed_ops):
          return [array_ops.identity(loss)] + cache

    return (train_step, host_call, captured_scaffold_fn,
            captured_training_hooks)
def convert_to_single_tpu_train_step ( self , dequeue_fn ) : host_call = _OutfeedHostCall ( self . _ctx ) captured_scaffold_fn = _CapturedObject ( ) captured_training_hooks = _CapturedObject ( ) def train_step ( loss , * cache ) : """Training step function for use inside a while loop.""" del loss # unused; required in function signature. inputs = dequeue_fn ( ) features , labels = inputs . features_and_labels ( ) # Consume the current cache estimator_spec = self . _verify_estimator_spec ( self . _call_model_fn ( features , labels , cache = cache ) ) # Retrieve the new returned cache """
        `cache` consists of a list of tensors, potentially empty (of length 0)
      """ cache = estimator_spec . cache loss , train_op = estimator_spec . loss , estimator_spec . train_op if isinstance ( estimator_spec , model_fn_lib . _TPUEstimatorSpec ) : # pylint: disable=protected-access captured_scaffold_fn . capture ( estimator_spec . scaffold_fn ) else : captured_scaffold_fn . capture ( None ) captured_training_hooks . capture ( estimator_spec . training_hooks ) tracing_ops = [ ] if tensor_tracer . TensorTracer . is_enabled ( ) : tt = tensor_tracer . TensorTracer ( ) loss , tracing_ops = tt . trace_tpu ( ops . get_default_graph ( ) , loss , self . _ctx . num_replicas ) # We must run train_op to update the variables prior to running the # outfeed. with ops . control_dependencies ( [ train_op ] + tracing_ops ) : host_call_outfeed_ops = [ ] if ( isinstance ( estimator_spec , model_fn_lib . _TPUEstimatorSpec ) # pylint: disable=protected-access and estimator_spec . host_call is not None ) : host_call . record ( { 'host_call' : estimator_spec . host_call } ) host_call_outfeed_ops = host_call . create_enqueue_op ( ) with ops . control_dependencies ( host_call_outfeed_ops ) : return [ array_ops . identity ( loss ) ] + cache return ( train_step , host_call , captured_scaffold_fn , captured_training_hooks )