class_docstr: BERT encoder with QA head training.
class_docstr_tok: ["BERT","encoder","with","QA","head","training","."]
code: def training_step(self, batch, batch_idx):
      (
          input_ids,
          input_type_ids,
          input_mask,
          unique_ids,
          start_positions,
          end_positions,
      ) = batch
      logits = self.forward(
          input_ids=input_ids,
          token_type_ids=input_type_ids,
          attention_mask=input_mask,
      )
      loss, _, _ = self.loss(
          logits=logits,
          start_positions=start_positions,
          end_positions=end_positions,
      )
      lr = self._optimizer.param_groups[0]["lr"]
      self.log("train_loss", loss)
      self.log("lr", lr, prog_bar=True)
      return {"loss": loss, "lr": lr}
  
imports: import json
  from typing import Optional
  import torch
  from omegaconf import DictConfig, OmegaConf
  from pytorch_lightning import Trainer
  from torch.cuda.amp import autocast
  from nemo.collections.common.losses import SpanningLoss
  from nemo.collections.nlp.data import SquadDataset
  from nemo.collections.nlp.data.question_answering_squad.qa_squad_processing import EVALUATION_MODE, INFERENCE_MODE, TRAINING_MODE
  from nemo.collections.nlp.models.nlp_model import NLPModel
  from nemo.collections.nlp.modules.common import TokenClassifier
  from nemo.collections.nlp.parts.utils_funcs import tensor2list
  from nemo.core.classes.common import PretrainedModelInfo, typecheck
  from nemo.utils import logging
label_desc: Use image node_id 3 for calling the QAModel obj's underlying member method code with example usage: obj.training_step(batch, batch_idx) and returns: dict