class_docstr: Base class for inference runner.
  
  Note:
      1. InferenceRunner will use `input.size()` to determine
         how much iterations to run, so you're responsible to ensure that
         `input.size()` is accurate.
      2. Only works with instances of `TowerTrainer`.
docstr: Args:
      input (InputSource): the input to use. Must have an accurate ``size()``.
      infs (list[Inferencer]): list of :class:`Inferencer` to run.
docstr_tok: ["Args",":","input","(","InputSource",")",":","the","input","to","use",".","Must","have","an","accurate","``","size","(",")","``",".","infs","(","list","[","Inferencer","]",")",":","list","of",":","class",":","`","Inferencer","`","to","run","."]
code: def __init__(self, input, infs):
      """
      Args:
          input (InputSource): the input to use. Must have an accurate ``size()``.
          infs (list[Inferencer]): list of :class:`Inferencer` to run.
      """
      self._input_source = input
      if not isinstance(infs, list):
          self.infs = [infs]
      else:
          self.infs = infs
      for v in self.infs:
          assert isinstance(v, Inferencer), v
  
      try:
          self._size = input.size()
      except NotImplementedError:
          self._size = 0
  
      self._hooks = []
  
imports: import itertools
  import sys
  from contextlib import contextmanager
  import tqdm
  from tensorflow.python.training.monitored_session import _HookedSession
  from ..compat import tfv1
  from ..dataflow.base import DataFlow
  from ..input_source import FeedInput, InputSource, QueueInput, StagingInput
  from ..tfutils.tower import PredictTowerContext
  from ..utils import logger
  from ..utils.utils import get_tqdm_kwargs
  from .base import Callback
  from .group import Callbacks
  from .inference import Inferencer
label_desc: Use image node_id 1 to create a new InferenceRunnerBase object from inherited base classes: Callback with example: obj = InferenceRunnerBase(input, infs)