code: def forward(self, input_):
      if self.in_splits > 1 and not self.input_is_already_split:
          input_parts = partition(input_.shape[-1], self.in_splits)
          split_sizes = [
              input_parts[p + 1] - input_parts[p]
              for p in range(self.in_splits)
          ]
          inputs = self._split_global_input(input_, split_sizes)
      elif self.in_splits > 1:
          inputs = input_
          assert (
              len(inputs) == self.in_splits
          ), f"Col splits {self.in_splits} does not match input splits {len(inputs)}"
      else:
          # no splits
          inputs = [input_]
  
      outputs = [None] * self.out_splits
      for out_id in range(self.out_splits):
          for in_id in range(self.in_splits):
              local_output = self.linears[out_id][in_id](inputs[in_id])
  
              outputs[out_id] = self._reduce_local_output(
                  in_id=in_id,
                  out_id=out_id,
                  current_out=outputs[out_id],
                  new_out=local_output,
              )
  
      if self.combine_out_splits:
          return self._combine_output_splits(outputs)
  
      return outputs
  
file_path: DeepSpeed/deepspeed/runtime/zero/tiling.py
imports: import torch
  import deepspeed
  from deepspeed.runtime.utils import partition_uniform
label_desc: Use image node_id 2 for calling the TiledLinear obj's underlying member method code with example usage: obj.forward(input_) and returns: outputs, self