code: def __init__(self, provider_config, cluster_name):
      NodeProvider.__init__(self, provider_config, cluster_name)
      self.frozen_vm_scheduler = None
      self.vsphere_config = provider_config["vsphere_config"]
      self.vsphere_credentials = provider_config["vsphere_config"][
          "credentials"
      ]
  
      # The below cache will be a map, whose key is the Ray node and the value will
      # be a list of vSphere tags one that node. The reason for this cache is to
      # avoid calling the vSphere API again when the autoscaler tries to read the tags
      # The cache will be filled when a Ray node is created and tagged.
      self.tag_cache = {}
      self.tag_cache_lock = threading.Lock()
  
imports: import copy
  import logging
  import threading
  import uuid
  from concurrent.futures import ThreadPoolExecutor
  from typing import Any, Dict
  from pyVmomi import vim
  from ray.autoscaler._private.vsphere.config import bootstrap_vsphere, is_dynamic_passthrough
  from ray.autoscaler._private.vsphere.gpu_utils import get_gpu_cards_from_vm, get_vm_2_gpu_cards_map, plug_gpu_cards_to_vm, set_gpu_placeholder, split_vm_2_gpu_cards_map
  from ray.autoscaler._private.vsphere.pyvmomi_sdk_provider import PyvmomiSdkProvider
  from ray.autoscaler._private.vsphere.scheduler import SchedulerFactory
  from ray.autoscaler._private.vsphere.utils import Constants, now_ts
  from ray.autoscaler._private.vsphere.vsphere_sdk_provider import VsphereSdkProvider
  from ray.autoscaler.node_provider import NodeProvider
  from ray.autoscaler.tags import TAG_RAY_CLUSTER_NAME, TAG_RAY_NODE_NAME
label_desc: Use image node_id 1 to create a new VsphereNodeProvider object from inherited base classes: NodeProvider with example: obj = VsphereNodeProvider(provider_config, cluster_name)