code: def done_training(self):
      if self.save_last_model:
          self.save_last_model_with_metadata()
      self.eval_save()
      if self.load_best_model and self.best_state_dict is not None:
          if self.verbose:
              print("Loading Best")
          copied_state_dict = copy_state_dict(
              state_dict=self.best_state_dict,
              target_device=None,  # Why was this required?
              # target_device=self.device,
          )
          if isinstance(self.model, nn.DataParallel):
              self.model.module.load_state_dict(copied_state_dict)
          else:
              self.model.load_state_dict(copied_state_dict)
  
imports: from dataclasses import dataclass
  from typing import Dict
  import torch.nn
  import jiant.proj.main.runner
  import jiant.proj.main.components.task_sampler
  from jiant.shared.runner import save_model_with_metadata, compare_steps_max_steps
  from jiant.utils.python.datastructures import ExtendedDataClassMixin
  from jiant.utils.python.functional import always_false
  from jiant.utils.torch_utils import copy_state_dict, CPU_DEVICE, get_model_for_saving
  from jiant.utils.zlog import BaseZLogger, PRINT_LOGGER
  from jiant.shared.metarunner import AbstractMetarunner
label_desc: Use image node_id 13 for calling the JiantMetarunner obj's underlying member method code with example usage: obj.done_training() without return types