
import argparse
import os

# New Code #
import evaluate
import torch
from datasets import load_dataset
from torch.optim import AdamW
from torch.utils.data import DataLoader
from transformers import AutoModelForSequenceClassification, AutoTokenizer, get_linear_schedule_with_warmup, set_seed

from accelerate import Accelerator
from accelerate.utils import find_executable_batch_size


########################################################################
# This is a fully working simple example to use Accelerate,
# specifically showcasing how to combine both the gradient accumulation
# and automatic batch size finder utilities of Accelerate to perfrom
# automatic gradient accumulation
#
# This example trains a Bert base model on GLUE MRPC
# in any of the following settings (with the same script):
#   - single CPU or single GPU
#   - multi GPUS (using PyTorch distributed mode)
#   - (multi) TPUs
#   - fp16 (mixed-precision) or fp32 (normal precision)
#
# New additions from the base script can be found quickly by
# looking for the # New Code # tags
#
# To run it in each of these various modes, follow the instructions
# in the readme for examples:
# https://github.com/huggingface/accelerate/tree/main/examples
#
########################################################################

a__				:      List[str]    		=     32







def 				UpperCAmelCase_(    a__ ,						a__ = 16   ):



    """simple docstring"""



    SCREAMING_SNAKE_CASE				:				Optional[int]				      = AutoTokenizer.from_pretrained('''bert-base-cased'''   )
    SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = load_dataset('''glue''' ,						'''mrpc'''   )

    def tokenize_function(a__   ):
        # max_length=None => use the model max length (it's actually the default)
        SCREAMING_SNAKE_CASE				:				str				      = tokenizer(examples['''sentence1'''] ,						examples['''sentence2'''] ,						truncation=a__ ,						max_length=a__   )
        return outputs

    # Apply the method we just defined to all the examples in all the splits of the dataset
    # starting with the main process first:
    with accelerator.main_process_first():
        SCREAMING_SNAKE_CASE				:				int				      = datasets.map(
            a__ ,						batched=a__ ,						remove_columns=['''idx''', '''sentence1''', '''sentence2'''] ,						)

    # We also rename the 'label' column to 'labels' which is the expected name for labels by the models of the
    # transformers library
    SCREAMING_SNAKE_CASE				:				Any				      = tokenized_datasets.rename_column('''label''' ,						'''labels'''   )

    def collate_fn(a__   ):
        # When using mixed precision we want round multiples of 8/16
        if accelerator.mixed_precision == "fp8":
            SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = 16
        elif accelerator.mixed_precision != "no":
            SCREAMING_SNAKE_CASE				:				List[str]				      = 8
        else:
            SCREAMING_SNAKE_CASE				:				Any				      = None

        return tokenizer.pad(
            a__ ,						padding='''longest''' ,						pad_to_multiple_of=a__ ,						return_tensors='''pt''' ,						)

    # Instantiate dataloaders.
    SCREAMING_SNAKE_CASE				:				Optional[int]				      = DataLoader(
        tokenized_datasets['''train'''] ,						shuffle=a__ ,						collate_fn=a__ ,						batch_size=a__   )
    SCREAMING_SNAKE_CASE				:				List[str]				      = DataLoader(
        tokenized_datasets['''validation'''] ,						shuffle=a__ ,						collate_fn=a__ ,						batch_size=a__   )

    return train_dataloader, eval_dataloader


# For testing only
if os.environ.get('''TESTING_MOCKED_DATALOADERS''', None) == "1":
      from accelerate.test_utils.training import mocked_dataloaders

      a__				:      Optional[Any]    		=     mocked_dataloaders  # noqa: F811







def 				UpperCAmelCase_(    a__ ,						a__   ):



    """simple docstring"""



    if os.environ.get('''TESTING_MOCKED_DATALOADERS''' ,						a__   ) == "1":
        SCREAMING_SNAKE_CASE				:				Any				      = 2
    # Initialize accelerator
    SCREAMING_SNAKE_CASE				:				Tuple				      = Accelerator(cpu=args.cpu ,						mixed_precision=args.mixed_precision   )
    # Sample hyper-parameters for learning rate, batch size, seed and a few other HPs
    SCREAMING_SNAKE_CASE				:				Optional[Any]				      = config['''lr''']
    SCREAMING_SNAKE_CASE				:				List[Any]				      = int(config['''num_epochs''']   )
    SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = int(config['''seed''']   )
    SCREAMING_SNAKE_CASE				:				Optional[Any]				      = int(config['''batch_size''']   )

    SCREAMING_SNAKE_CASE				:				Tuple				      = evaluate.load('''glue''' ,						'''mrpc'''   )

    # New Code #
    # We use the `find_executable_batch_size` decorator, passing in the desired observed batch size
    # to train on. If a CUDA OOM error occurs, it will retry this loop cutting the batch size in
    # half each time. From this, we can calculate the number of gradient accumulation steps needed
    # and modify the Accelerator object as a result
    @find_executable_batch_size(starting_batch_size=int(a__   )   )
    def inner_training_loop(a__   ):
        # Since we need to modify the outside accelerator object, we need to bring it
        # to the local scope
        nonlocal accelerator

        # We can calculate the number of gradient accumulation steps based on the current
        # batch size vs the starting batch size
        SCREAMING_SNAKE_CASE				:				int				      = observed_batch_size // batch_size

        # And then set it in the Accelerator directly:
        SCREAMING_SNAKE_CASE				:				str				      = num_gradient_accumulation_steps

        # Next we need to free all of the stored model references in the Accelerator each time
        accelerator.free_memory()

        # And set the seed so our results are reproducable each reset
        set_seed(a__   )

        # Instantiate the model (we build the model here so that the seed also control new weights initialization)
        SCREAMING_SNAKE_CASE				:				List[str]				      = AutoModelForSequenceClassification.from_pretrained('''bert-base-cased''' ,						return_dict=a__   )

        # We could avoid this line since the accelerator is set with `device_placement=True` (default value).
        # Note that if you are placing tensors on devices manually, this line absolutely needs to be before the optimizer
        # creation otherwise training will not work on TPU (`accelerate` will kindly throw an error to make us aware of that).
        SCREAMING_SNAKE_CASE				:				List[Any]				      = model.to(accelerator.device   )

        # Instantiate optimizer
        SCREAMING_SNAKE_CASE				:				List[Any]				      = AdamW(params=model.parameters() ,						lr=a__   )
        SCREAMING_SNAKE_CASE      ,							SCREAMING_SNAKE_CASE				:				List[str]				      = get_dataloaders(a__ ,						a__   )

        # Instantiate scheduler
        SCREAMING_SNAKE_CASE				:				int				      = get_linear_schedule_with_warmup(
            optimizer=a__ ,						num_warmup_steps=100 ,						num_training_steps=(len(a__   ) * num_epochs) ,						)

        # Prepare everything
        # There is no specific order to remember, we just need to unpack the objects in the same order we gave them to the
        # prepare method.
        SCREAMING_SNAKE_CASE      ,							SCREAMING_SNAKE_CASE      ,							SCREAMING_SNAKE_CASE      ,							SCREAMING_SNAKE_CASE      ,							SCREAMING_SNAKE_CASE				:				str				      = accelerator.prepare(
            a__ ,						a__ ,						a__ ,						a__ ,						a__   )

        # Now we train the model
        for epoch in range(a__   ):
            model.train()
            for step, batch in enumerate(a__   ):
                # And perform gradient accumulation
                with accelerator.accumulate(a__   ):
                    # We could avoid this line since we set the accelerator with `device_placement=True`.
                    batch.to(accelerator.device   )
                    SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = model(**a__   )
                    SCREAMING_SNAKE_CASE				:				Optional[Any]				      = outputs.loss
                    accelerator.backward(a__   )
                    optimizer.step()
                    lr_scheduler.step()
                    optimizer.zero_grad()

            model.eval()
            for step, batch in enumerate(a__   ):
                # We could avoid this line since we set the accelerator with `device_placement=True`.
                batch.to(accelerator.device   )
                with torch.no_grad():
                    SCREAMING_SNAKE_CASE				:				Optional[int]				      = model(**a__   )
                SCREAMING_SNAKE_CASE				:				Tuple				      = outputs.logits.argmax(dim=-1   )
                SCREAMING_SNAKE_CASE      ,							SCREAMING_SNAKE_CASE				:				Optional[int]				      = accelerator.gather_for_metrics((predictions, batch['''labels'''])   )
                metric.add_batch(
                    predictions=a__ ,						references=a__ ,						)

            SCREAMING_SNAKE_CASE				:				List[Any]				      = metric.compute()
            # Use accelerator.print to print only on the main process.
            accelerator.print(F"""epoch {epoch}:""" ,						a__   )

    # New Code #
    # And call it at the end with no arguments
    # Note: You could also refactor this outside of your training loop function
    inner_training_loop()







def 				UpperCAmelCase_(    ):



    """simple docstring"""



    SCREAMING_SNAKE_CASE				:				str				      = argparse.ArgumentParser(description='''Simple example of training script.'''   )
    parser.add_argument(
        '''--mixed_precision''' ,						type=a__ ,						default=a__ ,						choices=['''no''', '''fp16''', '''bf16''', '''fp8'''] ,						help='''Whether to use mixed precision. Choose'''
        '''between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >= 1.10.'''
        '''and an Nvidia Ampere GPU.''' ,						)
    parser.add_argument('''--cpu''' ,						action='''store_true''' ,						help='''If passed, will train on the CPU.'''   )
    SCREAMING_SNAKE_CASE				:				Optional[Any]				      = parser.parse_args()
    # New Code #
    # We modify the starting batch size to be an observed batch size of 256, to guarentee an initial CUDA OOM
    SCREAMING_SNAKE_CASE				:				Tuple				      = {'''lr''': 2e-5, '''num_epochs''': 3, '''seed''': 42, '''batch_size''': 256}
    training_function(a__ ,						a__   )


if __name__ == "__main__":
      main()


import unittest

from transformers import FunnelConfig, FunnelTokenizer, is_torch_available
from transformers.models.auto import get_values
from transformers.testing_utils import require_sentencepiece, require_tokenizers, require_torch, slow, torch_device

from ...test_configuration_common import ConfigTester
from ...test_modeling_common import ModelTesterMixin, ids_tensor
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
      import torch

      from transformers import (
          MODEL_FOR_PRETRAINING_MAPPING,
          FunnelBaseModel,
          FunnelForMaskedLM,
          FunnelForMultipleChoice,
          FunnelForPreTraining,
          FunnelForQuestionAnswering,
          FunnelForSequenceClassification,
          FunnelForTokenClassification,
          FunnelModel,
      )






class     a_       :



       """simple docstring"""






       def __init__(		self				,       _lowerCamelCase				,       _lowerCamelCase=13				,       _lowerCamelCase=7				,       _lowerCamelCase=True				,       _lowerCamelCase=True				,       _lowerCamelCase=True				,       _lowerCamelCase=True				,       _lowerCamelCase=99				,       _lowerCamelCase=[1, 1, 2]				,       _lowerCamelCase=1				,       _lowerCamelCase=32				,       _lowerCamelCase=4				,       _lowerCamelCase=8				,       _lowerCamelCase=37				,       _lowerCamelCase="gelu_new"				,       _lowerCamelCase=0.1				,       _lowerCamelCase=0.1				,       _lowerCamelCase=0.0				,       _lowerCamelCase=512				,       _lowerCamelCase=3				,       _lowerCamelCase=0.0_2				,       _lowerCamelCase=3				,       _lowerCamelCase=4				,       _lowerCamelCase=None				,       _lowerCamelCase=False				,       )					->List[str]:
           SCREAMING_SNAKE_CASE				:				Any				      = parent
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = batch_size
           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = seq_length
           SCREAMING_SNAKE_CASE				:				Dict				      = is_training
           SCREAMING_SNAKE_CASE				:				int				      = use_input_mask
           SCREAMING_SNAKE_CASE				:				Optional[int]				      = use_token_type_ids
           SCREAMING_SNAKE_CASE				:				Tuple				      = use_labels
           SCREAMING_SNAKE_CASE				:				List[str]				      = vocab_size
           SCREAMING_SNAKE_CASE				:				Tuple				      = block_sizes
           SCREAMING_SNAKE_CASE				:				str				      = num_decoder_layers
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = d_model
           SCREAMING_SNAKE_CASE				:				str				      = n_head
           SCREAMING_SNAKE_CASE				:				List[str]				      = d_head
           SCREAMING_SNAKE_CASE				:				Dict				      = d_inner
           SCREAMING_SNAKE_CASE				:				Any				      = hidden_act
           SCREAMING_SNAKE_CASE				:				Dict				      = hidden_dropout
           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = attention_dropout
           SCREAMING_SNAKE_CASE				:				List[Any]				      = activation_dropout
           SCREAMING_SNAKE_CASE				:				str				      = max_position_embeddings
           SCREAMING_SNAKE_CASE				:				Optional[int]				      = type_vocab_size
           SCREAMING_SNAKE_CASE				:				Dict				      = 2
           SCREAMING_SNAKE_CASE				:				Tuple				      = num_labels
           SCREAMING_SNAKE_CASE				:				str				      = num_choices
           SCREAMING_SNAKE_CASE				:				Tuple				      = scope
           SCREAMING_SNAKE_CASE				:				List[str]				      = initializer_std

           # Used in the tests to check the size of the first attention layer
           SCREAMING_SNAKE_CASE				:				str				      = n_head
           # Used in the tests to check the size of the first hidden state
           SCREAMING_SNAKE_CASE				:				Tuple				      = self.d_model
           # Used in the tests to check the number of output hidden states/attentions
           SCREAMING_SNAKE_CASE				:				str				      = sum(self.block_sizes   ) + (0 if base else self.num_decoder_layers)
           # FunnelModel adds two hidden layers: input embeddings and the sum of the upsampled encoder hidden state with
           # the last hidden state of the first block (which is the first hidden state of the decoder).
           if not base:
               SCREAMING_SNAKE_CASE				:				Tuple				      = self.num_hidden_layers + 2






       def 	__lowerCAmelCase     (		self   )					->Union[str, Any]:
           SCREAMING_SNAKE_CASE				:				str				      = ids_tensor([self.batch_size, self.seq_length]				,       self.vocab_size   )

           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = None
           if self.use_input_mask:
               SCREAMING_SNAKE_CASE				:				Optional[Any]				      = ids_tensor([self.batch_size, self.seq_length]				,       vocab_size=2   )

           SCREAMING_SNAKE_CASE				:				List[str]				      = None
           if self.use_token_type_ids:
               SCREAMING_SNAKE_CASE				:				Dict				      = ids_tensor([self.batch_size, self.seq_length]				,       self.type_vocab_size   )

           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = None
           SCREAMING_SNAKE_CASE				:				Tuple				      = None
           SCREAMING_SNAKE_CASE				:				List[str]				      = None
           if self.use_labels:
               SCREAMING_SNAKE_CASE				:				Tuple				      = ids_tensor([self.batch_size]				,       self.type_sequence_label_size   )
               SCREAMING_SNAKE_CASE				:				str				      = ids_tensor([self.batch_size, self.seq_length]				,       self.num_labels   )
               SCREAMING_SNAKE_CASE				:				Any				      = ids_tensor([self.batch_size]				,       self.num_choices   )
               SCREAMING_SNAKE_CASE				:				Optional[Any]				      = ids_tensor([self.batch_size, self.seq_length]				,       1   )

           SCREAMING_SNAKE_CASE				:				Tuple				      = self.get_config()

           return (
               config,
               input_ids,
               token_type_ids,
               input_mask,
               sequence_labels,
               token_labels,
               choice_labels,
               fake_token_labels,
           )






       def 	__lowerCAmelCase     (		self   )					->str:
           return FunnelConfig(
               vocab_size=self.vocab_size				,       block_sizes=self.block_sizes				,       num_decoder_layers=self.num_decoder_layers				,       d_model=self.d_model				,       n_head=self.n_head				,       d_head=self.d_head				,       d_inner=self.d_inner				,       hidden_act=self.hidden_act				,       hidden_dropout=self.hidden_dropout				,       attention_dropout=self.attention_dropout				,       activation_dropout=self.activation_dropout				,       max_position_embeddings=self.max_position_embeddings				,       type_vocab_size=self.type_vocab_size				,       initializer_std=self.initializer_std				,       )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       )					->Optional[Any]:
           SCREAMING_SNAKE_CASE				:				List[Any]				      = FunnelModel(config=_lowerCamelCase   )
           model.to(_lowerCamelCase   )
           model.eval()
           SCREAMING_SNAKE_CASE				:				Dict				      = model(_lowerCamelCase				,       attention_mask=_lowerCamelCase				,       token_type_ids=_lowerCamelCase   )
           SCREAMING_SNAKE_CASE				:				List[str]				      = model(_lowerCamelCase				,       token_type_ids=_lowerCamelCase   )
           SCREAMING_SNAKE_CASE				:				Optional[int]				      = model(_lowerCamelCase   )
           self.parent.assertEqual(result.last_hidden_state.shape				,       (self.batch_size, self.seq_length, self.d_model)   )

           SCREAMING_SNAKE_CASE				:				int				      = False
           SCREAMING_SNAKE_CASE				:				List[Any]				      = model(_lowerCamelCase   )
           self.parent.assertEqual(result.last_hidden_state.shape				,       (self.batch_size, self.seq_length, self.d_model)   )

           SCREAMING_SNAKE_CASE				:				str				      = False
           SCREAMING_SNAKE_CASE				:				List[str]				      = model(_lowerCamelCase   )
           self.parent.assertEqual(result.last_hidden_state.shape				,       (self.batch_size, self.seq_length, self.d_model)   )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       )					->Any:
           SCREAMING_SNAKE_CASE				:				Optional[int]				      = FunnelBaseModel(config=_lowerCamelCase   )
           model.to(_lowerCamelCase   )
           model.eval()
           SCREAMING_SNAKE_CASE				:				Dict				      = model(_lowerCamelCase				,       attention_mask=_lowerCamelCase				,       token_type_ids=_lowerCamelCase   )
           SCREAMING_SNAKE_CASE				:				str				      = model(_lowerCamelCase				,       token_type_ids=_lowerCamelCase   )
           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = model(_lowerCamelCase   )
           self.parent.assertEqual(result.last_hidden_state.shape				,       (self.batch_size, 2, self.d_model)   )

           SCREAMING_SNAKE_CASE				:				Optional[int]				      = False
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = model(_lowerCamelCase   )
           self.parent.assertEqual(result.last_hidden_state.shape				,       (self.batch_size, 3, self.d_model)   )

           SCREAMING_SNAKE_CASE				:				List[Any]				      = False
           SCREAMING_SNAKE_CASE				:				Tuple				      = model(_lowerCamelCase   )
           self.parent.assertEqual(result.last_hidden_state.shape				,       (self.batch_size, 2, self.d_model)   )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       )					->int:
           SCREAMING_SNAKE_CASE				:				int				      = self.num_labels
           SCREAMING_SNAKE_CASE				:				int				      = FunnelForPreTraining(config=_lowerCamelCase   )
           model.to(_lowerCamelCase   )
           model.eval()
           SCREAMING_SNAKE_CASE				:				str				      = model(_lowerCamelCase				,       attention_mask=_lowerCamelCase				,       token_type_ids=_lowerCamelCase				,       labels=_lowerCamelCase   )
           self.parent.assertEqual(result.logits.shape				,       (self.batch_size, self.seq_length)   )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       )					->List[str]:
           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = FunnelForMaskedLM(config=_lowerCamelCase   )
           model.to(_lowerCamelCase   )
           model.eval()
           SCREAMING_SNAKE_CASE				:				Optional[int]				      = model(_lowerCamelCase				,       attention_mask=_lowerCamelCase				,       token_type_ids=_lowerCamelCase				,       labels=_lowerCamelCase   )
           self.parent.assertEqual(result.logits.shape				,       (self.batch_size, self.seq_length, self.vocab_size)   )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       )					->List[str]:
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = self.num_labels
           SCREAMING_SNAKE_CASE				:				Any				      = FunnelForSequenceClassification(_lowerCamelCase   )
           model.to(_lowerCamelCase   )
           model.eval()
           SCREAMING_SNAKE_CASE				:				int				      = model(_lowerCamelCase				,       attention_mask=_lowerCamelCase				,       token_type_ids=_lowerCamelCase				,       labels=_lowerCamelCase   )
           self.parent.assertEqual(result.logits.shape				,       (self.batch_size, self.num_labels)   )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       )					->str:
           SCREAMING_SNAKE_CASE				:				Tuple				      = self.num_choices
           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = FunnelForMultipleChoice(config=_lowerCamelCase   )
           model.to(_lowerCamelCase   )
           model.eval()
           SCREAMING_SNAKE_CASE				:				Tuple				      = input_ids.unsqueeze(1   ).expand(-1				,       self.num_choices				,       -1   ).contiguous()
           SCREAMING_SNAKE_CASE				:				Dict				      = token_type_ids.unsqueeze(1   ).expand(-1				,       self.num_choices				,       -1   ).contiguous()
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = input_mask.unsqueeze(1   ).expand(-1				,       self.num_choices				,       -1   ).contiguous()
           SCREAMING_SNAKE_CASE				:				str				      = model(
               _lowerCamelCase				,       attention_mask=_lowerCamelCase				,       token_type_ids=_lowerCamelCase				,       labels=_lowerCamelCase				,       )
           self.parent.assertEqual(result.logits.shape				,       (self.batch_size, self.num_choices)   )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       )					->Tuple:
           SCREAMING_SNAKE_CASE				:				str				      = self.num_labels
           SCREAMING_SNAKE_CASE				:				int				      = FunnelForTokenClassification(config=_lowerCamelCase   )
           model.to(_lowerCamelCase   )
           model.eval()
           SCREAMING_SNAKE_CASE				:				Dict				      = model(_lowerCamelCase				,       attention_mask=_lowerCamelCase				,       token_type_ids=_lowerCamelCase				,       labels=_lowerCamelCase   )
           self.parent.assertEqual(result.logits.shape				,       (self.batch_size, self.seq_length, self.num_labels)   )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       )					->Tuple:
           SCREAMING_SNAKE_CASE				:				List[str]				      = FunnelForQuestionAnswering(config=_lowerCamelCase   )
           model.to(_lowerCamelCase   )
           model.eval()
           SCREAMING_SNAKE_CASE				:				int				      = model(
               _lowerCamelCase				,       attention_mask=_lowerCamelCase				,       token_type_ids=_lowerCamelCase				,       start_positions=_lowerCamelCase				,       end_positions=_lowerCamelCase				,       )
           self.parent.assertEqual(result.start_logits.shape				,       (self.batch_size, self.seq_length)   )
           self.parent.assertEqual(result.end_logits.shape				,       (self.batch_size, self.seq_length)   )






       def 	__lowerCAmelCase     (		self   )					->str:
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = self.prepare_config_and_inputs()
           (
               (
               SCREAMING_SNAKE_CASE
           )      ,							(
               SCREAMING_SNAKE_CASE
           )      ,							(
               SCREAMING_SNAKE_CASE
           )      ,							(
               SCREAMING_SNAKE_CASE
           )      ,							(
               SCREAMING_SNAKE_CASE
           )      ,							(
               SCREAMING_SNAKE_CASE
           )      ,							(
               SCREAMING_SNAKE_CASE
           )      ,							(
               SCREAMING_SNAKE_CASE
           )      ,							
           )				:				Optional[int]				      = config_and_inputs
           SCREAMING_SNAKE_CASE				:				int				      = {'''input_ids''': input_ids, '''token_type_ids''': token_type_ids, '''attention_mask''': input_mask}
           return config, inputs_dict






@require_torch
class     a_       (			a__				,    a__				,    unittest.TestCase							):



       """simple docstring"""
       __SCREAMING_SNAKE_CASE       :					str						=  False
       __SCREAMING_SNAKE_CASE       :					List[str]						=  False
       __SCREAMING_SNAKE_CASE       :					Tuple						=  (
           (
               FunnelModel,
               FunnelForMaskedLM,
               FunnelForPreTraining,
               FunnelForQuestionAnswering,
               FunnelForTokenClassification,
           )
           if is_torch_available()
           else ()
       )
       __SCREAMING_SNAKE_CASE       :					Tuple						=  (
           {
               'feature-extraction': (FunnelBaseModel, FunnelModel),
               'fill-mask': FunnelForMaskedLM,
               'question-answering': FunnelForQuestionAnswering,
               'text-classification': FunnelForSequenceClassification,
               'token-classification': FunnelForTokenClassification,
               'zero-shot': FunnelForSequenceClassification,
           }
           if is_torch_available()
           else {}
       )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase=False   )					->str:
           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = super()._prepare_for_class(_lowerCamelCase				,       _lowerCamelCase				,       return_labels=_lowerCamelCase   )

           if return_labels:
               if model_class in get_values(_lowerCamelCase   ):
                   SCREAMING_SNAKE_CASE				:				List[Any]				      = torch.zeros(
                       (self.model_tester.batch_size, self.model_tester.seq_length)				,       dtype=torch.long				,       device=_lowerCamelCase   )
           return inputs_dict






       def 	__lowerCAmelCase     (		self   )					->int:
           SCREAMING_SNAKE_CASE				:				List[Any]				      = FunnelModelTester(self   )
           SCREAMING_SNAKE_CASE				:				Any				      = ConfigTester(self				,       config_class=_lowerCamelCase   )






       def 	__lowerCAmelCase     (		self   )					->int:
           self.config_tester.run_common_tests()






       def 	__lowerCAmelCase     (		self   )					->Optional[Any]:
           SCREAMING_SNAKE_CASE				:				List[Any]				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_model(*_lowerCamelCase   )






       def 	__lowerCAmelCase     (		self   )					->int:
           SCREAMING_SNAKE_CASE				:				Any				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_for_pretraining(*_lowerCamelCase   )






       def 	__lowerCAmelCase     (		self   )					->Dict:
           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_for_masked_lm(*_lowerCamelCase   )






       def 	__lowerCAmelCase     (		self   )					->Tuple:
           SCREAMING_SNAKE_CASE				:				Any				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_for_token_classification(*_lowerCamelCase   )






       def 	__lowerCAmelCase     (		self   )					->Tuple:
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_for_question_answering(*_lowerCamelCase   )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase   )					->List[Any]:
           if hasattr(_lowerCamelCase				,       '''weight'''   ) and module.weight is not None:
               module.weight.data.fill_(3   )
           if hasattr(_lowerCamelCase				,       '''bias'''   ) and module.bias is not None:
               module.bias.data.fill_(3   )

           for param in ["r_w_bias", "r_r_bias", "r_kernel", "r_s_bias", "seg_embed"]:
               if hasattr(_lowerCamelCase				,       _lowerCamelCase   ) and getattr(_lowerCamelCase				,       _lowerCamelCase   ) is not None:
                   SCREAMING_SNAKE_CASE				:				int				      = getattr(_lowerCamelCase				,       _lowerCamelCase   )
                   weight.data.fill_(3   )






@require_torch
class     a_       (			a__				,    unittest.TestCase							):



       """simple docstring"""
       __SCREAMING_SNAKE_CASE       :					List[str]						=  False
       __SCREAMING_SNAKE_CASE       :					Any						=  False
       __SCREAMING_SNAKE_CASE       :					Dict						=  (
           (FunnelBaseModel, FunnelForMultipleChoice, FunnelForSequenceClassification) if is_torch_available() else ()
       )






       def 	__lowerCAmelCase     (		self   )					->Dict:
           SCREAMING_SNAKE_CASE				:				str				      = FunnelModelTester(self				,       base=_lowerCamelCase   )
           SCREAMING_SNAKE_CASE				:				Dict				      = ConfigTester(self				,       config_class=_lowerCamelCase   )






       def 	__lowerCAmelCase     (		self   )					->Union[str, Any]:
           self.config_tester.run_common_tests()






       def 	__lowerCAmelCase     (		self   )					->Any:
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_base_model(*_lowerCamelCase   )






       def 	__lowerCAmelCase     (		self   )					->Tuple:
           SCREAMING_SNAKE_CASE				:				Tuple				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_for_sequence_classification(*_lowerCamelCase   )






       def 	__lowerCAmelCase     (		self   )					->Dict:
           SCREAMING_SNAKE_CASE				:				Any				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_for_multiple_choice(*_lowerCamelCase   )






       def 	__lowerCAmelCase     (		self   )					->List[str]:
           SCREAMING_SNAKE_CASE      ,							SCREAMING_SNAKE_CASE				:				Tuple				      = self.model_tester.prepare_config_and_inputs_for_common()
           SCREAMING_SNAKE_CASE				:				int				      = True

           for model_class in self.all_model_classes:
               if model_class.__name__ == "FunnelBaseModel":
                   continue
               SCREAMING_SNAKE_CASE				:				List[str]				      = model_class(_lowerCamelCase   )
               model.to(_lowerCamelCase   )
               model.train()
               SCREAMING_SNAKE_CASE				:				List[str]				      = self._prepare_for_class(_lowerCamelCase				,       _lowerCamelCase				,       return_labels=_lowerCamelCase   )
               SCREAMING_SNAKE_CASE				:				int				      = model(**_lowerCamelCase   ).loss
               loss.backward()






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase   )					->Union[str, Any]:
           if hasattr(_lowerCamelCase				,       '''weight'''   ) and module.weight is not None:
               module.weight.data.fill_(3   )
           if hasattr(_lowerCamelCase				,       '''bias'''   ) and module.bias is not None:
               module.bias.data.fill_(3   )

           for param in ["r_w_bias", "r_r_bias", "r_kernel", "r_s_bias", "seg_embed"]:
               if hasattr(_lowerCamelCase				,       _lowerCamelCase   ) and getattr(_lowerCamelCase				,       _lowerCamelCase   ) is not None:
                   SCREAMING_SNAKE_CASE				:				List[str]				      = getattr(_lowerCamelCase				,       _lowerCamelCase   )
                   weight.data.fill_(3   )






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



       """simple docstring"""






       def 	__lowerCAmelCase     (		self   )					->Tuple:
           SCREAMING_SNAKE_CASE				:				List[Any]				      = 13
           SCREAMING_SNAKE_CASE				:				List[str]				      = 7
           SCREAMING_SNAKE_CASE				:				Any				      = torch.arange(0				,       batch_size * sequence_length   ).long().reshape(_lowerCamelCase				,       _lowerCamelCase   )
           SCREAMING_SNAKE_CASE				:				List[Any]				      = [0, 1, 2, 3, 4, 5, 6, 4, 1, 3, 5, 0, 1]
           SCREAMING_SNAKE_CASE				:				Tuple				      = torch.tensor([[2] + [0] * a + [1] * (sequence_length - a - 1) for a in lengths]   )

           SCREAMING_SNAKE_CASE				:				Tuple				      = FunnelModel.from_pretrained('''sgugger/funnel-random-tiny'''   )
           SCREAMING_SNAKE_CASE				:				Any				      = model(_lowerCamelCase				,       token_type_ids=_lowerCamelCase   )[0].abs()

           SCREAMING_SNAKE_CASE				:				str				      = torch.tensor(2_3_4_4.8_3_5_2   )
           SCREAMING_SNAKE_CASE				:				Any				      = torch.tensor(0.8_0_5_2   )
           self.assertTrue(torch.allclose(output.sum()				,       _lowerCamelCase				,       atol=1e-4   )   )
           self.assertTrue(torch.allclose(output.mean()				,       _lowerCamelCase				,       atol=1e-4   )   )

           SCREAMING_SNAKE_CASE				:				List[Any]				      = torch.tensor([[1] * 7, [1] * 4 + [0] * 3] * 6 + [[0, 1, 1, 0, 0, 1, 1]]   )
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = model(_lowerCamelCase				,       attention_mask=_lowerCamelCase				,       token_type_ids=_lowerCamelCase   )[0].abs()

           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = torch.tensor(2_3_4_3.8_4_2_5   )
           SCREAMING_SNAKE_CASE				:				Dict				      = torch.tensor(0.8_0_4_9   )
           self.assertTrue(torch.allclose(output.sum()				,       _lowerCamelCase				,       atol=1e-4   )   )
           self.assertTrue(torch.allclose(output.mean()				,       _lowerCamelCase				,       atol=1e-4   )   )






       @slow
       def 	__lowerCAmelCase     (		self   )					->Optional[Any]:
           SCREAMING_SNAKE_CASE				:				str				      = FunnelTokenizer.from_pretrained('''huggingface/funnel-small'''   )
           SCREAMING_SNAKE_CASE				:				Any				      = FunnelModel.from_pretrained('''huggingface/funnel-small'''   )
           SCREAMING_SNAKE_CASE				:				Tuple				      = tokenizer('''Hello! I am the Funnel Transformer model.'''				,       return_tensors='''pt'''   )
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = model(**_lowerCamelCase   )[0]

           SCREAMING_SNAKE_CASE				:				Dict				      = torch.tensor(2_3_5.7_2_4_6   )
           SCREAMING_SNAKE_CASE				:				Dict				      = torch.tensor(0.0_2_5_6   )
           self.assertTrue(torch.allclose(output.sum()				,       _lowerCamelCase				,       atol=1e-4   )   )
           self.assertTrue(torch.allclose(output.mean()				,       _lowerCamelCase				,       atol=1e-4   )   )
