code: def on_validation_end(
      self, trainer: Trainer, pl_module: LightningModule
  ):
      iterations = self._get_iterations_for_logging(trainer)
      current_epochs = self._get_current_epoch_for_logging(trainer)
      num_updates = self._get_num_updates_for_logging(trainer)
      extra = {
          "num_updates": num_updates,
          "epoch": current_epochs,
          "iterations": iterations,
          "max_updates": trainer.max_steps,
          "val_time": self.snapshot_timer.get_time_since_start(),
      }
      # TODO: @sash populate early stop info for logging (next mvp)
      # extra.update(self.trainer.early_stop_callback.early_stopping.get_info())
      self.train_timer.reset()
      summarize_report(
          current_iteration=iterations,
          num_updates=num_updates,
          max_updates=trainer.max_steps,
          meter=pl_module.val_meter,
          extra=extra,
          tb_writer=self.lightning_trainer.tb_writer,
      )
  
imports: import logging
  from typing import Any, Dict, List
  import torch
  from mmf.common.meter import Meter
  from mmf.common.registry import registry
  from mmf.common.report import Report
  from mmf.common.sample import SampleList
  from mmf.utils.logger import calculate_time_left, summarize_report
  from mmf.utils.timer import Timer
  from pytorch_lightning import LightningModule, Trainer
  from pytorch_lightning.callbacks.base import Callback
label_desc: Use image node_id 6 for calling the LightningLoopCallback obj's underlying member method code with example usage: obj.on_validation_end(trainer, pl_module) without return types