code: def __init__(self, provider_config: dict, cluster_name: str):
      NodeProvider.__init__(self, provider_config, cluster_name)
      self.lock = RLock()
      self._construct_clients()
      self.cache_stopped_nodes = provider_config.get(
          "cache_stopped_nodes", False
      )
  
      # Cache of node objects from the last nodes() call. This avoids
      # excessive DescribeInstances requests.
      self.cached_nodes: Dict[str, GCPNode] = {}
  
imports: import copy
  import logging
  import time
  from functools import wraps
  from threading import RLock
  from types import ModuleType
  from typing import Any, Dict, List, Optional, Tuple
  import googleapiclient
  from ray.autoscaler._private.gcp.config import bootstrap_gcp, construct_clients_from_provider_config, get_node_type, tpu_accelerator_config_to_type
  from ray.autoscaler._private.gcp.node import GCPTPU
  from ray.autoscaler._private.gcp.node import GCPCompute, GCPNode, GCPNodeType, GCPResource
  from ray.autoscaler._private.gcp.tpu_command_runner import TPUCommandRunner
  from ray.autoscaler.command_runner import CommandRunnerInterface
  from ray.autoscaler.node_provider import NodeProvider
label_desc: Use image node_id 1 to create a new GCPNodeProvider object from inherited base classes: NodeProvider with example: obj = GCPNodeProvider(provider_config, cluster_name)