class_docstr: Generate a Prompt and concatenate it with the input.
  
  This is the training time version of prompting a model. Calling the injected `prompt` module will generate your
  unbatched prompt. This model then replicates it for the batched input and concatenates them together.
  
  Attributes:
      prompt: The module that actually generates the unbatched prompt.
      combine: A function that combines the prompt and the embedded input.
code: def forward(self, embedded_input):
      # Compute prompt embedding
      self.prompt_tokens = self.prompt_tokens.to(embedded_input.device)
      prompt = self.prompt_embedding(self.prompt_tokens)
  
      # Prompt to batch size
      batch_size = embedded_input.shape[0]
      prompt = torch.tile(
          torch.unsqueeze(prompt, dim=0),
          [batch_size] + [1 for _ in prompt.shape],
      )
  
      # Merge prompt and input
      output = self.combination_fn(prompt, embedded_input)
  
      # Adapt attention mask
      prefix_attention_mask_length = (
          self.prompt_tuning_config.prompt_length
      )
  
      return output, prefix_attention_mask_length
  
imports: import math
  from typing import Callable, Dict, List, Union
  import numpy
  import torch
  from torch import nn
  from transformers import AutoTokenizer
  from transformers.configuration_utils import PretrainedConfig
  from ..composition import AdapterCompositionBlock
  from ..configuration import ModelAdaptersConfig, PromptTuningConfig
  from ..context import ForwardContext
  from .adapter_layer_base import AdapterLayerBase
label_desc: Use image node_id 3 for calling the PromptTuning obj's underlying member method code with example usage: obj.forward(embedded_input) and returns: output,  prefix_attention_mask_length