class_docstr: A light-weight wrapper class for torch.distributed API.
  Only a subset of functions are wrapped. Once the init_process_group
  is initialized, standard torch.distributed.* can be used directly
  so no need to wrap all the functions. We can keep adding wrappers as
  needed.
class_docstr_tok: ["A","light-weight","wrapper","class","for","torch.distributed","API",".","Only","a","subset","of","functions","are","wrapped",".","Once","the","init_process_group","is","initialized",",","standard","torch.distributed",".","*","can","be","used","directly","so","no","need","to","wrap","all","the","functions",".","We","can","keep","adding","wrappers","as","needed","."]
code: def all_gather_base(
      self, output_tensor, input_tensor, group=None, async_op=False
  ):
      if DS_COMM_ALL_GATHER_OFF:
          if int(os.getenv("RANK", "0")) == 0:
              utils.logger.warning("All Gather is OFF")
          return Noop()
      else:
          if self.has_allgather_base:
              return (
                  torch.distributed.distributed_c10d._all_gather_base(
                      output_tensor=output_tensor,
                      input_tensor=input_tensor,
                      group=group,
                      async_op=async_op,
                  )
              )
          else:
              utils.logger.warning(
                  "unable to find torch.distributed._all_gather_base. will fall back to "
                  "torch.distributed.reduce_scatter which will result in suboptimal performance. "
                  "please consider upgrading your pytorch installation."
              )
              pass
  
imports: from deepspeed import utils
  from .utils import *
  from .backend import *
  from .comm import *
  import os
label_desc: Use image node_id 15 for calling the TorchBackend obj's underlying member method code with example usage: obj.all_gather_base(output_tensor, input_tensor, group, async_op) and returns: Noop, torch