




'''simple docstring'''






import argparse
import logging
import os
from datetime import datetime

import numpy as np
import torch
from torch import nn
from torch.utils.data import DataLoader, SequentialSampler, Subset
from torch.utils.data.distributed import DistributedSampler
from tqdm import tqdm

import transformers
from transformers import (
    AutoConfig,
    AutoModelForSequenceClassification,
    AutoTokenizer,
    GlueDataset,
    default_data_collator,
    glue_compute_metrics,
    glue_output_modes,
    glue_processors,
    set_seed,
)
from transformers.trainer_utils import is_main_process


A_ 			=		logging.getLogger(__name__)






def 		UpperCamelCase__			(		__SCREAMING_SNAKE_CASE		)						->      List[Any]:
      snake_case__					:      Tuple  			=						p * torch.log(__SCREAMING_SNAKE_CASE		)
      snake_case__					:      str  			=						0
      return -plogp.sum(dim=-1		)






def 		UpperCamelCase__			(		__SCREAMING_SNAKE_CASE		)						->      Dict:
      logger.info('lv, h >\t' + '\t'.join(f"{x + 1}" for x in range(len(__SCREAMING_SNAKE_CASE		)		)		)		)
      for row in range(len(__SCREAMING_SNAKE_CASE		)		):
            if tensor.dtype != torch.long:
                  logger.info(f"layer {row + 1}:\t" + '\t'.join(f"{x:.5f}" for x in tensor[row].cpu().data		)		)
            else:
                  logger.info(f"layer {row + 1}:\t" + '\t'.join(f"{x:d}" for x in tensor[row].cpu().data		)		)






def 		UpperCamelCase__			(		__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE=True							,			__SCREAMING_SNAKE_CASE=True							,			__SCREAMING_SNAKE_CASE=None							,			__SCREAMING_SNAKE_CASE=False		)						->      Optional[Any]:
      snake_case__			,       snake_case__					:      List[str]  			=						model.config.num_hidden_layers, model.config.num_attention_heads
      snake_case__					:      Dict  			=						torch.zeros(__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE		).to(args.device		)
      snake_case__					:      Optional[Any]  			=						torch.zeros(__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE		).to(args.device		)

      if head_mask is None:
            snake_case__					:      Optional[Any]  			=						torch.ones(__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE		).to(args.device		)

      head_mask.requires_grad_(requires_grad=__SCREAMING_SNAKE_CASE		)
      # If actually pruned attention multi-head, set head mask to None to avoid shape mismatch
      if actually_pruned:
            snake_case__					:      Optional[int]  			=						None

      snake_case__					:      Any  			=						None
      snake_case__					:      Union[str, Any]  			=						None
      snake_case__					:      Optional[int]  			=						0.0

      for step, inputs in enumerate(tqdm(__SCREAMING_SNAKE_CASE							,			desc='Iteration'							,			disable=args.local_rank not in [-1, 0]		)		):
            for k, v in inputs.items():
                  snake_case__					:      Optional[Any]  			=						v.to(args.device		)

            # Do a forward pass (not with torch.no_grad() since we need gradients for importance score - see below)
            snake_case__					:      Optional[Any]  			=						model(**__SCREAMING_SNAKE_CASE							,			head_mask=__SCREAMING_SNAKE_CASE		)
            snake_case__			,       snake_case__			,       snake_case__					:      Tuple  			=						(
                outputs[0],
                outputs[1],
                outputs[-1],
            )  # Loss and logits are the first, attention the last
            loss.backward()  # Backpropagate to populate the gradients in the head mask

            if compute_entropy:
                  for layer, attn in enumerate(__SCREAMING_SNAKE_CASE		):
                        snake_case__					:      List[Any]  			=						entropy(attn.detach()		) * inputs['attention_mask'].float().unsqueeze(1		)
                        attn_entropy[layer] += masked_entropy.sum(-1		).sum(0		).detach()

            if compute_importance:
                  head_importance += head_mask.grad.abs().detach()

            # Also store our logits/labels if we want to compute metrics afterwards
            if preds is None:
                  snake_case__					:      int  			=						logits.detach().cpu().numpy()
                  snake_case__					:      Dict  			=						inputs['labels'].detach().cpu().numpy()
            else:
                  snake_case__					:      str  			=						np.append(__SCREAMING_SNAKE_CASE							,			logits.detach().cpu().numpy()							,			axis=0		)
                  snake_case__					:      Optional[Any]  			=						np.append(__SCREAMING_SNAKE_CASE							,			inputs['labels'].detach().cpu().numpy()							,			axis=0		)

            tot_tokens += inputs["attention_mask"].float().detach().sum().data

      # Normalize
      attn_entropy /= tot_tokens
      head_importance /= tot_tokens
      # Layerwise importance normalization
      if not args.dont_normalize_importance_by_layer:
            snake_case__					:      List[str]  			=						2
            snake_case__					:      Union[str, Any]  			=						torch.pow(torch.pow(__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE		).sum(-1		)							,			1 / exponent		)
            head_importance /= norm_by_layer.unsqueeze(-1		) + 1E-20

      if not args.dont_normalize_global_importance:
            snake_case__					:      List[str]  			=						(head_importance - head_importance.min()) / (head_importance.max() - head_importance.min())

      # Print/save matrices
      np.save(os.path.join(args.output_dir							,			'attn_entropy.npy'		)							,			attn_entropy.detach().cpu().numpy()		)
      np.save(os.path.join(args.output_dir							,			'head_importance.npy'		)							,			head_importance.detach().cpu().numpy()		)

      logger.info('Attention entropies'		)
      print_ad_tensor(__SCREAMING_SNAKE_CASE		)
      logger.info('Head importance scores'		)
      print_ad_tensor(__SCREAMING_SNAKE_CASE		)
      logger.info('Head ranked by importance scores'		)
      snake_case__					:      Union[str, Any]  			=						torch.zeros(head_importance.numel()							,			dtype=torch.long							,			device=args.device		)
      snake_case__					:      List[str]  			=						torch.arange(
          head_importance.numel()							,			device=args.device		)
      snake_case__					:      List[Any]  			=						head_ranks.view_as(__SCREAMING_SNAKE_CASE		)
      print_ad_tensor(__SCREAMING_SNAKE_CASE		)

      return attn_entropy, head_importance, preds, labels






def 		UpperCamelCase__			(		__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE		)						->      Tuple:
      snake_case__			,       snake_case__			,       snake_case__			,       snake_case__					:      Any  			=						compute_heads_importance(__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE							,			compute_entropy=__SCREAMING_SNAKE_CASE		)
      snake_case__					:      str  			=						np.argmax(__SCREAMING_SNAKE_CASE							,			axis=1		) if args.output_mode == 'classification' else np.squeeze(__SCREAMING_SNAKE_CASE		)
      snake_case__					:      List[str]  			=						glue_compute_metrics(args.task_name							,			__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE		)[args.metric_name]
      logger.info('Pruning: original score: %f, threshold: %f'							,			__SCREAMING_SNAKE_CASE							,			original_score * args.masking_threshold		)

      snake_case__					:      Optional[Any]  			=						torch.ones_like(__SCREAMING_SNAKE_CASE		)
      snake_case__					:      Optional[Any]  			=						max(1							,			int(new_head_mask.numel() * args.masking_amount		)		)

      snake_case__					:      List[Any]  			=						original_score
      while current_score >= original_score * args.masking_threshold:
            snake_case__					:      List[Any]  			=						new_head_mask.clone()  # save current head mask
            # heads from least important to most - keep only not-masked heads
            snake_case__					:      str  			=						float('Inf'		)
            snake_case__					:      Dict  			=						head_importance.view(-1		).sort()[1]

            if len(__SCREAMING_SNAKE_CASE		) <= num_to_mask:
                  break

            # mask heads
            snake_case__					:      List[Any]  			=						current_heads_to_mask[:num_to_mask]
            logger.info('Heads to mask: %s'							,			str(current_heads_to_mask.tolist()		)		)
            snake_case__					:      Dict  			=						new_head_mask.view(-1		)
            snake_case__					:      Dict  			=						0.0
            snake_case__					:      Optional[Any]  			=						new_head_mask.view_as(__SCREAMING_SNAKE_CASE		)
            snake_case__					:      List[Any]  			=						new_head_mask.clone().detach()
            print_ad_tensor(__SCREAMING_SNAKE_CASE		)

            # Compute metric and head importance again
            snake_case__			,       snake_case__			,       snake_case__			,       snake_case__					:      Any  			=						compute_heads_importance(
                __SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE							,			compute_entropy=__SCREAMING_SNAKE_CASE							,			head_mask=__SCREAMING_SNAKE_CASE		)
            snake_case__					:      Dict  			=						np.argmax(__SCREAMING_SNAKE_CASE							,			axis=1		) if args.output_mode == 'classification' else np.squeeze(__SCREAMING_SNAKE_CASE		)
            snake_case__					:      Tuple  			=						glue_compute_metrics(args.task_name							,			__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE		)[args.metric_name]
            logger.info(
                'Masking: current score: %f, remaining heads %d (%.1f percents)'							,			__SCREAMING_SNAKE_CASE							,			new_head_mask.sum()							,			new_head_mask.sum() / new_head_mask.numel() * 100							,			)

      logger.info('Final head mask'		)
      print_ad_tensor(__SCREAMING_SNAKE_CASE		)
      np.save(os.path.join(args.output_dir							,			'head_mask.npy'		)							,			head_mask.detach().cpu().numpy()		)

      return head_mask






def 		UpperCamelCase__			(		__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE		)						->      Any:
      snake_case__					:      List[str]  			=						datetime.now()
      snake_case__			,       snake_case__			,       snake_case__			,       snake_case__					:      str  			=						compute_heads_importance(
          __SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE							,			compute_entropy=__SCREAMING_SNAKE_CASE							,			compute_importance=__SCREAMING_SNAKE_CASE							,			head_mask=__SCREAMING_SNAKE_CASE		)
      snake_case__					:      List[Any]  			=						np.argmax(__SCREAMING_SNAKE_CASE							,			axis=1		) if args.output_mode == 'classification' else np.squeeze(__SCREAMING_SNAKE_CASE		)
      snake_case__					:      int  			=						glue_compute_metrics(args.task_name							,			__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE		)[args.metric_name]
      snake_case__					:      Optional[int]  			=						datetime.now() - before_time

      snake_case__					:      Union[str, Any]  			=						sum(p.numel() for p in model.parameters()		)
      snake_case__					:      List[str]  			=						{
          layer: (1 - head_mask[layer].long()).nonzero().squeeze().tolist() for layer in range(len(__SCREAMING_SNAKE_CASE		)		)
      }

      assert sum(len(__SCREAMING_SNAKE_CASE		) for h in heads_to_prune.values()		) == (1 - head_mask.long()).sum().item()
      model.prune_heads(__SCREAMING_SNAKE_CASE		)
      snake_case__					:      Union[str, Any]  			=						sum(p.numel() for p in model.parameters()		)

      snake_case__					:      List[str]  			=						datetime.now()
      snake_case__			,       snake_case__			,       snake_case__			,       snake_case__					:      Optional[Any]  			=						compute_heads_importance(
          __SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE							,			compute_entropy=__SCREAMING_SNAKE_CASE							,			compute_importance=__SCREAMING_SNAKE_CASE							,			head_mask=__SCREAMING_SNAKE_CASE							,			actually_pruned=__SCREAMING_SNAKE_CASE							,			)
      snake_case__					:      Any  			=						np.argmax(__SCREAMING_SNAKE_CASE							,			axis=1		) if args.output_mode == 'classification' else np.squeeze(__SCREAMING_SNAKE_CASE		)
      snake_case__					:      Dict  			=						glue_compute_metrics(args.task_name							,			__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE		)[args.metric_name]
      snake_case__					:      Dict  			=						datetime.now() - before_time

      logger.info(
          'Pruning: original num of params: %.2e, after pruning %.2e (%.1f percents)'							,			__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE							,			pruned_num_params / original_num_params * 100							,			)
      logger.info('Pruning: score with masking: %f score with pruning: %f'							,			__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE		)
      logger.info('Pruning: speed ratio (new timing / original timing): %f percents'							,			original_time / new_time * 100		)






def 		UpperCamelCase__			(		)						->      Any:
      snake_case__					:      Tuple  			=						argparse.ArgumentParser()
      # Required parameters
      parser.add_argument(
          '--data_dir'							,			default=__SCREAMING_SNAKE_CASE							,			type=__SCREAMING_SNAKE_CASE							,			required=__SCREAMING_SNAKE_CASE							,			help='The input data dir. Should contain the .tsv files (or other data files) for the task.'							,			)
      parser.add_argument(
          '--model_name_or_path'							,			default=__SCREAMING_SNAKE_CASE							,			type=__SCREAMING_SNAKE_CASE							,			required=__SCREAMING_SNAKE_CASE							,			help='Path to pretrained model or model identifier from huggingface.co/models'							,			)
      parser.add_argument(
          '--task_name'							,			default=__SCREAMING_SNAKE_CASE							,			type=__SCREAMING_SNAKE_CASE							,			required=__SCREAMING_SNAKE_CASE							,			help='The name of the task to train selected in the list: ' + ', '.join(glue_processors.keys()		)							,			)
      parser.add_argument(
          '--output_dir'							,			default=__SCREAMING_SNAKE_CASE							,			type=__SCREAMING_SNAKE_CASE							,			required=__SCREAMING_SNAKE_CASE							,			help='The output directory where the model predictions and checkpoints will be written.'							,			)

      # Other parameters
      parser.add_argument(
          '--config_name'							,			default=''							,			type=__SCREAMING_SNAKE_CASE							,			help='Pretrained config name or path if not the same as model_name_or_path'							,			)
      parser.add_argument(
          '--tokenizer_name'							,			default=''							,			type=__SCREAMING_SNAKE_CASE							,			help='Pretrained tokenizer name or path if not the same as model_name_or_path'							,			)
      parser.add_argument(
          '--cache_dir'							,			default=__SCREAMING_SNAKE_CASE							,			type=__SCREAMING_SNAKE_CASE							,			help='Where do you want to store the pre-trained models downloaded from huggingface.co'							,			)
      parser.add_argument(
          '--data_subset'							,			type=__SCREAMING_SNAKE_CASE							,			default=-1							,			help='If > 0: limit the data to a subset of data_subset instances.'		)
      parser.add_argument(
          '--overwrite_output_dir'							,			action='store_true'							,			help='Whether to overwrite data in output directory'		)
      parser.add_argument(
          '--overwrite_cache'							,			action='store_true'							,			help='Overwrite the cached training and evaluation sets'		)

      parser.add_argument(
          '--dont_normalize_importance_by_layer'							,			action='store_true'							,			help='Don\'t normalize importance score by layers'		)
      parser.add_argument(
          '--dont_normalize_global_importance'							,			action='store_true'							,			help='Don\'t normalize all importance scores between 0 and 1'							,			)

      parser.add_argument(
          '--try_masking'							,			action='store_true'							,			help='Whether to try to mask head until a threshold of accuracy.'		)
      parser.add_argument(
          '--masking_threshold'							,			default=0.9							,			type=__SCREAMING_SNAKE_CASE							,			help='masking threshold in term of metrics (stop masking when metric < threshold * original metric value).'							,			)
      parser.add_argument(
          '--masking_amount'							,			default=0.1							,			type=__SCREAMING_SNAKE_CASE							,			help='Amount to heads to masking at each masking step.'		)
      parser.add_argument('--metric_name'							,			default='acc'							,			type=__SCREAMING_SNAKE_CASE							,			help='Metric to use for head masking.'		)

      parser.add_argument(
          '--max_seq_length'							,			default=128							,			type=__SCREAMING_SNAKE_CASE							,			help=(
              'The maximum total input sequence length after WordPiece tokenization. \n'
              'Sequences longer than this will be truncated, sequences shorter padded.'
          )							,			)
      parser.add_argument('--batch_size'							,			default=1							,			type=__SCREAMING_SNAKE_CASE							,			help='Batch size.'		)

      parser.add_argument('--seed'							,			type=__SCREAMING_SNAKE_CASE							,			default=42		)
      parser.add_argument('--local_rank'							,			type=__SCREAMING_SNAKE_CASE							,			default=-1							,			help='local_rank for distributed training on gpus'		)
      parser.add_argument('--no_cuda'							,			action='store_true'							,			help='Whether not to use CUDA when available'		)
      parser.add_argument('--server_ip'							,			type=__SCREAMING_SNAKE_CASE							,			default=''							,			help='Can be used for distant debugging.'		)
      parser.add_argument('--server_port'							,			type=__SCREAMING_SNAKE_CASE							,			default=''							,			help='Can be used for distant debugging.'		)
      snake_case__					:      Any  			=						parser.parse_args()

      if args.server_ip and args.server_port:
            # Distant debugging - see https://code.visualstudio.com/docs/python/debugging#_attach-to-a-local-script
            import ptvsd

            print('Waiting for debugger attach'		)
            ptvsd.enable_attach(address=(args.server_ip, args.server_port)							,			redirect_output=__SCREAMING_SNAKE_CASE		)
            ptvsd.wait_for_attach()

      # Setup devices and distributed training
      if args.local_rank == -1 or args.no_cuda:
            snake_case__					:      Optional[int]  			=						torch.device('cuda' if torch.cuda.is_available() and not args.no_cuda else 'cpu'		)
            snake_case__					:      str  			=						0 if args.no_cuda else torch.cuda.device_count()
      else:
            torch.cuda.set_device(args.local_rank		)
            snake_case__					:      Tuple  			=						torch.device('cuda'							,			args.local_rank		)
            snake_case__					:      Dict  			=						1
            torch.distributed.init_process_group(backend='nccl'		)  # Initializes the distributed backend

      # Setup logging
      logging.basicConfig(level=logging.INFO if args.local_rank in [-1, 0] else logging.WARN		)
      logger.info('device: {} n_gpu: {}, distributed: {}'.format(args.device							,			args.n_gpu							,			bool(args.local_rank != -1		)		)		)
      # Set the verbosity to info of the Transformers logger (on main process only):
      if is_main_process(args.local_rank		):
            transformers.utils.logging.set_verbosity_info()
            transformers.utils.logging.enable_default_handler()
            transformers.utils.logging.enable_explicit_format()

      # Set seeds
      set_seed(args.seed		)

      # Prepare GLUE task
      snake_case__					:      List[str]  			=						args.task_name.lower()
      if args.task_name not in glue_processors:
            raise ValueError('Task not found: %s' % (args.task_name)		)
      snake_case__					:      Any  			=						glue_processors[args.task_name]()
      snake_case__					:      Optional[int]  			=						glue_output_modes[args.task_name]
      snake_case__					:      Dict  			=						processor.get_labels()
      snake_case__					:      str  			=						len(__SCREAMING_SNAKE_CASE		)

      # Load pretrained model and tokenizer
      #
      # Distributed training:
      # The .from_pretrained methods guarantee that only one local process can concurrently
      # download model & vocab.

      snake_case__					:      Union[str, Any]  			=						AutoConfig.from_pretrained(
          args.config_name if args.config_name else args.model_name_or_path							,			num_labels=__SCREAMING_SNAKE_CASE							,			finetuning_task=args.task_name							,			output_attentions=__SCREAMING_SNAKE_CASE							,			cache_dir=args.cache_dir							,			)
      snake_case__					:      Any  			=						AutoTokenizer.from_pretrained(
          args.tokenizer_name if args.tokenizer_name else args.model_name_or_path							,			cache_dir=args.cache_dir							,			)
      snake_case__					:      Optional[int]  			=						AutoModelForSequenceClassification.from_pretrained(
          args.model_name_or_path							,			from_tf=bool('.ckpt' in args.model_name_or_path		)							,			config=__SCREAMING_SNAKE_CASE							,			cache_dir=args.cache_dir							,			)

      # Distributed and parallel training
      model.to(args.device		)
      if args.local_rank != -1:
            snake_case__					:      str  			=						nn.parallel.DistributedDataParallel(
                __SCREAMING_SNAKE_CASE							,			device_ids=[args.local_rank]							,			output_device=args.local_rank							,			find_unused_parameters=__SCREAMING_SNAKE_CASE		)
      elif args.n_gpu > 1:
            snake_case__					:      Any  			=						nn.DataParallel(__SCREAMING_SNAKE_CASE		)

      # Print/save training arguments
      os.makedirs(args.output_dir							,			exist_ok=__SCREAMING_SNAKE_CASE		)
      torch.save(__SCREAMING_SNAKE_CASE							,			os.path.join(args.output_dir							,			'run_args.bin'		)		)
      logger.info('Training/evaluation parameters %s'							,			__SCREAMING_SNAKE_CASE		)

      # Prepare dataset for the GLUE task
      snake_case__					:      Tuple  			=						GlueDataset(__SCREAMING_SNAKE_CASE							,			tokenizer=__SCREAMING_SNAKE_CASE							,			mode='dev'		)
      if args.data_subset > 0:
            snake_case__					:      Tuple  			=						Subset(__SCREAMING_SNAKE_CASE							,			list(range(min(args.data_subset							,			len(__SCREAMING_SNAKE_CASE		)		)		)		)		)
      snake_case__					:      Any  			=						SequentialSampler(__SCREAMING_SNAKE_CASE		) if args.local_rank == -1 else DistributedSampler(__SCREAMING_SNAKE_CASE		)
      snake_case__					:      Union[str, Any]  			=						DataLoader(
          __SCREAMING_SNAKE_CASE							,			sampler=__SCREAMING_SNAKE_CASE							,			batch_size=args.batch_size							,			collate_fn=__SCREAMING_SNAKE_CASE		)

      # Compute head entropy and importance score
      compute_heads_importance(__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE		)

      # Try head masking (set heads to zero until the score goes under a threshole)
      # and head pruning (remove masked heads and see the effect on the network)
      if args.try_masking and args.masking_threshold > 0.0 and args.masking_threshold < 1.0:
            snake_case__					:      Any  			=						mask_heads(__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE		)
            prune_heads(__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE		)


if __name__ == "__main__":
      main()






'''simple docstring'''






import unittest

import numpy as np
import timeout_decorator  # noqa

from transformers import MarianConfig, is_flax_available
from transformers.testing_utils import require_flax, require_sentencepiece, require_tokenizers, slow
from transformers.utils import cached_property

from ...generation.test_flax_utils import FlaxGenerationTesterMixin
from ...test_modeling_flax_common import FlaxModelTesterMixin, ids_tensor


if is_flax_available():
      import os

      # The slow tests are often failing with OOM error on GPU
      # This makes JAX allocate exactly what is needed on demand, and deallocate memory that is no longer needed
      # but will be slower as stated here https://jax.readthedocs.io/en/latest/gpu_memory_allocation.html
      A_ 			=		"platform"

      import jax
      import jax.numpy as jnp

      from transformers import MarianTokenizer
      from transformers.models.marian.modeling_flax_marian import FlaxMarianModel, FlaxMarianMTModel, shift_tokens_right






def 		UpperCamelCase__			(		__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE							,			__SCREAMING_SNAKE_CASE=None							,			__SCREAMING_SNAKE_CASE=None							,			__SCREAMING_SNAKE_CASE=None							,			__SCREAMING_SNAKE_CASE=None							,			__SCREAMING_SNAKE_CASE=None							,			__SCREAMING_SNAKE_CASE=None							,			)						->      Union[str, Any]:
      if attention_mask is None:
            snake_case__					:      Union[str, Any]  			=						np.where(input_ids != config.pad_token_id							,			1							,			0		)
      if decoder_attention_mask is None:
            snake_case__					:      int  			=						np.where(decoder_input_ids != config.pad_token_id							,			1							,			0		)
      if head_mask is None:
            snake_case__					:      Optional[int]  			=						np.ones((config.encoder_layers, config.encoder_attention_heads)		)
      if decoder_head_mask is None:
            snake_case__					:      str  			=						np.ones((config.decoder_layers, config.decoder_attention_heads)		)
      if cross_attn_head_mask is None:
            snake_case__					:      int  			=						np.ones((config.decoder_layers, config.decoder_attention_heads)		)
      return {
          "input_ids": input_ids,
          "decoder_input_ids": decoder_input_ids,
          "attention_mask": attention_mask,
          "decoder_attention_mask": attention_mask,
      }






class 					lowercase_			:





     def __init__(    self    :				Any    ,       __lowerCamelCase    :				Optional[Any]    ,       __lowerCamelCase    :				Optional[Any]=13    ,       __lowerCamelCase    :				str=7    ,       __lowerCamelCase    :				Optional[int]=True    ,       __lowerCamelCase    :				List[str]=False    ,       __lowerCamelCase    :				str=99    ,       __lowerCamelCase    :				List[str]=16    ,       __lowerCamelCase    :				Optional[Any]=2    ,       __lowerCamelCase    :				Tuple=4    ,       __lowerCamelCase    :				Any=4    ,       __lowerCamelCase    :				Optional[int]="gelu"    ,       __lowerCamelCase    :				Optional[Any]=0.1    ,       __lowerCamelCase    :				List[Any]=0.1    ,       __lowerCamelCase    :				Optional[int]=32    ,       __lowerCamelCase    :				Optional[Any]=2    ,       __lowerCamelCase    :				Union[str, Any]=1    ,       __lowerCamelCase    :				Dict=0    ,       __lowerCamelCase    :				Tuple=0.0_2    ,       ):
           snake_case__					:      Tuple  			=						parent
           snake_case__					:      Any  			=						batch_size
           snake_case__					:      Union[str, Any]  			=						seq_length
           snake_case__					:      Optional[Any]  			=						is_training
           snake_case__					:      Union[str, Any]  			=						use_labels
           snake_case__					:      Union[str, Any]  			=						vocab_size
           snake_case__					:      Any  			=						hidden_size
           snake_case__					:      Tuple  			=						num_hidden_layers
           snake_case__					:      Tuple  			=						num_attention_heads
           snake_case__					:      str  			=						intermediate_size
           snake_case__					:      Union[str, Any]  			=						hidden_act
           snake_case__					:      Optional[Any]  			=						hidden_dropout_prob
           snake_case__					:      str  			=						attention_probs_dropout_prob
           snake_case__					:      Optional[int]  			=						max_position_embeddings
           snake_case__					:      Union[str, Any]  			=						eos_token_id
           snake_case__					:      str  			=						pad_token_id
           snake_case__					:      Tuple  			=						bos_token_id
           snake_case__					:      str  			=						initializer_range





     def  _lowerCAmelCase			(    self    :				Optional[int] ):
           snake_case__					:      List[Any]  			=						np.clip(ids_tensor([self.batch_size, self.seq_length - 1]    ,       self.vocab_size )    ,       3    ,       self.vocab_size )
           snake_case__					:      Tuple  			=						np.concatenate((input_ids, 2 * np.ones((self.batch_size, 1)    ,       dtype=np.intaa ))    ,       -1 )

           snake_case__					:      Optional[int]  			=						shift_tokens_right(__lowerCamelCase    ,       1    ,       2 )

           snake_case__					:      Union[str, Any]  			=						MarianConfig(
               vocab_size=self.vocab_size    ,       d_model=self.hidden_size    ,       encoder_layers=self.num_hidden_layers    ,       decoder_layers=self.num_hidden_layers    ,       encoder_attention_heads=self.num_attention_heads    ,       decoder_attention_heads=self.num_attention_heads    ,       encoder_ffn_dim=self.intermediate_size    ,       decoder_ffn_dim=self.intermediate_size    ,       dropout=self.hidden_dropout_prob    ,       attention_dropout=self.attention_probs_dropout_prob    ,       max_position_embeddings=self.max_position_embeddings    ,       eos_token_id=self.eos_token_id    ,       bos_token_id=self.bos_token_id    ,       pad_token_id=self.pad_token_id    ,       initializer_range=self.initializer_range    ,       use_cache=__lowerCamelCase    ,       )
           snake_case__					:      Union[str, Any]  			=						prepare_marian_inputs_dict(__lowerCamelCase    ,       __lowerCamelCase    ,       __lowerCamelCase )
           return config, inputs_dict





     def  _lowerCAmelCase			(    self    :				Optional[int] ):
           snake_case__			,       snake_case__					:      Optional[int]  			=						self.prepare_config_and_inputs()
           return config, inputs_dict





     def  _lowerCAmelCase			(    self    :				Tuple    ,       __lowerCamelCase    :				Union[str, Any]    ,       __lowerCamelCase    :				Dict    ,       __lowerCamelCase    :				Dict ):
           snake_case__					:      Optional[int]  			=						20
           snake_case__					:      str  			=						model_class_name(__lowerCamelCase )

           snake_case__					:      Dict  			=						model.encode(inputs_dict['input_ids'] )

           snake_case__			,       snake_case__					:      int  			=						(
               inputs_dict['decoder_input_ids'],
               inputs_dict['decoder_attention_mask'],
           )

           snake_case__					:      Dict  			=						model.init_cache(decoder_input_ids.shape[0]    ,       __lowerCamelCase    ,       __lowerCamelCase )
           snake_case__					:      Optional[int]  			=						jnp.ones((decoder_input_ids.shape[0], max_decoder_length)    ,       dtype='i4' )

           snake_case__					:      List[str]  			=						jnp.broadcast_to(
               jnp.arange(decoder_input_ids.shape[-1] - 1 )[None, :]    ,       (decoder_input_ids.shape[0], decoder_input_ids.shape[-1] - 1)    ,       )
           snake_case__					:      Dict  			=						model.decode(
               decoder_input_ids[:, :-1]    ,       __lowerCamelCase    ,       decoder_attention_mask=__lowerCamelCase    ,       past_key_values=__lowerCamelCase    ,       decoder_position_ids=__lowerCamelCase    ,       )

           snake_case__					:      List[str]  			=						jnp.array(decoder_input_ids.shape[0] * [[decoder_input_ids.shape[-1] - 1]]    ,       dtype='i4' )
           snake_case__					:      Tuple  			=						model.decode(
               decoder_input_ids[:, -1:]    ,       __lowerCamelCase    ,       decoder_attention_mask=__lowerCamelCase    ,       past_key_values=outputs_cache.past_key_values    ,       decoder_position_ids=__lowerCamelCase    ,       )

           snake_case__					:      Union[str, Any]  			=						model.decode(__lowerCamelCase    ,       __lowerCamelCase )

           snake_case__					:      Tuple  			=						np.max(np.abs((outputs_cache_next[0][:, -1, :5] - outputs[0][:, -1, :5]) ) )
           self.parent.assertTrue(diff < 1E-3    ,       msg=F"Max diff is {diff}" )





     def  _lowerCAmelCase			(    self    :				Tuple    ,       __lowerCamelCase    :				Any    ,       __lowerCamelCase    :				Dict    ,       __lowerCamelCase    :				Optional[int] ):
           snake_case__					:      int  			=						20
           snake_case__					:      Tuple  			=						model_class_name(__lowerCamelCase )

           snake_case__					:      Optional[int]  			=						model.encode(inputs_dict['input_ids'] )

           snake_case__			,       snake_case__					:      Dict  			=						(
               inputs_dict['decoder_input_ids'],
               inputs_dict['decoder_attention_mask'],
           )

           snake_case__					:      List[str]  			=						jnp.concatenate(
               [
                   decoder_attention_mask,
                   jnp.zeros((decoder_attention_mask.shape[0], max_decoder_length - decoder_attention_mask.shape[1]) ),
               ]    ,       axis=-1    ,       )

           snake_case__					:      Union[str, Any]  			=						model.init_cache(decoder_input_ids.shape[0]    ,       __lowerCamelCase    ,       __lowerCamelCase )
           snake_case__					:      List[str]  			=						jnp.broadcast_to(
               jnp.arange(decoder_input_ids.shape[-1] - 1 )[None, :]    ,       (decoder_input_ids.shape[0], decoder_input_ids.shape[-1] - 1)    ,       )

           snake_case__					:      List[Any]  			=						model.decode(
               decoder_input_ids[:, :-1]    ,       __lowerCamelCase    ,       decoder_attention_mask=__lowerCamelCase    ,       past_key_values=__lowerCamelCase    ,       decoder_position_ids=__lowerCamelCase    ,       )
           snake_case__					:      Tuple  			=						jnp.array(decoder_input_ids.shape[0] * [[decoder_input_ids.shape[-1] - 1]]    ,       dtype='i4' )
           snake_case__					:      int  			=						model.decode(
               decoder_input_ids[:, -1:]    ,       __lowerCamelCase    ,       past_key_values=outputs_cache.past_key_values    ,       decoder_attention_mask=__lowerCamelCase    ,       decoder_position_ids=__lowerCamelCase    ,       )

           snake_case__					:      Dict  			=						model.decode(__lowerCamelCase    ,       __lowerCamelCase    ,       decoder_attention_mask=__lowerCamelCase )

           snake_case__					:      Optional[int]  			=						np.max(np.abs((outputs_cache_next[0][:, -1, :5] - outputs[0][:, -1, :5]) ) )
           self.parent.assertTrue(diff < 1E-3    ,       msg=F"Max diff is {diff}" )






@require_flax
class 					lowercase_			(	lowerCAmelCase_	,					unittest.TestCase	,					lowerCAmelCase_       ):
     A_       							= True
     A_       							= (FlaxMarianModel, FlaxMarianMTModel) if is_flax_available() else ()
     A_       							= (FlaxMarianMTModel,) if is_flax_available() else ()





     def  _lowerCAmelCase			(    self    :				int ):
           snake_case__					:      Any  			=						FlaxMarianModelTester(self )





     def  _lowerCAmelCase			(    self    :				Optional[Any] ):
           snake_case__			,       snake_case__					:      Optional[Any]  			=						self.model_tester.prepare_config_and_inputs()
           for model_class in self.all_model_classes:
                 self.model_tester.check_use_cache_forward(__lowerCamelCase    ,       __lowerCamelCase    ,       __lowerCamelCase )





     def  _lowerCAmelCase			(    self    :				str ):
           snake_case__			,       snake_case__					:      str  			=						self.model_tester.prepare_config_and_inputs()
           for model_class in self.all_model_classes:
                 self.model_tester.check_use_cache_forward_with_attn_mask(__lowerCamelCase    ,       __lowerCamelCase    ,       __lowerCamelCase )





     def  _lowerCAmelCase			(    self    :				List[Any] ):
           snake_case__			,       snake_case__					:      Optional[Any]  			=						self.model_tester.prepare_config_and_inputs_for_common()

           for model_class in self.all_model_classes:
                 with self.subTest(model_class.__name__ ):
                       snake_case__					:      Union[str, Any]  			=						self._prepare_for_class(__lowerCamelCase    ,       __lowerCamelCase )
                       snake_case__					:      List[str]  			=						model_class(__lowerCamelCase )

                       @jax.jit
                       def encode_jitted(__lowerCamelCase    :				Dict    ,       __lowerCamelCase    :				Optional[Any]=None    ,       **__lowerCamelCase    :				List[str] ):
                             return model.encode(input_ids=__lowerCamelCase    ,       attention_mask=__lowerCamelCase )

                       with self.subTest('JIT Enabled' ):
                             snake_case__					:      List[Any]  			=						encode_jitted(**__lowerCamelCase ).to_tuple()

                       with self.subTest('JIT Disabled' ):
                             with jax.disable_jit():
                                   snake_case__					:      Dict  			=						encode_jitted(**__lowerCamelCase ).to_tuple()

                       self.assertEqual(len(__lowerCamelCase )    ,       len(__lowerCamelCase ) )
                       for jitted_output, output in zip(__lowerCamelCase    ,       __lowerCamelCase ):
                             self.assertEqual(jitted_output.shape    ,       output.shape )





     def  _lowerCAmelCase			(    self    :				int ):
           snake_case__			,       snake_case__					:      Dict  			=						self.model_tester.prepare_config_and_inputs_for_common()

           for model_class in self.all_model_classes:
                 with self.subTest(model_class.__name__ ):
                       snake_case__					:      List[str]  			=						model_class(__lowerCamelCase )
                       snake_case__					:      Union[str, Any]  			=						model.encode(inputs_dict['input_ids']    ,       inputs_dict['attention_mask'] )

                       snake_case__					:      str  			=						{
                           'decoder_input_ids': inputs_dict['decoder_input_ids'],
                           'decoder_attention_mask': inputs_dict['decoder_attention_mask'],
                           'encoder_outputs': encoder_outputs,
                       }

                       @jax.jit
                       def decode_jitted(__lowerCamelCase    :				Tuple    ,       __lowerCamelCase    :				Any    ,       __lowerCamelCase    :				Optional[Any] ):
                             return model.decode(
                                 decoder_input_ids=__lowerCamelCase    ,       decoder_attention_mask=__lowerCamelCase    ,       encoder_outputs=__lowerCamelCase    ,       )

                       with self.subTest('JIT Enabled' ):
                             snake_case__					:      List[str]  			=						decode_jitted(**__lowerCamelCase ).to_tuple()

                       with self.subTest('JIT Disabled' ):
                             with jax.disable_jit():
                                   snake_case__					:      str  			=						decode_jitted(**__lowerCamelCase ).to_tuple()

                       self.assertEqual(len(__lowerCamelCase )    ,       len(__lowerCamelCase ) )
                       for jitted_output, output in zip(__lowerCamelCase    ,       __lowerCamelCase ):
                             self.assertEqual(jitted_output.shape    ,       output.shape )





     @slow
     def  _lowerCAmelCase			(    self    :				List[str] ):
           for model_class_name in self.all_model_classes:
                 snake_case__					:      Any  			=						model_class_name.from_pretrained('Helsinki-NLP/opus-mt-en-de' )
                 # FlaxMarianForSequenceClassification expects eos token in input_ids
                 snake_case__					:      List[Any]  			=						np.ones((1, 1) ) * model.config.eos_token_id
                 snake_case__					:      Union[str, Any]  			=						model(__lowerCamelCase )
                 self.assertIsNotNone(__lowerCamelCase )






@require_flax
@require_sentencepiece
@require_tokenizers
class 					lowercase_			(	unittest.TestCase       ):
     A_       							= None
     A_       							= None





     @classmethod
     def  _lowerCAmelCase			(    cls    :				Union[str, Any] ):
           snake_case__					:      List[Any]  			=						F"Helsinki-NLP/opus-mt-{cls.src}-{cls.tgt}"
           return cls





     @cached_property
     def  _lowerCAmelCase			(    self    :				Optional[int] ):
           return MarianTokenizer.from_pretrained(self.model_name )





     @property
     def  _lowerCAmelCase			(    self    :				int ):
           return self.tokenizer.eos_token_id





     @cached_property
     def  _lowerCAmelCase			(    self    :				Dict ):
           snake_case__					:      FlaxMarianMTModel  			=						FlaxMarianMTModel.from_pretrained(self.model_name )
           self.assertEqual(model.config.decoder_start_token_id    ,       model.config.pad_token_id )
           return model





     def  _lowerCAmelCase			(    self    :				Tuple    ,       **__lowerCamelCase    :				List[Any] ):
           snake_case__					:      Dict  			=						self.translate_src_text(**__lowerCamelCase )
           self.assertListEqual(self.expected_text    ,       __lowerCamelCase )





     def  _lowerCAmelCase			(    self    :				List[str]    ,       **__lowerCamelCase    :				Dict ):
           snake_case__					:      str  			=						self.tokenizer(self.src_text    ,       padding=__lowerCamelCase    ,       return_tensors='np'    ,       **__lowerCamelCase )
           snake_case__					:      Any  			=						self.model.generate(
               model_inputs.input_ids    ,       attention_mask=model_inputs.attention_mask    ,       num_beams=2    ,       max_length=128    ,       ).sequences
           snake_case__					:      List[str]  			=						self.tokenizer.batch_decode(__lowerCamelCase    ,       skip_special_tokens=__lowerCamelCase )
           return generated_words






@require_flax
@require_sentencepiece
@require_tokenizers
class 					lowercase_			(	lowerCAmelCase_       ):
     A_       							= "en"
     A_       							= "fr"
     A_       							= [
         "I am a small frog.",
         "Now I can forget the 100 words of german that I know.",
     ]
     A_       							= [
         "Je suis une petite grenouille.",
         "Maintenant, je peux oublier les 100 mots d'allemand que je connais.",
     ]





     @slow
     def  _lowerCAmelCase			(    self    :				Union[str, Any] ):
           self._assert_generated_batch_equal_expected()






@require_flax
@require_sentencepiece
@require_tokenizers
class 					lowercase_			(	lowerCAmelCase_       ):
     A_       							= "fr"
     A_       							= "en"
     A_       							= [
         "Donnez moi le micro.",
         "Tom et Mary étaient assis à une table.",  # Accents
     ]
     A_       							= [
         "Give me the microphone.",
         "Tom and Mary were sitting at a table.",
     ]





     @slow
     def  _lowerCAmelCase			(    self    :				List[Any] ):
           self._assert_generated_batch_equal_expected()






@require_flax
@require_sentencepiece
@require_tokenizers
class 					lowercase_			(	lowerCAmelCase_       ):
     A_       							= "mt"
     A_       							= "en"
     A_       							= ["Billi messu b'mod ġentili, Ġesù fejjaq raġel li kien milqut bil - marda kerha tal - ġdiem."]
     A_       							= ["Touching gently, Jesus healed a man who was affected by the sad disease of leprosy."]





     @slow
     def  _lowerCAmelCase			(    self    :				Dict ):
           self._assert_generated_batch_equal_expected()






@require_flax
@require_sentencepiece
@require_tokenizers
class 					lowercase_			(	lowerCAmelCase_       ):
     A_       							= "en"
     A_       							= "de"
     A_       							= [
         "I am a small frog.",
         "Now I can forget the 100 words of german that I know.",
         "Tom asked his teacher for advice.",
         "That's how I would do it.",
         "Tom really admired Mary's courage.",
         "Turn around and close your eyes.",
     ]
     A_       							= [
         "Ich bin ein kleiner Frosch.",
         "Jetzt kann ich die 100 Wörter des Deutschen vergessen, die ich kenne.",
         "Tom bat seinen Lehrer um Rat.",
         "So würde ich das machen.",
         "Tom bewunderte Marias Mut wirklich.",
         "Drehen Sie sich um und schließen Sie die Augen.",
     ]





     @slow
     def  _lowerCAmelCase			(    self    :				Dict ):
           self._assert_generated_batch_equal_expected()






@require_flax
@require_sentencepiece
@require_tokenizers
class 					lowercase_			(	lowerCAmelCase_       ):
     A_       							= "en"
     A_       							= "zh"
     A_       							= ["My name is Wolfgang and I live in Berlin"]
     A_       							= ["我叫沃尔夫冈 我住在柏林"]





     @slow
     def  _lowerCAmelCase			(    self    :				Union[str, Any] ):
           self._assert_generated_batch_equal_expected()






@require_flax
@require_sentencepiece
@require_tokenizers
class 					lowercase_			(	lowerCAmelCase_       ):
     A_       							= "ru"
     A_       							= "fr"
     A_       							= ["Он показал мне рукопись своей новой пьесы."]
     A_       							= ["Il m'a montré le manuscrit de sa nouvelle pièce."]





     @slow
     def  _lowerCAmelCase			(    self    :				Optional[Any] ):
           self._assert_generated_batch_equal_expected()






@require_flax
@require_sentencepiece
@require_tokenizers
class 					lowercase_			(	lowerCAmelCase_       ):
     A_       							= "en"
     A_       							= "ROMANCE"
     A_       							= [
         ">>fr<< Don't spend so much time watching TV.",
         ">>pt<< Your message has been sent.",
         ">>es<< He's two years older than me.",
     ]
     A_       							= [
         "Ne passez pas autant de temps à regarder la télé.",
         "A sua mensagem foi enviada.",
         "Es dos años más viejo que yo.",
     ]





     @slow
     def  _lowerCAmelCase			(    self    :				int ):
           self._assert_generated_batch_equal_expected()
