






import os
import sys
import tempfile

import torch

from .state import AcceleratorState
from .utils import PrecisionType, PrepareForLaunch, is_mps_available, patch_environment






def      _snake_case     (__lowercase     ,   __lowercase=()     ,   __lowercase=None     ,   __lowercase="no"     ,   __lowercase="29500"):
   UpperCamelCase_						=  False
   UpperCamelCase_						=  False
   if any(key.startswith('KAGGLE') for key in os.environ.keys()):
      UpperCamelCase_						=  True
   elif "IPython" in sys.modules:
      UpperCamelCase_						=  'google.colab' in str(sys.modules['IPython'].get_ipython())

   try:
      UpperCamelCase_						=  PrecisionType(mixed_precision.lower())
   except ValueError:
      raise ValueError(
          f"""Unknown mixed_precision mode: {args.mixed_precision.lower()}. Choose between {PrecisionType.list()}.""")

   if (in_colab or in_kaggle) and (os.environ.get('TPU_NAME'     ,   __lowercase) is not None):
      # TPU launch
      import torch_xla.distributed.xla_multiprocessing as xmp

      if len(AcceleratorState._shared_state) > 0:
         raise ValueError(
             'To train on TPU in Colab or Kaggle Kernel, the `Accelerator` should only be initialized inside '
             'your training function. Restart your notebook and make sure no cells initializes an '
             '`Accelerator`.')
      if num_processes is None:
         UpperCamelCase_						=  8

      UpperCamelCase_						=  PrepareForLaunch(__lowercase     ,   distributed_type='TPU')
      print(f"""Launching a training on {num_processes} TPU cores.""")
      xmp.spawn(__lowercase     ,   args=__lowercase     ,   nprocs=__lowercase     ,   start_method='fork')
   elif in_colab:
      # No need for a distributed launch otherwise as it's either CPU or one GPU.
      if torch.cuda.is_available():
         print('Launching training on one GPU.')
      else:
         print('Launching training on one CPU.')
      function(*__lowercase)
   else:
      if num_processes is None:
         raise ValueError(
             'You have to specify the number of GPUs you would like to use, add `num_processes=...` to your call.')

      if num_processes > 1:
         # Multi-GPU launch
         from torch.multiprocessing import start_processes
         from torch.multiprocessing.spawn import ProcessRaisedException

         if len(AcceleratorState._shared_state) > 0:
            raise ValueError(
                'To launch a multi-GPU training from your notebook, the `Accelerator` should only be initialized '
                'inside your training function. Restart your notebook and make sure no cells initializes an '
                '`Accelerator`.')

         if torch.cuda.is_initialized():
            raise ValueError(
                'To launch a multi-GPU training from your notebook, you need to avoid running any instruction '
                'using `torch.cuda` in any cell. Restart your notebook and make sure no cells use any CUDA '
                'function.')

         # torch.distributed will expect a few environment variable to be here. We set the ones common to each
         # process here (the other ones will be set be the launcher).
         with patch_environment(
             world_size=__lowercase     ,   master_addr='127.0.01'     ,   master_port=__lowercase     ,   mixed_precision=__lowercase):
            UpperCamelCase_						=  PrepareForLaunch(__lowercase     ,   distributed_type='MULTI_GPU')
            print(f"""Launching training on {num_processes} GPUs.""")
            try:
               start_processes(__lowercase     ,   args=__lowercase     ,   nprocs=__lowercase     ,   start_method='fork')
            except ProcessRaisedException as e:
               if "Cannot re-initialize CUDA in forked subprocess" in e.args[0]:
                  raise RuntimeError(
                      'CUDA has been initialized before the `notebook_launcher` could create a forked subprocess. '
                      'This likely stems from an outside import causing issues once the `notebook_launcher()` is called. '
                      'Please review your imports and test them when running the `notebook_launcher()` to identify '
                      'which one is problematic.') from e

      else:
         # No need for a distributed launch otherwise as it's either CPU, GPU or MPS.
         if is_mps_available():
            UpperCamelCase_						=  '1'
            print('Launching training on MPS.')
         elif torch.cuda.is_available():
            print('Launching training on one GPU.')
         else:
            print('Launching training on CPU.')
         function(*__lowercase)






def      _snake_case     (__lowercase     ,   __lowercase=()     ,   __lowercase=2):
   from torch.multiprocessing import start_processes

   with tempfile.NamedTemporaryFile() as tmp_file:
      # torch.distributed will expect a few environment variable to be here. We set the ones common to each
      # process here (the other ones will be set be the launcher).
      with patch_environment(
          world_size=__lowercase     ,   master_addr='127.0.01'     ,   master_port='29500'     ,   accelerate_mixed_precision='no'     ,   accelerate_debug_rdv_file=tmp_file.name     ,   accelerate_use_cpu='yes'     ,   ):
         UpperCamelCase_						=  PrepareForLaunch(__lowercase     ,   debug=__lowercase)
         start_processes(__lowercase     ,   args=__lowercase     ,   nprocs=__lowercase     ,   start_method='fork')













from __future__ import annotations

import unittest

from transformers import AutoTokenizer, MBartConfig, is_tf_available
from transformers.testing_utils import require_sentencepiece, require_tf, require_tokenizers, slow
from transformers.utils import cached_property

from ...test_configuration_common import ConfigTester
from ...test_modeling_tf_common import TFModelTesterMixin, ids_tensor
from ...test_pipeline_mixin import PipelineTesterMixin


if is_tf_available():
 import tensorflow as tf

 from transformers import TFAutoModelForSeqaSeqLM, TFMBartForConditionalGeneration, TFMBartModel


@require_tf
class     _a							:






  """simple docstring"""





  A_						       = MBartConfig
  A_						       = {}
  A_						       = """gelu"""




  def __init__(  self		,		_UpperCAmelCase		,		_UpperCAmelCase=13		,		_UpperCAmelCase=7		,		_UpperCAmelCase=True		,		_UpperCAmelCase=False		,		_UpperCAmelCase=99		,		_UpperCAmelCase=32		,		_UpperCAmelCase=2		,		_UpperCAmelCase=4		,		_UpperCAmelCase=37		,		_UpperCAmelCase=0.1		,		_UpperCAmelCase=0.1		,		_UpperCAmelCase=20		,		_UpperCAmelCase=2		,		_UpperCAmelCase=1		,		_UpperCAmelCase=0		,		)      ->			Union[str, Any]:
     UpperCamelCase_						=  parent
     UpperCamelCase_						=  batch_size
     UpperCamelCase_						=  seq_length
     UpperCamelCase_						=  is_training
     UpperCamelCase_						=  use_labels
     UpperCamelCase_						=  vocab_size
     UpperCamelCase_						=  hidden_size
     UpperCamelCase_						=  num_hidden_layers
     UpperCamelCase_						=  num_attention_heads
     UpperCamelCase_						=  intermediate_size
     UpperCamelCase_						=  hidden_dropout_prob
     UpperCamelCase_						=  attention_probs_dropout_prob
     UpperCamelCase_						=  max_position_embeddings
     UpperCamelCase_						=  eos_token_id
     UpperCamelCase_						=  pad_token_id
     UpperCamelCase_						=  bos_token_id




  def  _UpperCAmelCase  (  self			)      ->			List[Any]:
     UpperCamelCase_						=  ids_tensor([self.batch_size, self.seq_length - 1]		,		self.vocab_size			)
     UpperCamelCase_						=  tf.expand_dims(tf.constant([self.eos_token_id] * self.batch_size			)		,		1			)
     UpperCamelCase_						=  tf.concat([input_ids, eos_tensor]		,		axis=1			)

     UpperCamelCase_						=  ids_tensor([self.batch_size, self.seq_length]		,		self.vocab_size			)

     UpperCamelCase_						=  self.config_cls(
         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_ids=[2]		,		bos_token_id=self.bos_token_id		,		pad_token_id=self.pad_token_id		,		decoder_start_token_id=self.pad_token_id		,		**self.config_updates		,		)
     UpperCamelCase_						=  prepare_mbart_inputs_dict(_UpperCAmelCase		,		_UpperCAmelCase		,		_UpperCAmelCase			)
     return config, inputs_dict




  def  _UpperCAmelCase  (  self		,		_UpperCAmelCase		,		_UpperCAmelCase			)      ->			List[str]:
     UpperCamelCase_						=  TFMBartModel(config=_UpperCAmelCase			).get_decoder()
     UpperCamelCase_						=  inputs_dict['input_ids']

     UpperCamelCase_						=  input_ids[:1, :]
     UpperCamelCase_						=  inputs_dict['attention_mask'][:1, :]
     UpperCamelCase_						=  inputs_dict['head_mask']
     UpperCamelCase_						=  1

     # first forward pass
     UpperCamelCase_						=  model(_UpperCAmelCase		,		attention_mask=_UpperCAmelCase		,		head_mask=_UpperCAmelCase		,		use_cache=_UpperCAmelCase			)

     UpperCamelCase_		,   UpperCamelCase_						=  outputs.to_tuple()
     UpperCamelCase_						=  past_key_values[1]






def      _snake_case     (__lowercase     ,   __lowercase     ,   __lowercase     ,   __lowercase=None     ,   __lowercase=None     ,   __lowercase=None     ,   __lowercase=None     ,   __lowercase=None     ,   ):
   if attention_mask is None:
      UpperCamelCase_						=  tf.cast(tf.math.not_equal(__lowercase     ,   config.pad_token_id)     ,   tf.inta)
   if decoder_attention_mask is None:
      UpperCamelCase_						=  tf.concat(
          [
              tf.ones(decoder_input_ids[:, :1].shape     ,   dtype=tf.inta),
              tf.cast(tf.math.not_equal(decoder_input_ids[:, 1:]     ,   config.pad_token_id)     ,   tf.inta),
          ]     ,   axis=-1     ,   )
   if head_mask is None:
      UpperCamelCase_						=  tf.ones((config.encoder_layers, config.encoder_attention_heads))
   if decoder_head_mask is None:
      UpperCamelCase_						=  tf.ones((config.decoder_layers, config.decoder_attention_heads))
   if cross_attn_head_mask is None:
      UpperCamelCase_						=  tf.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": decoder_attention_mask,
       "head_mask": head_mask,
       "decoder_head_mask": decoder_head_mask,
       "cross_attn_head_mask": cross_attn_head_mask,
   }


@require_tf
class     _a							(	UpperCAmelCase__    ,							UpperCAmelCase__    ,							unittest.TestCase     ):






  """simple docstring"""





  A_						       = (TFMBartForConditionalGeneration, TFMBartModel) if is_tf_available() else ()
  A_						       = (TFMBartForConditionalGeneration,) if is_tf_available() else ()
  A_						       = (
      {
          """conversational""": TFMBartForConditionalGeneration,
          """feature-extraction""": TFMBartModel,
          """summarization""": TFMBartForConditionalGeneration,
          """text2text-generation""": TFMBartForConditionalGeneration,
          """translation""": TFMBartForConditionalGeneration,
      }
      if is_tf_available()
      else {}
  )
  A_						       = True
  A_						       = False
  A_						       = False




  def  _UpperCAmelCase  (  self		,		_UpperCAmelCase		,		_UpperCAmelCase		,		_UpperCAmelCase		,		_UpperCAmelCase		,		_UpperCAmelCase			)      ->			Tuple:
     if pipeline_test_casse_name != "FeatureExtractionPipelineTests":
        # Exception encountered when calling layer '...'
        return True

     return False




  def  _UpperCAmelCase  (  self			)      ->			Optional[int]:
     UpperCamelCase_						=  TFMBartModelTester(self			)
     UpperCamelCase_						=  ConfigTester(self		,		config_class=_UpperCAmelCase			)




  def  _UpperCAmelCase  (  self			)      ->			Optional[int]:
     self.config_tester.run_common_tests()




  def  _UpperCAmelCase  (  self			)      ->			List[Any]:
     UpperCamelCase_						=  self.model_tester.prepare_config_and_inputs_for_common()
     self.model_tester.check_decoder_model_past_large_inputs(*_UpperCAmelCase			)




@require_sentencepiece
@require_tokenizers
@require_tf
class     _a							(	unittest.TestCase     ):






  """simple docstring"""





  A_						       = [
      """ UN Chief Says There Is No Military Solution in Syria""",
  ]
  A_						       = [
      """Şeful ONU declară că nu există o soluţie militară în Siria""",
  ]
  A_						       = """facebook/mbart-large-en-ro"""




  @cached_property
  def  _UpperCAmelCase  (  self			)      ->			Any:
     return AutoTokenizer.from_pretrained(self.model_name			)




  @cached_property
  def  _UpperCAmelCase  (  self			)      ->			List[str]:
     UpperCamelCase_						=  TFAutoModelForSeqaSeqLM.from_pretrained(self.model_name			)
     return model




  def  _UpperCAmelCase  (  self		,		**_UpperCAmelCase			)      ->			int:
     UpperCamelCase_						=  self.translate_src_text(**_UpperCAmelCase			)
     self.assertListEqual(self.expected_text		,		_UpperCAmelCase			)




  def  _UpperCAmelCase  (  self		,		**_UpperCAmelCase			)      ->			List[str]:
     UpperCamelCase_						=  self.tokenizer(self.src_text		,		**_UpperCAmelCase		,		return_tensors='tf'			)
     UpperCamelCase_						=  self.model.generate(
         model_inputs.input_ids		,		attention_mask=model_inputs.attention_mask		,		num_beams=2			)
     UpperCamelCase_						=  self.tokenizer.batch_decode(_UpperCAmelCase		,		skip_special_tokens=_UpperCAmelCase			)
     return generated_words




  @slow
  def  _UpperCAmelCase  (  self			)      ->			List[Any]:
     self._assert_generated_batch_equal_expected()





