code: def set_sub_backend(sub_backend_str: str):
      if ivy.backend == "":
          logging.warning("You must set a backend first")
          return
  
      if ivy.current_backend_str() not in _backend_to_sub_backends_dict:
          logging.warning(
              f"backend {ivy.current_backend_str()} does not have any"
              " supported sub_backends"
          )
          return
  
      if sub_backend_str not in _all_sub_backends:
          raise IvyException(
              "sub_backend must be one from"
              f" {_backend_to_sub_backends_dict[ivy.current_backend_str()]}"
          )
  
      if (
          sub_backend_str
          not in _backend_to_sub_backends_dict[
              ivy.current_backend_str()
          ]
      ):
          logging.warning(
              f"{ivy.current_backend_str()} does not support"
              f" {sub_backend_str} as a sub_backend"
          )
          return
  
      if sub_backend_str in ivy.current_sub_backends:
          return
  
      global original_backend_dict
      if original_backend_dict is None:
          original_backend_dict = ivy.__dict__.copy()
      sub_backend = importlib.import_module(
          _sub_backend_dict[sub_backend_str]
      )
      set_sub_backend_to_specific_version(sub_backend)
      _set_sub_backend_as_ivy(ivy.__dict__.copy(), ivy, sub_backend)
      ivy.current_sub_backends.append(sub_backend_str)
  
file_path: ivy/ivy/utils/backend/sub_backend_handler.py
imports: import os
  import re
  from types import ModuleType, FunctionType
  import logging
  import importlib
  import ivy
  from ivy.func_wrapper import _wrap_function
  from ivy.utils.exceptions import IvyException
label_desc: Use image node_id 4 for calling a global function with example usage: set_sub_backend(sub_backend_str) without return types