code: def get_ltor_masks_and_position_ids(
      data,
      eod_token,
      reset_position_ids,
      reset_attention_mask,
      eod_mask_loss,
      compute_attention_mask=True,
  ):
      """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 = None
      if compute_attention_mask:
          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).repeat(
          micro_batch_size, 1
      )
      # 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 indicies:
              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
  
      if compute_attention_mask:
          # Convert attention mask to binary:
          attention_mask = attention_mask < 0.5
  
      return attention_mask, loss_mask, position_ids
  
imports: import itertools
  import math
  from typing import Dict, Iterator, List, Tuple, Union
  import torch
  import torch.nn
  from torch import Tensor
label_desc: Use image node_id 13 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, compute_attention_mask) and returns: attention_mask,  loss_mask,  position_ids