


from pathlib import Path

import torch

from ...utils import is_npu_available, is_xpu_available
from .config_args import ClusterConfig, default_json_config_file
from .config_utils import SubcommandHelpFormatter


__magic_name__								="Create a default config file for Accelerate with only a few flags set."







def  __UpperCamelCase    (						A="no" ,							A = default_json_config_file ,							A = False							):
     UpperCamelCase__										=      Path(A							)
     path.parent.mkdir(parents=A ,							exist_ok=A							)
     if path.exists():
          print(
              f"Configuration already exists at {save_location}, will not override. Run `accelerate config` manually or pass a different `save_location`."							)
          return False
     UpperCamelCase__										=      mixed_precision.lower()
     if mixed_precision not in ["no", "fp16", "bf16", "fp8"]:
          raise ValueError(
              f"`mixed_precision` should be one of 'no', 'fp16', 'bf16', or 'fp8'. Received {mixed_precision}"							)
     UpperCamelCase__										=      {
         '''compute_environment''': '''LOCAL_MACHINE''',
         '''mixed_precision''': mixed_precision,
     }
     if torch.cuda.is_available():
          UpperCamelCase__										=      torch.cuda.device_count()
          UpperCamelCase__										=      num_gpus
          UpperCamelCase__										=      False
          if num_gpus > 1:
               UpperCamelCase__										=      '''MULTI_GPU'''
          else:
               UpperCamelCase__										=      '''NO'''
     elif is_xpu_available() and use_xpu:
          UpperCamelCase__										=      torch.xpu.device_count()
          UpperCamelCase__										=      num_xpus
          UpperCamelCase__										=      False
          if num_xpus > 1:
               UpperCamelCase__										=      '''MULTI_XPU'''
          else:
               UpperCamelCase__										=      '''NO'''
     elif is_npu_available():
          UpperCamelCase__										=      torch.npu.device_count()
          UpperCamelCase__										=      num_npus
          UpperCamelCase__										=      False
          if num_npus > 1:
               UpperCamelCase__										=      '''MULTI_NPU'''
          else:
               UpperCamelCase__										=      '''NO'''
     else:
          UpperCamelCase__										=      0
          UpperCamelCase__										=      True
          UpperCamelCase__										=      1
          UpperCamelCase__										=      '''NO'''
     UpperCamelCase__										=      ClusterConfig(**A							)
     config.to_json_file(A							)
     return path







def  __UpperCamelCase    (						A ,							A							):
     UpperCamelCase__										=      parser.add_parser('''default''' ,							parents=A ,							help=A ,							formatter_class=A							)
     parser.add_argument(
         '''--config_file''' ,							default=A ,							help=(
             '''The path to use to store the config file. Will default to a file named default_config.yaml in the cache '''
             '''location, which is the content of the environment `HF_HOME` suffixed with \'accelerate\', or if you don\'t have '''
             '''such an environment variable, your cache directory (\'~/.cache\' or the content of `XDG_CACHE_HOME`) suffixed '''
             '''with \'huggingface\'.'''
         ) ,							dest='''save_location''' ,							)

     parser.add_argument(
         '''--mixed_precision''' ,							choices=['''no''', '''fp16''', '''bf16'''] ,							type=A ,							help='''Whether or not to use mixed precision training. '''
         '''Choose between FP16 and BF16 (bfloat16) training. '''
         '''BF16 training is only supported on Nvidia Ampere GPUs and PyTorch 1.10 or later.''' ,							default='''no''' ,							)
     parser.set_defaults(func=A							)
     return parser







def  __UpperCamelCase    (						A							):
     UpperCamelCase__										=      write_basic_config(args.mixed_precision ,							args.save_location							)
     if config_file:
          print(f"accelerate configuration saved at {config_file}"							)




import unittest

from transformers import TrOCRConfig
from transformers.testing_utils import is_torch_available, require_torch, torch_device

from ...generation.test_utils import GenerationTesterMixin
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.models.trocr.modeling_trocr import TrOCRDecoder, TrOCRForCausalLM



@require_torch
class     _A   :






  def __init__(self   ,				SCREAMING_SNAKE_CASE_   ,				SCREAMING_SNAKE_CASE_=99   ,				SCREAMING_SNAKE_CASE_=13   ,				SCREAMING_SNAKE_CASE_=16   ,				SCREAMING_SNAKE_CASE_=7   ,				SCREAMING_SNAKE_CASE_=True   ,				SCREAMING_SNAKE_CASE_=True   ,				SCREAMING_SNAKE_CASE_=True   ,				SCREAMING_SNAKE_CASE_=False   ,				SCREAMING_SNAKE_CASE_=True   ,				SCREAMING_SNAKE_CASE_=2   ,				SCREAMING_SNAKE_CASE_=32   ,				SCREAMING_SNAKE_CASE_=4   ,				SCREAMING_SNAKE_CASE_=4   ,				SCREAMING_SNAKE_CASE_=30   ,				SCREAMING_SNAKE_CASE_=0   ,				SCREAMING_SNAKE_CASE_=1   ,				SCREAMING_SNAKE_CASE_=2   ,				SCREAMING_SNAKE_CASE_=None   ,				)		->      str:





       '''simple docstring'''





       UpperCamelCase__										=      parent
       UpperCamelCase__										=      batch_size
       UpperCamelCase__										=      decoder_seq_length
       # For common tests
       UpperCamelCase__										=      self.decoder_seq_length
       UpperCamelCase__										=      is_training
       UpperCamelCase__										=      use_attention_mask
       UpperCamelCase__										=      use_labels

       UpperCamelCase__										=      vocab_size
       UpperCamelCase__										=      d_model
       UpperCamelCase__										=      d_model
       UpperCamelCase__										=      decoder_layers
       UpperCamelCase__										=      decoder_layers
       UpperCamelCase__										=      decoder_ffn_dim
       UpperCamelCase__										=      decoder_attention_heads
       UpperCamelCase__										=      decoder_attention_heads
       UpperCamelCase__										=      eos_token_id
       UpperCamelCase__										=      bos_token_id
       UpperCamelCase__										=      pad_token_id
       UpperCamelCase__										=      decoder_start_token_id
       UpperCamelCase__										=      use_cache
       UpperCamelCase__										=      max_position_embeddings

       UpperCamelCase__										=      None
       UpperCamelCase__										=      decoder_seq_length
       UpperCamelCase__										=      2
       UpperCamelCase__										=      1






  def 		_a					(self	)		->      str:





       '''simple docstring'''





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

       UpperCamelCase__										=      None
       if self.use_attention_mask:
            UpperCamelCase__										=      ids_tensor([self.batch_size, self.decoder_seq_length]   ,				vocab_size=2	)

       UpperCamelCase__										=      None
       if self.use_labels:
            UpperCamelCase__										=      ids_tensor([self.batch_size, self.decoder_seq_length]   ,				self.vocab_size	)

       UpperCamelCase__										=      TrOCRConfig(
           vocab_size=self.vocab_size   ,				d_model=self.d_model   ,				decoder_layers=self.decoder_layers   ,				decoder_ffn_dim=self.decoder_ffn_dim   ,				decoder_attention_heads=self.decoder_attention_heads   ,				eos_token_id=self.eos_token_id   ,				bos_token_id=self.bos_token_id   ,				use_cache=self.use_cache   ,				pad_token_id=self.pad_token_id   ,				decoder_start_token_id=self.decoder_start_token_id   ,				max_position_embeddings=self.max_position_embeddings   ,				)

       return (config, input_ids, attention_mask, lm_labels)






  def 		_a					(self   ,				SCREAMING_SNAKE_CASE_   ,				SCREAMING_SNAKE_CASE_   ,				SCREAMING_SNAKE_CASE_   ,				SCREAMING_SNAKE_CASE_   ,				)		->      Any:





       '''simple docstring'''





       UpperCamelCase__										=      True
       UpperCamelCase__										=      TrOCRDecoder(config=SCREAMING_SNAKE_CASE_	).to(SCREAMING_SNAKE_CASE_	).eval()
       UpperCamelCase__										=      input_ids[:2]

       input_ids[input_ids == 0] += 1
       # first forward pass
       UpperCamelCase__										=      model(SCREAMING_SNAKE_CASE_   ,				use_cache=SCREAMING_SNAKE_CASE_	)
       UpperCamelCase__										=      model(SCREAMING_SNAKE_CASE_	)
       UpperCamelCase__										=      model(SCREAMING_SNAKE_CASE_   ,				use_cache=SCREAMING_SNAKE_CASE_	)

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

       UpperCamelCase__										=      outputs['''past_key_values''']

       # create hypothetical next token and extent to next_input_ids
       UpperCamelCase__										=      ids_tensor((2, 1)   ,				config.vocab_size - 1	) + 1

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

       UpperCamelCase__										=      model(SCREAMING_SNAKE_CASE_	)['''last_hidden_state''']
       UpperCamelCase__										=      model(SCREAMING_SNAKE_CASE_   ,				past_key_values=SCREAMING_SNAKE_CASE_	)['''last_hidden_state''']

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

       # test that outputs are equal for slice
       assert torch.allclose(SCREAMING_SNAKE_CASE_   ,				SCREAMING_SNAKE_CASE_   ,				atol=1E-3	)






  def 		_a					(self	)		->      Dict:





       '''simple docstring'''





       UpperCamelCase__										=      self.prepare_config_and_inputs()
       UpperCamelCase__						,       UpperCamelCase__						,       UpperCamelCase__						,       UpperCamelCase__										=      config_and_inputs

       UpperCamelCase__										=      {'''input_ids''': input_ids, '''attention_mask''': attention_mask}
       return config, inputs_dict



@require_torch
class     _A   (    __UpperCamelCase	, __UpperCamelCase	, __UpperCamelCase	, unittest.TestCase							):
  SCREAMING_SNAKE_CASE_	:	Tuple						=(TrOCRDecoder, TrOCRForCausalLM) if is_torch_available() else ()
  SCREAMING_SNAKE_CASE_	:	Any						=(TrOCRForCausalLM,) if is_torch_available() else ()
  SCREAMING_SNAKE_CASE_	:	Optional[int]						={"text-generation": TrOCRForCausalLM} if is_torch_available() else {}
  SCREAMING_SNAKE_CASE_	:	Optional[int]						=True
  SCREAMING_SNAKE_CASE_	:	Dict						=False






  def 		_a					(self	)		->      int:





       '''simple docstring'''





       UpperCamelCase__										=      TrOCRStandaloneDecoderModelTester(self   ,				is_training=SCREAMING_SNAKE_CASE_	)
       UpperCamelCase__										=      ConfigTester(self   ,				config_class=SCREAMING_SNAKE_CASE_	)






  def 		_a					(self	)		->      Dict:





       '''simple docstring'''





       pass






  def 		_a					(self	)		->      List[str]:





       '''simple docstring'''





       pass






  def 		_a					(self	)		->      int:





       '''simple docstring'''





       pass






  def 		_a					(self	)		->      Tuple:





       '''simple docstring'''





       self.config_tester.run_common_tests()






  def 		_a					(self	)		->      Any:





       '''simple docstring'''





       UpperCamelCase__										=      self.model_tester.prepare_config_and_inputs()
       self.model_tester.create_and_check_decoder_model_past(*SCREAMING_SNAKE_CASE_	)






  def 		_a					(self	)		->      List[Any]:





       '''simple docstring'''





       return






  @unittest.skip('''The model doesn\'t support left padding'''	)  # and it's not used enough to be worth fixing :)
  def 		_a					(self	)		->      Optional[int]:





       '''simple docstring'''





       pass



