'Args:
tower_name (str):
device(str):
input (InputSource): must be setup already. If None, will use InputDesc from the model.'

def build(self, tower_name, device, input=None):

    logger.info("Building    predictor    tower    '{}'    on    device    {}    ...".format(tower_name, device))
    assert (tower_name not in self._names_built), "Prediction    tower    with    name    '{}'    already    exists!".format(tower_name)
    with tf.device(device):
        with TowerContext(tower_name, is_training=False):
            with freeze_collection(TOWER_FREEZE_KEYS):
                if (input is None):
                    input = PlaceholderInput()
                    input.setup(self._model.get_inputs_desc())
                input = input.get_input_tensors()
                assert isinstance(input, (list, tuple)), input
                self._model.build_graph(input)
    desc_names = [k.name for k in self._model.get_inputs_desc()]
    self._names_built[tower_name] = PredictorTowerHandle(tower_name, desc_names, input)
    return self._names_built[tower_name]
