code: def get_ltor_masks_and_position_ids(
      data,
      eod_token,
      reset_position_ids,
      reset_attention_mask,
      eod_mask_loss,
  ):
      """Build masks and position id for left to right model."""
  
      # Extract batch size and sequence length.
      micro_batch_size, seq_length = data.size()
  
      # Attention mask (lower triangular).
      if reset_attention_mask:
          att_mask_batch = micro_batch_size
      else:
          att_mask_batch = 1
      attention_mask = torch.tril(
          torch.ones(
              (att_mask_batch, seq_length, seq_length),
              device=data.device,
          )
      ).view(att_mask_batch, 1, seq_length, seq_length)
  
      # Loss mask.
      loss_mask = torch.ones(
          data.size(), dtype=torch.float, device=data.device
      )
      if eod_mask_loss:
          loss_mask[data == eod_token] = 0.0
  
      # Position ids.
      position_ids = torch.arange(
          seq_length, dtype=torch.long, device=data.device
      )
      position_ids = position_ids.unsqueeze(0).expand_as(data)
      # We need to clone as the ids will be modifed based on batch index.
      if reset_position_ids:
          position_ids = position_ids.clone()
  
      if reset_position_ids or reset_attention_mask:
          # Loop through the batches:
          for b in range(micro_batch_size):
              # Find indecies where EOD token is.
              eod_index = position_ids[b, data[b] == eod_token]
              # Detach indecies from positions if going to modify positions.
              if reset_position_ids:
                  eod_index = eod_index.clone()
  
              # Loop through EOD indecies:
              prev_index = 0
              for j in range(eod_index.size()[0]):
                  i = eod_index[j]
                  # Mask attention loss.
                  if reset_attention_mask:
                      attention_mask[b, 0, (i + 1) :, : (i + 1)] = 0
                  # Reset positions.
                  if reset_position_ids:
                      position_ids[b, (i + 1) :] -= i + 1 - prev_index
                      prev_index = i + 1
  
      # Convert attention mask to binary:
      attention_mask = attention_mask < 0.5
  
      return attention_mask, loss_mask, position_ids
  
imports: from typing import Optional, List, Union, Tuple
  import torch
  from torch.nn.parallel import DistributedDataParallel
  from apex.multi_tensor_apply import multi_tensor_applier
  from apex.transformer import parallel_state
  from apex.transformer.enums import ModelType
  from apex.transformer.microbatches import build_num_microbatches_calculator
  from apex.transformer.pipeline_parallel._timers import _Timers
label_desc: Use image node_id 25 for calling a global function with example usage: get_ltor_masks_and_position_ids(data, eod_token, reset_position_ids, reset_attention_mask, eod_mask_loss) and returns: attention_mask,  loss_mask,  position_ids