
"""simple docstring"""



import argparse
import random

import joblib
import numpy as np
import torch
from igf.igf import (
    SecondaryLearner,
    collect_objective_set,
    compute_perplexity,
    generate_datasets,
    load_gpta,
    recopy_gpta,
    set_seed,
    train_secondary_learner,
)
from torch.utils.data import DataLoader, RandomSampler

from transformers import GPTaLMHeadModel


def  _UpperCamelCase	(						_A=3_2					,      _A=1_0					,      _A=1_0_0					,      _A=1_0_2_6					,      _A=True					,      _A="data/tokenized_stories_train_wikitext103.jbl"					,      _A="igf_context_pairs.jbl"					,      )    ->  List[str]:





    """simple docstring"""

    set_seed(3      )
    # generate train_data and objective_set
    _UpperCAmelCase    ,_UpperCAmelCase          =   generate_datasets(
        _A					,      _A					,      number=_A					,      min_len=1_0_2_6					,      trim=_A      )
    # keeps model same across runs
    set_seed(4      )
    # model, lm_optimizer, lm_scheduler = recopy_gpt2(model, device, max_steps) # store original model weights
    # can we train on GPU?
    _UpperCAmelCase          =   torch.device("""cuda:0""" if torch.cuda.is_available() else """cpu"""      )

    # load pretrained model
    _UpperCAmelCase          =   load_gpta("""gpt2"""      ).to(_A      )
    print("""computing perplexity on objective set"""      )
    _UpperCAmelCase          =   compute_perplexity(_A					,      _A					,      _A      ).item()
    print("""perplexity on objective set:"""					,      _A      )

    # collect igf pairs and save to file demo.jbl
    collect_objective_set(_A					,      _A					,      _A					,      _A					,      _A					,      _A					,      _A					,      _A      )

    # clean up, delete model and data we don't need anymore
    del model, train_data, objective_set
    torch.cuda.empty_cache()


def  _UpperCamelCase	(						_A					,      _A=1_5					,      _A=1_2_8					,      _A=1_0_0					,      _A="igf_model.pt"					,      )    ->  Any:





    """simple docstring"""

    set_seed(4_2      )

    # Load pre-trained model
    _UpperCAmelCase          =   GPTaLMHeadModel.from_pretrained("""gpt2"""      )

    # Initialize secondary learner to use embedding weights of model
    _UpperCAmelCase          =   SecondaryLearner(_A      )

    # Train secondary learner
    _UpperCAmelCase          =   train_secondary_learner(
        _A					,      _A					,      max_epochs=_A					,      batch_size=_A					,      eval_freq=1_0_0					,      igf_model_path=_A					,      )

    del model, secondary_learner_train_data
    torch.cuda.empty_cache()

    return secondary_learner


def  _UpperCamelCase	(						_A					,      _A					,      _A					,      _A=3_2					,      _A=1_0_0_0					,      _A=1_6					,      _A=1.0					,      _A=recopy_gpta					,      _A=None					,      _A=1_0					,      _A="gpt2_finetuned.pt"					,      )    ->  List[Any]:





    """simple docstring"""

    _UpperCAmelCase          =   torch.device("""cuda:0""" if torch.cuda.is_available() else """cpu"""      )
    _UpperCAmelCase          =   RandomSampler(_A      )
    _UpperCAmelCase          =   DataLoader(_A					,      sampler=_A      )

    _UpperCAmelCase          =   max_steps // (len(_A      )) + 1
    _UpperCAmelCase          =   0
    _UpperCAmelCase          =   torch.zeros((1, context_len)					,      dtype=torch.long					,      device=_A      )
    _UpperCAmelCase    ,_UpperCAmelCase    ,_UpperCAmelCase          =   recopy_model(_A					,      _A					,      _A      )

    model.train()
    if secondary_learner is not None:
        secondary_learner.to(_A      )
        secondary_learner.eval()
    _UpperCAmelCase          =   []
    _UpperCAmelCase          =   0

    _UpperCAmelCase          =   []
    _UpperCAmelCase          =   []

    # Compute the performance of the transformer model at the beginning
    _UpperCAmelCase          =   compute_perplexity(_A					,      _A					,      _A      )
    test_perps.append(_A      )
    print("""Test perplexity, step"""					,      _A					,      """:"""					,      _A      )
    for epoch in range(int(_A      )      ):
        for step, example in enumerate(_A      ):
            torch.cuda.empty_cache()
            _UpperCAmelCase          =   random.randint(0					,      example.size(2      ) - context_len - 1      )
            _UpperCAmelCase          =   example[0, 0, start : start + context_len]
            lm_optimizer.zero_grad()
            _UpperCAmelCase          =   model(_A					,      labels=_A      )
            _UpperCAmelCase          =   True

            if secondary_learner is not None:
                _UpperCAmelCase          =   secondary_learner.forward(
                    torch.tensor(_A					,      dtype=torch.long					,      device=_A      ).unsqueeze(0      )      )[0].item()
                observed_qs.append(float(_A      )      )

                # Here we implement the simple non-constant threshold for the predicted IG(X) value
                # We will decay the selectivity of our secondary learner filter from
                # 1 standard deviation above average to 1 below average after 10 batches.

                if global_step == 1_0:
                    _UpperCAmelCase          =   -1
                if predicted_q < threshold:
                    _UpperCAmelCase          =   False

            # If we passed the filter, add the context to the batch!
            if do_backprop:
                contexts.append(np.array(context.cpu()      )      )
                _UpperCAmelCase          =   outputs[0]
                lm_loss.backward()
                examples += 1

            del outputs

            # Once the batch is filled with enough contexts, backprop on the batch.
            if examples == batch_size:
                torch.cuda.empty_cache()
                _UpperCAmelCase          =   0
                # Do LM backprop
                torch.nn.utils.clip_grad_norm_(model.parameters()					,      3.0      )
                lm_optimizer.step()
                lm_scheduler.step()  # Update learning rate schedule
                global_step += 1
                # Compute the performance of the transformer model at this batch
                if global_step % eval_interval == 0:
                    _UpperCAmelCase          =   compute_perplexity(_A					,      _A					,      _A      )
                    test_perps.append(_A      )

                    print("""Test perplexity, step"""					,      _A					,      """:"""					,      _A      )
            # Break out of the loop after 60 batches
            if max_steps > 0 and global_step > 6_0:
                break
        if max_steps > 0 and global_step > 6_0:
            break

    # save finetuned transformer model
    torch.save(model.state_dict()					,      _A      )
    torch.cuda.empty_cache()
    # Do some cleaning up so we can reinitialize for the next run of this function
    del lm_optimizer
    del lm_scheduler
    return model


def  _UpperCamelCase	(						)    ->  Optional[int]:





    """simple docstring"""

    _UpperCAmelCase          =   argparse.ArgumentParser(description="""Fine-tune a transformer model with IGF on a language modeling task"""      )

    # Required parameters
    parser.add_argument(
        """--data_dir"""					,      default=_A					,      type=_A					,      required=_A					,      help="""The input data dir. Should contain data files for WikiText."""					,      )
    parser.add_argument(
        """--model_name_or_path"""					,      default=_A					,      type=_A					,      required=_A					,      help="""Path to pretrained model or model identifier from huggingface.co/models"""					,      )
    parser.add_argument(
        """--data_file"""					,      type=_A					,      default=_A					,      help=(
            """A jbl file containing tokenized data which can be split as objective dataset, """
            """train_dataset and test_dataset."""
        )					,      )

    parser.add_argument(
        """--igf_data_file"""					,      type=_A					,      default=_A					,      help="""A jbl file containing the context and information gain pairs to train secondary learner."""					,      )

    parser.add_argument(
        """--output_dir"""					,      default=_A					,      type=_A					,      required=_A					,      help="""The output directory where the final fine-tuned model is stored."""					,      )

    parser.add_argument(
        """--tokenizer_name"""					,      default=_A					,      type=_A					,      help="""Pretrained tokenizer name or path if not the same as model_name"""					,      )
    parser.add_argument("""--seed"""					,      type=_A					,      default=_A					,      help="""A seed for reproducible training."""      )

    parser.add_argument(
        """--context_len"""					,      default=3_2					,      type=_A					,      help=(
            """The maximum total input sequence length after tokenization. Sequences longer """
            """than this will be truncated, sequences shorter will be padded."""
        )					,      )

    parser.add_argument(
        """--size_objective_set"""					,      default=1_0_0					,      type=_A					,      help="""number of articles that are long enough to be used as our objective set"""					,      )
    parser.add_argument(
        """--eval_freq"""					,      default=1_0_0					,      type=_A					,      help="""secondary model evaluation is triggered at eval_freq"""      )

    parser.add_argument("""--max_steps"""					,      default=1_0_0_0					,      type=_A					,      help="""To calculate training epochs"""      )

    parser.add_argument(
        """--secondary_learner_batch_size"""					,      default=1_2_8					,      type=_A					,      help="""batch size of training data for secondary learner"""					,      )

    parser.add_argument(
        """--batch_size"""					,      default=1_6					,      type=_A					,      help="""batch size of training data of language model(gpt2) """      )

    parser.add_argument(
        """--eval_interval"""					,      default=1_0					,      type=_A					,      help=(
            """decay the selectivity of our secondary learner filter from"""
            """1 standard deviation above average to 1 below average after 10 batches"""
        )					,      )

    parser.add_argument(
        """--number"""					,      default=1_0_0					,      type=_A					,      help="""The number of examples split to be used as objective_set/test_data"""      )

    parser.add_argument(
        """--min_len"""					,      default=1_0_2_6					,      type=_A					,      help="""The minimum length of the article to be used as objective set"""      )

    parser.add_argument(
        """--secondary_learner_max_epochs"""					,      default=1_5					,      type=_A					,      help="""number of epochs to train secondary learner"""      )

    parser.add_argument("""--trim"""					,      default=_A					,      type=_A					,      help="""truncate the example if it exceeds context length"""      )

    parser.add_argument(
        """--threshold"""					,      default=1.0					,      type=_A					,      help=(
            """The threshold value used by secondary learner to filter the train_data and allow only"""
            """ informative data as input to the model"""
        )					,      )

    parser.add_argument("""--finetuned_model_name"""					,      default="""gpt2_finetuned.pt"""					,      type=_A					,      help="""finetuned_model_name"""      )

    parser.add_argument(
        """--recopy_model"""					,      default=_A					,      type=_A					,      help="""Reset the model to the original pretrained GPT-2 weights after each iteration"""					,      )

    # function calls
    # Collecting *n* pairs of context and information gain(X, IG(X)) for training the secondary learner
    generate_n_pairs(
        context_len=3_2					,      max_steps=1_0					,      size_objective_set=1_0_0					,      min_len=1_0_2_6					,      trim=_A					,      data_file="""data/tokenized_stories_train_wikitext103.jbl"""					,      igf_data_file="""igf_context_pairs.jbl"""					,      )

    # Load train data for secondary learner
    _UpperCAmelCase          =   joblib.load("""data/IGF_values.jbl"""      )

    # Train secondary learner
    _UpperCAmelCase          =   training_secondary_learner(
        _A					,      secondary_learner_max_epochs=1_5					,      secondary_learner_batch_size=1_2_8					,      eval_freq=1_0_0					,      igf_model_path="""igf_model.pt"""					,      )

    # load pretrained gpt2 model
    _UpperCAmelCase          =   GPTaLMHeadModel.from_pretrained("""gpt2"""      )
    set_seed(4_2      )

    # Generate train and test data to train and evaluate gpt2 model
    _UpperCAmelCase    ,_UpperCAmelCase          =   generate_datasets(
        context_len=3_2					,      file="""data/tokenized_stories_train_wikitext103.jbl"""					,      number=1_0_0					,      min_len=1_0_2_6					,      trim=_A      )

    # fine-tuning of the gpt2 model using igf (Information Gain Filtration)
    finetune(
        _A					,      _A					,      _A					,      context_len=3_2					,      max_steps=1_0_0_0					,      batch_size=1_6					,      threshold=1.0					,      recopy_model=_A					,      secondary_learner=_A					,      eval_interval=1_0					,      finetuned_model_name="""gpt2_finetuned.pt"""					,      )


if __name__ == "__main__":
 main()

"""simple docstring"""



import tempfile
import unittest

from transformers import TaConfig, is_torch_available
from transformers.testing_utils import (
    require_sentencepiece,
    require_tokenizers,
    require_torch,
    slow,
    torch_device,
)

from ...generation.test_utils import GenerationTesterMixin
from ...test_modeling_common import ModelTesterMixin, ids_tensor
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
 import torch

 from transformers import AutoTokenizer, UMTaForConditionalGeneration, UMTaForQuestionAnswering, UMTaModel




class 		a_						:







    def __init__(			self			:       Tuple     ,					__UpperCamelCase			:       Optional[int]     ,					__UpperCamelCase			:       List[Any]=99     ,					__UpperCamelCase			:       Optional[int]=13     ,					__UpperCamelCase			:       List[str]=7     ,					__UpperCamelCase			:       List[Any]=9     ,					__UpperCamelCase			:       List[Any]=True     ,					__UpperCamelCase			:       str=True     ,					__UpperCamelCase			:       int=False     ,					__UpperCamelCase			:       int=32     ,					__UpperCamelCase			:       Dict=5     ,					__UpperCamelCase			:       Optional[int]=4     ,					__UpperCamelCase			:       Any=37     ,					__UpperCamelCase			:       List[Any]=8     ,					__UpperCamelCase			:       Optional[int]=0.1     ,					__UpperCamelCase			:       str=0.0_0_2     ,					__UpperCamelCase			:       Union[str, Any]=1     ,					__UpperCamelCase			:       List[Any]=0     ,					__UpperCamelCase			:       Tuple=0     ,					__UpperCamelCase			:       Optional[int]=None     ,					__UpperCamelCase			:       Any=None     ,					)		->List[Any]:






        '''simple docstring'''






        _UpperCAmelCase          =   parent
        _UpperCAmelCase          =   batch_size
        _UpperCAmelCase          =   encoder_seq_length
        _UpperCAmelCase          =   decoder_seq_length
        # For common tests
        _UpperCAmelCase          =   self.decoder_seq_length
        _UpperCAmelCase          =   is_training
        _UpperCAmelCase          =   use_attention_mask
        _UpperCAmelCase          =   use_labels
        _UpperCAmelCase          =   vocab_size
        _UpperCAmelCase          =   hidden_size
        _UpperCAmelCase          =   num_hidden_layers
        _UpperCAmelCase          =   num_attention_heads
        _UpperCAmelCase          =   d_ff
        _UpperCAmelCase          =   relative_attention_num_buckets
        _UpperCAmelCase          =   dropout_rate
        _UpperCAmelCase          =   initializer_factor
        _UpperCAmelCase          =   eos_token_id
        _UpperCAmelCase          =   pad_token_id
        _UpperCAmelCase          =   decoder_start_token_id
        _UpperCAmelCase          =   None
        _UpperCAmelCase          =   decoder_layers







    def      _snake_case					(			self			:       Union[str, Any]     )		->Union[str, Any]:






        '''simple docstring'''






        return TaConfig.from_pretrained("""google/umt5-base"""     )







    def      _snake_case					(			self			:       List[Any]     ,					__UpperCamelCase			:       Dict     ,					__UpperCamelCase			:       List[Any]     ,					__UpperCamelCase			:       Optional[int]     ,					__UpperCamelCase			:       Tuple=None     ,					__UpperCamelCase			:       Optional[Any]=None     ,					__UpperCamelCase			:       Optional[Any]=None     ,					__UpperCamelCase			:       Any=None     ,					__UpperCamelCase			:       str=None     ,					)		->int:






        '''simple docstring'''






        if attention_mask is None:
            _UpperCAmelCase          =   input_ids.ne(config.pad_token_id     )
        if decoder_attention_mask is None:
            _UpperCAmelCase          =   decoder_input_ids.ne(config.pad_token_id     )
        if head_mask is None:
            _UpperCAmelCase          =   torch.ones(config.num_hidden_layers     ,					config.num_attention_heads     ,					device=__UpperCamelCase     )
        if decoder_head_mask is None:
            _UpperCAmelCase          =   torch.ones(config.num_decoder_layers     ,					config.num_attention_heads     ,					device=__UpperCamelCase     )
        if cross_attn_head_mask is None:
            _UpperCAmelCase          =   torch.ones(
                config.num_decoder_layers     ,					config.num_attention_heads     ,					device=__UpperCamelCase     )
        return {
            "input_ids": input_ids,
            "decoder_input_ids": decoder_input_ids,
            "attention_mask": attention_mask,
            "decoder_attention_mask": decoder_attention_mask,
            "head_mask": head_mask,
            "decoder_head_mask": decoder_head_mask,
            "cross_attn_head_mask": cross_attn_head_mask,
        }







    def      _snake_case					(			self			:       List[Any]     )		->Union[str, Any]:






        '''simple docstring'''






        _UpperCAmelCase          =   ids_tensor([self.batch_size, self.encoder_seq_length]     ,					self.vocab_size     )
        _UpperCAmelCase          =   ids_tensor([self.batch_size, self.decoder_seq_length]     ,					self.vocab_size     )

        # we need to clamp the input ids here to avoid having pad token in between
        # this is because for NllbMoe the position_ids are prepared such that
        # all pad tokens have pos id = 2 and rest are between 2..seq_length
        # and the seq_length here is seq_length - num_pad_tokens
        # but when using past, there is no way of knowing if the past input ids had
        # pad tokens in them, which results in incorrect seq_lenth and which in turn results in
        # position_ids being off by num_pad_tokens in past input
        _UpperCAmelCase          =   input_ids.clamp(self.pad_token_id + 1     )
        _UpperCAmelCase          =   decoder_input_ids.clamp(self.pad_token_id + 1     )

        _UpperCAmelCase          =   self.get_config()
        _UpperCAmelCase          =   config.num_attention_heads
        _UpperCAmelCase          =   self.prepare_inputs_dict(__UpperCamelCase     ,					__UpperCamelCase     ,					__UpperCamelCase     )
        return config, input_dict







    def      _snake_case					(			self			:       Union[str, Any]     )		->Any:






        '''simple docstring'''






        _UpperCAmelCase    ,_UpperCAmelCase          =   self.prepare_config_and_inputs()
        return config, inputs_dict







    def      _snake_case					(			self			:       Dict     )		->List[str]:






        '''simple docstring'''






        return TaConfig(
            vocab_size=1_66     ,					d_model=self.hidden_size     ,					d_ff=self.d_ff     ,					d_kv=self.hidden_size // self.num_attention_heads     ,					num_layers=self.num_hidden_layers     ,					num_decoder_layers=self.decoder_layers     ,					num_heads=self.num_attention_heads     ,					relative_attention_num_buckets=self.relative_attention_num_buckets     ,					dropout_rate=self.dropout_rate     ,					initializer_factor=self.initializer_factor     ,					eos_token_id=self.eos_token_id     ,					bos_token_id=self.pad_token_id     ,					pad_token_id=self.pad_token_id     ,					decoder_start_token_id=self.decoder_start_token_id     ,					)







    def      _snake_case					(			self			:       Tuple     )		->Dict:






        '''simple docstring'''






        return TaConfig(
            vocab_size=self.vocab_size     ,					d_model=self.hidden_size     ,					d_ff=self.d_ff     ,					d_kv=self.hidden_size // self.num_attention_heads     ,					num_layers=self.num_hidden_layers     ,					num_decoder_layers=self.decoder_layers     ,					num_heads=self.num_attention_heads     ,					relative_attention_num_buckets=self.relative_attention_num_buckets     ,					dropout_rate=self.dropout_rate     ,					initializer_factor=self.initializer_factor     ,					eos_token_id=self.eos_token_id     ,					bos_token_id=self.pad_token_id     ,					pad_token_id=self.pad_token_id     ,					decoder_start_token_id=self.decoder_start_token_id     ,					)







    def      _snake_case					(			self			:       List[Any]     ,					__UpperCamelCase			:       Union[str, Any]     ,					__UpperCamelCase			:       Any     ,					__UpperCamelCase			:       Dict     ,					__UpperCamelCase			:       Optional[Any]     ,					__UpperCamelCase			:       Dict     ,					__UpperCamelCase			:       List[str]     ,					)		->List[str]:






        '''simple docstring'''






        _UpperCAmelCase          =   UMTaModel(config=__UpperCamelCase     )
        model.to(__UpperCamelCase     )
        model.eval()
        _UpperCAmelCase          =   model(
            input_ids=__UpperCamelCase     ,					decoder_input_ids=__UpperCamelCase     ,					attention_mask=__UpperCamelCase     ,					decoder_attention_mask=__UpperCamelCase     ,					)
        _UpperCAmelCase          =   model(input_ids=__UpperCamelCase     ,					decoder_input_ids=__UpperCamelCase     )
        _UpperCAmelCase          =   result.last_hidden_state
        _UpperCAmelCase          =   result.past_key_values
        _UpperCAmelCase          =   result.encoder_last_hidden_state

        self.parent.assertEqual(encoder_output.size()     ,					(self.batch_size, self.encoder_seq_length, self.hidden_size)     )
        self.parent.assertEqual(decoder_output.size()     ,					(self.batch_size, self.decoder_seq_length, self.hidden_size)     )
        # There should be `num_layers` key value embeddings stored in decoder_past
        self.parent.assertEqual(len(__UpperCamelCase     )     ,					config.num_layers     )
        # There should be a self attn key, a self attn value, a cross attn key and a cross attn value stored in each decoder_past tuple
        self.parent.assertEqual(len(decoder_past[0]     )     ,					4     )







    def      _snake_case					(			self			:       Union[str, Any]     ,					__UpperCamelCase			:       List[Any]     ,					__UpperCamelCase			:       Optional[int]     ,					__UpperCamelCase			:       Dict     ,					__UpperCamelCase			:       Optional[int]     ,					__UpperCamelCase			:       Union[str, Any]     ,					__UpperCamelCase			:       List[str]     ,					)		->str:






        '''simple docstring'''






        _UpperCAmelCase          =   UMTaModel(config=__UpperCamelCase     ).get_decoder().to(__UpperCamelCase     ).eval()
        # first forward pass
        _UpperCAmelCase          =   model(__UpperCamelCase     ,					use_cache=__UpperCamelCase     )
        _UpperCAmelCase          =   model(__UpperCamelCase     )
        _UpperCAmelCase          =   model(__UpperCamelCase     ,					use_cache=__UpperCamelCase     )

        self.parent.assertTrue(len(__UpperCamelCase     ) == len(__UpperCamelCase     )     )
        self.parent.assertTrue(len(__UpperCamelCase     ) == len(__UpperCamelCase     ) + 1     )

        _UpperCAmelCase    ,_UpperCAmelCase          =   outputs.to_tuple()

        # create hypothetical next token and extent to next_input_ids
        _UpperCAmelCase          =   ids_tensor((self.batch_size, 1)     ,					config.vocab_size     )

        # append to next input_ids and
        _UpperCAmelCase          =   torch.cat([input_ids, next_tokens]     ,					dim=-1     )

        _UpperCAmelCase          =   model(__UpperCamelCase     )["""last_hidden_state"""]
        _UpperCAmelCase          =   model(__UpperCamelCase     ,					past_key_values=__UpperCamelCase     )["""last_hidden_state"""]

        # select random slice
        _UpperCAmelCase          =   ids_tensor((1,)     ,					output_from_past.shape[-1]     ).item()
        _UpperCAmelCase          =   output_from_no_past[:, -1, random_slice_idx].detach()
        _UpperCAmelCase          =   output_from_past[:, 0, random_slice_idx].detach()

        # test that outputs are equal for slice
        self.parent.assertTrue(torch.allclose(__UpperCamelCase     ,					__UpperCamelCase     ,					atol=1e-3     )     )







    def      _snake_case					(			self			:       Optional[int]     ,					__UpperCamelCase			:       int     ,					__UpperCamelCase			:       Dict     ,					)		->List[str]:






        '''simple docstring'''






        _UpperCAmelCase          =   UMTaModel(config=__UpperCamelCase     ).to(__UpperCamelCase     ).half().eval()
        _UpperCAmelCase          =   model(**__UpperCamelCase     )["""last_hidden_state"""]
        self.parent.assertFalse(torch.isnan(__UpperCamelCase     ).any().item()     )







@require_torch
class 		a_						( _UpperCAmelCase     ,						_UpperCAmelCase     ,						_UpperCAmelCase     ,						unittest.TestCase	):
    a      :				List[str]     =				(
        (UMTaModel, UMTaForConditionalGeneration, UMTaForQuestionAnswering) if is_torch_available() else ()
    )
    a      :				Tuple     =				(UMTaForConditionalGeneration,) if is_torch_available() else ()
    a      :				Optional[Any]     =				(
        {
            'conversational': UMTaForConditionalGeneration,
            'feature-extraction': UMTaModel,
            'summarization': UMTaForConditionalGeneration,
            'text2text-generation': UMTaForConditionalGeneration,
            'translation': UMTaForConditionalGeneration,
            'question-answering': UMTaForQuestionAnswering,
        }
        if is_torch_available()
        else {}
    )
    a      :				Any     =				True
    a      :				Optional[int]     =				False
    a      :				Any     =				False
    a      :				Optional[int]     =				True
    a      :				Optional[Any]     =				True
    # The small UMT5 model needs higher percentages for CPU/MP tests
    a      :				int     =				[0.8, 0.9]







    def      _snake_case					(			self			:       Optional[Any]     )		->Union[str, Any]:






        '''simple docstring'''






        _UpperCAmelCase          =   UMTaModelTester(self     )







    @unittest.skip("""Test has a segmentation fault on torch 1.8.0"""     )
    def      _snake_case					(			self			:       Union[str, Any]     )		->Union[str, Any]:






        '''simple docstring'''






        _UpperCAmelCase          =   self.model_tester.prepare_config_and_inputs()
        _UpperCAmelCase          =   UMTaModel(config_and_inputs[0]     ).to(__UpperCamelCase     )
        with tempfile.TemporaryDirectory() as tmpdirname:
            torch.onnx.export(
                __UpperCamelCase     ,					(config_and_inputs[1], config_and_inputs[3], config_and_inputs[2])     ,					f"""{tmpdirname}/t5_test.onnx"""     ,					export_params=__UpperCamelCase     ,					opset_version=9     ,					input_names=["""input_ids""", """decoder_input_ids"""]     ,					)







    @unittest.skipIf(torch_device == """cpu"""     ,					"""Cant do half precision"""     )
    def      _snake_case					(			self			:       Tuple     )		->Optional[int]:






        '''simple docstring'''






        _UpperCAmelCase          =   self.model_tester.prepare_config_and_inputs()
        self.model_tester.create_and_check_model_fpaa_forward(*__UpperCamelCase     )







    def      _snake_case					(			self			:       Any     )		->Any:






        '''simple docstring'''






        _UpperCAmelCase          =   ["""encoder_attentions""", """decoder_attentions""", """cross_attentions"""]
        _UpperCAmelCase          =   self.model_tester.prepare_config_and_inputs()
        _UpperCAmelCase          =   config_and_inputs[0]
        _UpperCAmelCase          =   UMTaForConditionalGeneration(__UpperCamelCase     ).eval()
        model.to(__UpperCamelCase     )

        _UpperCAmelCase          =   {
            """head_mask""": torch.zeros(config.num_layers     ,					config.num_heads     ,					device=__UpperCamelCase     ),
            """decoder_head_mask""": torch.zeros(config.num_decoder_layers     ,					config.num_heads     ,					device=__UpperCamelCase     ),
            """cross_attn_head_mask""": torch.zeros(config.num_decoder_layers     ,					config.num_heads     ,					device=__UpperCamelCase     ),
        }

        for attn_name, (name, mask) in zip(__UpperCamelCase     ,					head_masking.items()     ):
            _UpperCAmelCase          =   {name: mask}
            # Explicitly pass decoder_head_mask as it is required from T5 model when head_mask specified
            if name == "head_mask":
                _UpperCAmelCase          =   torch.ones(
                    config.num_decoder_layers     ,					config.num_heads     ,					device=__UpperCamelCase     )

            _UpperCAmelCase          =   model.generate(
                config_and_inputs[1]["""input_ids"""]     ,					num_beams=1     ,					max_length=3     ,					output_attentions=__UpperCamelCase     ,					return_dict_in_generate=__UpperCamelCase     ,					**__UpperCamelCase     ,					)
            # We check the state of decoder_attentions and cross_attentions just from the last step
            _UpperCAmelCase          =   out[attn_name] if attn_name == attention_names[0] else out[attn_name][-1]
            self.assertEqual(sum([w.sum().item() for w in attn_weights]     )     ,					0.0     )







    @unittest.skip("""Does not work on the tiny model as we keep hitting edge cases."""     )
    def      _snake_case					(			self			:       Tuple     )		->List[Any]:






        '''simple docstring'''






        pass







@require_torch
@require_sentencepiece
@require_tokenizers
class 		a_						( unittest.TestCase	):







    @slow
    @unittest.skip(
        """Unless we stop stripping left and right by default for all special tokens, the expected ids obtained here will not match the original ones. Wait for https://github.com/huggingface/transformers/pull/23909 to be merged"""     )
    def      _snake_case					(			self			:       Optional[Any]     )		->Optional[Any]:






        '''simple docstring'''






        _UpperCAmelCase          =   UMTaForConditionalGeneration.from_pretrained("""google/umt5-small"""     ,					return_dict=__UpperCamelCase     ).to(__UpperCamelCase     )
        _UpperCAmelCase          =   AutoTokenizer.from_pretrained("""google/umt5-small"""     ,					use_fast=__UpperCamelCase     ,					legacy=__UpperCamelCase     )
        _UpperCAmelCase          =   [
            """Bonjour monsieur <extra_id_0> bien <extra_id_1>.""",
            """No se como puedo <extra_id_0>.""",
            """This is the reason why we <extra_id_0> them.""",
            """The <extra_id_0> walks in <extra_id_1>, seats""",
            """A <extra_id_0> walks into a bar and orders a <extra_id_1> with <extra_id_2> pinch of <extra_id_3>.""",
        ]
        _UpperCAmelCase          =   tokenizer(__UpperCamelCase     ,					return_tensors="""pt"""     ,					padding=__UpperCamelCase     ).input_ids
        # fmt: off
        _UpperCAmelCase          =   torch.tensor(
            [
                [ 3_85_30, 21_07_03, 25_62_99, 14_10, 25_62_98, 2_74, 1, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0],
                [   8_26, 3_21, 6_71, 2_59_22, 25_62_99, 2_74, 1, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0],
                [  14_60, 3_39, 3_12, 1_90_14, 1_06_20, 7_58, 25_62_99, 23_55,2_74, 1, 0, 0, 0, 0, 0, 0,0, 0],
                [   5_17, 25_62_99, 1_48_69, 2_81, 3_01, 25_62_98, 2_75, 11_99_83,1, 0, 0, 0, 0, 0, 0, 0,0, 0],
                [   3_20, 25_62_99, 1_48_69, 2_81, 22_34, 2_89, 22_75, 3_33,6_13_91, 2_89, 25_62_98, 5_43, 25_62_97, 16_87_14, 3_29, 25_62_96,2_74, 1],
            ]     )
        # fmt: on
        torch.testing.assert_allclose(__UpperCamelCase     ,					__UpperCamelCase     )

        _UpperCAmelCase          =   model.generate(input_ids.to(__UpperCamelCase     )     )
        _UpperCAmelCase          =   [
            """<pad><extra_id_0> et<extra_id_1> [eod] <extra_id_2><extra_id_55>.. [eod] 💐 💐 💐 💐 💐 💐 💐 💐 💐 💐 💐 <extra_id_56>ajšietosto<extra_id_56>lleux<extra_id_19><extra_id_6>ajšie</s>""",
            """<pad><extra_id_0>.<extra_id_1>.,<0x0A>...spech <0x0A><extra_id_20> <extra_id_21></s><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad>""",
            """<pad><extra_id_0> are not going to be a part of the world. We are not going to be a part of<extra_id_1> and<extra_id_2><0x0A><extra_id_48>.<extra_id_48></s><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad>""",
            """<pad><extra_id_0> door<extra_id_1>, the door<extra_id_2> 피해[/</s><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad>""",
            """<pad><extra_id_0>nyone who<extra_id_1> drink<extra_id_2> a<extra_id_3> alcohol<extra_id_4> A<extra_id_5> A. This<extra_id_6> I<extra_id_7><extra_id_52><extra_id_53></s><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad><pad>""",
        ]
        _UpperCAmelCase          =   tokenizer.batch_decode(__UpperCamelCase     )
        self.assertEqual(__UpperCamelCase     ,					__UpperCamelCase     )