code: def run_cuda_setup(self):
      self.initialized = True
      self.cuda_setup_log = []
  
      (
          binary_name,
          cudart_path,
          cc,
          cuda_version_string,
      ) = evaluate_cuda_setup()
      self.cudart_path = cudart_path
      self.cuda_available = torch.cuda.is_available()
      self.cc = cc
      self.cuda_version_string = cuda_version_string
      self.binary_name = binary_name
      self.manual_override()
  
      package_dir = Path(__file__).parent.parent
      binary_path = package_dir / self.binary_name
  
      try:
          if not binary_path.exists():
              self.add_log_entry(
                  f"CUDA SETUP: Required library version not found: {binary_name}. Maybe you need to compile it from source?"
              )
              legacy_binary_name = "libbitsandbytes_cpu.so"
              self.add_log_entry(
                  f"CUDA SETUP: Defaulting to {legacy_binary_name}..."
              )
              binary_path = package_dir / legacy_binary_name
              if not binary_path.exists() or torch.cuda.is_available():
                  self.add_log_entry("")
                  self.add_log_entry("=" * 48 + "ERROR" + "=" * 37)
                  self.add_log_entry(
                      "CUDA SETUP: CUDA detection failed! Possible reasons:"
                  )
                  self.add_log_entry(
                      "1. You need to manually override the PyTorch CUDA version. Please see: "
                      '"https://github.com/TimDettmers/bitsandbytes/blob/main/how_to_use_nonpytorch_cuda.md'
                  )
                  self.add_log_entry("2. CUDA driver not installed")
                  self.add_log_entry("3. CUDA not installed")
                  self.add_log_entry(
                      "4. You have multiple conflicting CUDA libraries"
                  )
                  self.add_log_entry(
                      "5. Required library not pre-compiled for this bitsandbytes release!"
                  )
                  self.add_log_entry(
                      "CUDA SETUP: If you compiled from source, try again with `make CUDA_VERSION=DETECTED_CUDA_VERSION` for example, `make CUDA_VERSION=113`."
                  )
                  self.add_log_entry(
                      "CUDA SETUP: The CUDA version for the compile might depend on your conda install. Inspect CUDA version via `conda list | grep cuda`."
                  )
                  self.add_log_entry("=" * 80)
                  self.add_log_entry("")
                  self.generate_instructions()
                  raise Exception("CUDA SETUP: Setup Failed!")
              self.lib = ct.cdll.LoadLibrary(binary_path)
          else:
              self.add_log_entry(
                  f"CUDA SETUP: Loading binary {binary_path}..."
              )
              self.lib = ct.cdll.LoadLibrary(binary_path)
      except Exception as ex:
          self.add_log_entry(str(ex))
  
imports: import ctypes
  import os
  import errno
  import torch
  from warnings import warn
  from itertools import product
  from pathlib import Path
  from typing import Set, Union
  from .env_vars import get_potentially_lib_path_containing_env_vars
label_desc: Use image node_id 5 for calling the CUDASetup obj's underlying member method code with example usage: obj.run_cuda_setup() without return types