class_docstr: A data-parallel predictor. It builds one predictor that utilizes all GPUs.
  
  Note that it doesn't split/concat inputs/outputs automatically.
  Instead, its inputs are:
  ``[input[0] in tower[0], input[1] in tower[0], ..., input[0] in tower[1], input[1] in tower[1], ...]``
  Similar for the outputs.
docstr: Args:
      config (PredictConfig): the config to use.
      towers: a list of relative GPU id.
docstr_tok: ["Args",":","config","(","PredictConfig",")",":","the","config","to","use",".","towers",":","a","list","of","relative","GPU","id","."]
code: def __init__(self, config, towers):
      """
      Args:
          config (PredictConfig): the config to use.
          towers: a list of relative GPU id.
      """
      self.graph = config._maybe_create_graph()
      with self.graph.as_default():
          input_tensors = []
          output_tensors = []
  
          for idx, t in enumerate(towers):
              tower_name = "tower" + str(t)
  
              new_sig = [
                  tf.TensorSpec(
                      dtype=p.dtype,
                      shape=p.shape,
                      name=tower_name + "_" + p.name,
                  )
                  for p in config.input_signature
              ]
              input = PlaceholderInput()
              input.setup(new_sig)
  
              with tf.variable_scope(
                  tf.get_variable_scope(), reuse=idx > 0
              ), tf.device("/gpu:{}".format(t)), PredictTowerContext(
                  tower_name
              ):
                  config.tower_func(*input.get_input_tensors())
                  h = config.tower_func.towers[-1]
                  input_tensors.extend(
                      h.get_tensors(config.input_names)
                  )
                  output_tensors.extend(
                      h.get_tensors(config.output_names)
                  )
  
          config.session_init._setup_graph()
          sess = config.session_creator.create_session()
          config.session_init._run_init(sess)
          super(DataParallelOfflinePredictor, self).__init__(
              input_tensors, output_tensors, config.return_input, sess
          )
  
file_path: tensorpack/tensorpack/predict/multigpu.py
imports: import tensorflow
  from ..input_source import PlaceholderInput
  from ..tfutils.tower import PredictTowerContext
  from ..utils import logger
  from .base import OnlinePredictor
label_desc: Use image node_id 1 to create a new DataParallelOfflinePredictor object from inherited base classes: OnlinePredictor with example: obj = DataParallelOfflinePredictor(config, towers)