class_docstr: Wrapper around the loss of IBOT (https://arxiv.org/pdf/2111.07832.pdf)
  
  Allows to feed the correct configuration to IBOTCriterion class (below)
  which implement the IBOT loss entirely decoupled from VISSL
code: def load_state_dict(self, state_dict: dict, *args, **kwargs):
      # If the teacher not not been yet allocated, store it to load it
      # once the momentum teacher is available
      if self.momentum_teacher is None:
          self.checkpoint = state_dict
          logging.info("Storing the checkpoint for later use")
          return
  
      # If the encoder has been allocated, use the normal PyTorch restoration
      logging.info("Restoring checkpoint")
      if isinstance(self.momentum_teacher, FullyShardedDataParallel):
          self.momentum_teacher.load_local_state_dict(
              state_dict["teacher"]
          )
      else:
          momentum_teacher = get_no_ddp_model(self.momentum_teacher)
          teacher_state_dict = {
              k.replace("module.", ""): v
              for k, v in state_dict["teacher"].items()
          }
          momentum_teacher.load_state_dict(teacher_state_dict)
      self.criterion.load_state_dict(state_dict["criterion"])
  
imports: import logging
  import pprint
  from typing import List
  import numpy
  import torch
  import torch.distributed
  import torch.nn
  import torch.nn.functional
  from classy_vision.losses import ClassyLoss, register_loss
  from fairscale.nn import FullyShardedDataParallel
  from vissl.config import AttrDict
  from vissl.models.model_helpers import get_no_ddp_model
  from vissl.utils.distributed_utils import concat_all_gather
label_desc: Use image node_id 5 for calling the IBOTLoss obj's underlying member method code with example usage: obj.load_state_dict(state_dict) without return types