code: def get_bands(self) -> Dict[BandType, int]:
      band_resource = dict()
      for resource_type, info in self._info.resource.items():
          if resource_type.startswith("numa"):
              # cpu
              band_resource[(self.address, resource_type)] = Resource(
                  num_cpus=info["cpu_total"],
                  mem_bytes=info["memory_total"],
              )
          else:  # pragma: no cover
              assert resource_type.startswith("gpu")
              band_resource[(self.address, resource_type)] = Resource(
                  num_gpus=info["gpu_total"]
              )
      return band_resource
  
file_path: mars/mars/services/cluster/uploader.py
imports: import asyncio
  import logging
  from collections import defaultdict
  from typing import Dict, List
  from ...None import oscar
  from ...lib.aio import alru_cache
  from ...resource import Resource
  from ...storage import StorageLevel
  from ...typing import BandType
  from .core import NodeInfo, NodeStatus, WorkerSlotInfo, QuotaInfo, DiskInfo, StorageInfo
  from .gather import gather_node_env, gather_node_resource, gather_node_details
label_desc: Use image node_id 3 for calling the NodeInfoUploaderActor obj's underlying member method code with example usage: obj.get_bands() and returns: band_resource