code: def backend_init(self):
      super().backend_init()
  
      print("\n*** Experiment started with the Pytorch backend")
  
      import torch
  
      self.torch = torch
  
      # sanity check
      if not torch.cuda.is_available():
          raise Exception(
              f"torch.cuda.is_available() returns False; can't continue"
          )
  
      self.gpu_current_device_id = self.torch.cuda.current_device()
  
      # force pytorch to pre-load cuDNN and its kernels to claim unreclaimable memory
      torch.ones((1, 1)).to(self.gpu_current_device_id)
  
      # check that all is ready to go, and we get the RAM info
      gpu_ram_total, gpu_ram_free, gpu_ram_used = self.gpu_ram()
  
      # announce which device is used for this experiment
      print(
          f"Device: ID {self.gpu_current_device_id}, {torch.cuda.get_device_name(self.gpu_current_device_id)} ({b2mb(gpu_ram_total)} RAM)\n"
      )
  
imports: import gc
  import logging
  import os
  import psutil
  import sys
  import threading
  import time
  import weakref
  from IPython import get_ipython
  from IPython.core.magics.namespace import NamespaceMagics
  from collections import namedtuple
  from .cell_logger import CellLogger, b2mb, int2width, get_nvml_gpu_id
label_desc: Use image node_id 2 for calling the IPyExperimentsPytorch obj's underlying member method code with example usage: obj.backend_init() without return types