code: def push_training_data(self, batch, losses, lr):
      tb_datapack = tensorboard_helper.TensorboardDatapack()
      tb_datapack.set_training(True)
      tb_datapack.set_iteration(self.iteration)
      for key in losses.keys():
          if "loss" in key:
              tb_datapack.add_scalar({f"train_loss/{key}": losses[key]})
      tb_datapack.add_scalar({"params/lr": lr})
      tb_datapack.add_scalar(
          {"params/penalize_empty_space": self.penalize_empty_space}
      )
      self.tb_pusher.push_to_tensorboard(tb_datapack)
  
imports: import os
  import time
  from utils.render_utils import render_vanilla
  import tqdm
  import torch
  import torch.nn.functional
  import torchvision.utils
  import numpy
  from utils import utils, render_utils, ray_utils
  from trainers import base_trainer, tensorboard_helper
  from models.vanilla import weight_reset
label_desc: Use image node_id 9 for calling the NeRFTrainer obj's underlying member method code with example usage: obj.push_training_data(batch, losses, lr) without return types