def METHOD_NAME(self):
    """Creates a new wrapper model that consists of multiple replicas of
    the original model placed on different GPUs.
    """
    # Slice inputs. Slice inputs on the CPU to avoid sending a copy
    # of the full inputs to all GPUs. Saves on bandwidth and memory.
    input_slices = {
        name: tf.split(x, self.gpu_count)
        for name, x in zip(self.inner_model.input_names, self.inner_model.inputs)
    }
    output_names = self.inner_model.output_names
    outputs_all = []
    for i in range(len(self.inner_model.outputs)):
        outputs_all.append([])
    # Run the model call() on each GPU to place the ops there
    for i in range(self.gpu_count):
        with tf.device("/gpu:%d" % i):
            with tf.name_scope("tower_%d" % i):
                # Run a slice of inputs through this replica
                zipped_inputs = zip(
                    self.inner_model.input_names, self.inner_model.inputs
                )
                inputs = [
                    KL.Lambda(
                        lambda s: input_slices[name][i],
                        output_shape=lambda s: (None,) + s[1:],
                    )(tensor)
                    for name, tensor in zipped_inputs
                ]
                # Create the model replica and get the outputs
                outputs = self.inner_model(inputs)
                if not isinstance(outputs, list):
                    outputs = [outputs]
                # Save the outputs for merging back together later
                for l, o in enumerate(outputs):
                    outputs_all[l].append(o)
    # Merge outputs on CPU
    with tf.device("/cpu:0"):
        merged = []
        for outputs, name in zip(outputs_all, output_names):
            # Concatenate or average outputs?
            # Outputs usually have a batch dimension and we concatenate
            # across it. If they don't, then the output is likely a loss
            # or a metric value that gets averaged across the batch.
            # Keras expects losses and metrics to be scalars.
            if K.int_shape(outputs[0]) == ():
                # Average
                m = KL.Lambda(lambda o: tf.add_n(o) / len(outputs), name=name)(
                    outputs
                )
            else:
                # Concatenate
                m = KL.Concatenate(axis=0, name=name)(outputs)
            merged.append(m)
    return merged