code: def compute_split_index(
      self,
      model,
      idx,
      tp_rank,
      pp_rank,
      pp_split_rank,
      tp_size,
      pp_size,
  ):
      if (
          pp_rank == (pp_size - 1)
          and hasattr(model, "model")
          and hasattr(model.model, "word_embeddings")
      ):
          # duplicate embedding copy (tied weights)
          self.duplicate_gpt_word_embedding_offset = 1
  
      if (
          model.cfg.get("share_embeddings_and_output_weights", True)
          is False
      ):
          self.untied_gpt_embedding = True
  
      if self.duplicate_gpt_word_embedding_offset > 0:
          logging.info(
              f"GPT duplicate_gpt_word_embedding_offset: {self.duplicate_gpt_word_embedding_offset}"
          )
  
      return idx + self.duplicate_gpt_word_embedding_offset
  
imports: import os
  import shutil
  import tarfile
  import tempfile
  from argparse import ArgumentParser
  from typing import Dict, List
  import torch
  import torch.nn
  from omegaconf import OmegaConf, open_dict
  from pytorch_lightning import Trainer
  from nemo.collections.nlp.parts.nlp_overrides import NEMO_MEGATRON_MODEL_PARALLEL_APPSTATE_OVERRIDE, GradScaler, MegatronHalfPrecisionPlugin, NLPDDPStrategy, NLPSaveRestoreConnector, PipelineMixedPrecisionPlugin
  from nemo.utils import logging, model_utils
  from nemo.utils.app_state import AppState
label_desc: Use image node_id 2 for calling the GPTHandler obj's underlying member method code with example usage: obj.compute_split_index(model, idx, tp_rank, pp_rank, pp_split_rank, tp_size, pp_size) and returns: unknown