code: def __init__(self, dashboard_head):
      super().__init__(dashboard_head)
      self._stubs = {}
      # NodeInfoGcsService
      self._gcs_node_info_stub = None
      # NodeResourceInfoGcsService
      self._gcs_node_resource_info_sub = None
      self._collect_memory_info = False
      DataSource.nodes.signal.append(self._update_stubs)
      # Total number of node updates happened.
      self._node_update_cnt = 0
      # The time where the module is started.
      self._module_start_time = time.time()
      # The time it takes until the head node is registered. None means
      # head node hasn't been registered.
      self._head_node_registration_time_s = None
      self._gcs_aio_client = dashboard_head.gcs_aio_client
      self._gcs_address = dashboard_head.gcs_address
  
imports: import asyncio
  import json
  import logging
  import time
  import grpc
  from itertools import chain
  import aiohttp.web
  import ray._private.utils
  from ray.dashboard.consts import GCS_RPC_TIMEOUT_SECONDS
  from ray.autoscaler._private.util import LoadMetricsSummary, get_per_node_breakdown_as_dict, parse_usage
  import ray.dashboard.consts
  import ray.dashboard.optional_utils
  import ray.dashboard.utils
  from ray._private import ray_constants
  from ray.core.generated import gcs_service_pb2, gcs_service_pb2_grpc, node_manager_pb2, node_manager_pb2_grpc
  from ray.dashboard.datacenter import DataOrganizer, DataSource
  from ray.dashboard.modules.node import node_consts
  from ray.dashboard.modules.node.node_consts import FREQUENTY_UPDATE_NODES_INTERVAL_SECONDS, FREQUENT_UPDATE_TIMEOUT_SECONDS
  from ray._private.ray_constants import DEBUG_AUTOSCALING_ERROR, DEBUG_AUTOSCALING_STATUS
  from ray.dashboard.utils import async_loop_forever
label_desc: Use image node_id 1 to create a new NodeHead object from inherited base classes: dashboard_utils with example: obj = NodeHead(dashboard_head)