code: def run(self):
          
          device = self.model_config.torch_device()
  
          learner = api.Learner(device, self.model_factory.instantiate(), self.max_grad_norm)
          optimizer = self.optimizer_factory.instantiate(learner.model)
  
          # All callbacks used for learning
          callbacks = self.gather_callbacks(optimizer)
  
          # Metrics to track through this training
          metrics = learner.metrics()
  
          # Check if training was already started and potentially continue where we left off
          training_info = self.resume_training(learner, callbacks, metrics)
  
          training_info.on_train_begin()
  
          if training_info.optimizer_initial_state:
              optimizer.load_state_dict(training_info.optimizer_initial_state)
  
          for global_epoch_idx in range(training_info.start_epoch_idx + 1, self.epochs + 1):
              epoch_info = api.EpochInfo(
                  training_info=training_info,
                  global_epoch_idx=global_epoch_idx,
                  batches_per_epoch=self.source.train_iterations_per_epoch(),
                  optimizer=optimizer
              )
  
              # Execute learning
              learner.run_epoch(epoch_info, self.source)
  
              self.storage.checkpoint(epoch_info, learner.model)
  
          training_info.on_train_end()
  
          return training_info
docs: Run the command with supplied configuration