code: def training_step(self, batch, batch_idx):
      (x0, x1) = batch[0]
      z0, p0 = self.forward(x0)
      z1, p1 = self.forward(x1)
      z0 = self.memory_bank(z0, update=False)
      z1 = self.memory_bank(z1, update=True)
      loss = 0.5 * (self.criterion(z0, p1) + self.criterion(z1, p0))
      return loss
  
file_path: lightly/examples/pytorch_lightning/nnclr.py
imports: import pytorch_lightning
  import torch
  import torchvision
  from torch import nn
  from lightly.loss import NTXentLoss
  from lightly.models.modules import NNCLRPredictionHead, NNCLRProjectionHead, NNMemoryBankModule
  from lightly.transforms.simclr_transform import SimCLRTransform
label_desc: Use image node_id 3 for calling the NNCLR obj's underlying member method code with example usage: obj.training_step(batch, batch_idx) and returns: loss