class_docstr: Use this class to manage the collective groups we created so far.
  
  Each process will have an instance of `GroupManager`. Each process
  could belong to multiple collective groups. The membership information
  and other metadata are stored in the global `_group_mgr` object.
class_docstr_tok: ["Use","this","class","to","manage","the","collective","groups","we","created","so","far",".","Each","process","will","have","an","instance","of","`","GroupManager","`",".","Each","process","could","belong","to","multiple","collective","groups",".","The","membership","information","and","other","metadata","are","stored","in","the","global","`","_group_mgr","`","object","."]
docstr: Group destructor.
docstr_tok: ["Group","destructor","."]
code: def destroy_collective_group(self, group_name):
      """Group destructor."""
      if not self.is_group_exist(group_name):
          logger.warning(
              "The group '{}' does not exist.".format(group_name)
          )
          return
  
      # release the collective group resource
      g = self._name_group_map[group_name]
      # clean up the dicts
      del self._group_name_map[g]
      del self._name_group_map[group_name]
      # Release the communicator resources
      g.destroy_group()
  
      # Release the detached actors spawned by `create_collective_group()`
      name = "info_" + group_name
      try:
          store = ray.get_actor(name)
          ray.kill(store)
      except ValueError:
          pass
  
imports: import logging
  import os
  from typing import List
  import numpy
  import ray
  from ray.util.collective import types
label_desc: Use image node_id 5 for calling the GroupManager obj's underlying member method code with example usage: obj.destroy_collective_group(group_name) without return types