code: def non_terminated_nodes(self, tag_filters: dict):
      with self.lock:
          instances = []
  
          for resource in self.resources.values():
              node_instances = resource.list_instances(tag_filters)
              instances += node_instances
  
          # Note: All the operations use "name" as the unique instance id
          self.cached_nodes = {i["name"]: i for i in instances}
          return [i["name"] for i in instances]
  
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 4 for calling the GCPNodeProvider obj's underlying member method code with example usage: obj.non_terminated_nodes(tag_filters) and returns: unknown