


"""simple docstring"""






import copy

from ...configuration_utils import PretrainedConfig
from ...utils import logging


lowercase  		=			logging.get_logger(__name__)

lowercase  		=			{
    '''facebook/sam-vit-huge''': '''https://huggingface.co/facebook/sam-vit-huge/resolve/main/config.json''',
    '''facebook/sam-vit-large''': '''https://huggingface.co/facebook/sam-vit-large/resolve/main/config.json''',
    '''facebook/sam-vit-base''': '''https://huggingface.co/facebook/sam-vit-base/resolve/main/config.json''',
}


class 			SCREAMING_SNAKE_CASE_  (   lowerCamelCase_):




							'''simple docstring'''





							def __init__(						self	,					lowerCamelCase__=256	,					lowerCamelCase__=1_024	,					lowerCamelCase__=16	,					lowerCamelCase__=16	,					lowerCamelCase__=4	,					lowerCamelCase__="gelu"	,					lowerCamelCase__=1E-6	,					**lowerCamelCase__	,					)   ->	Optional[int]:







								'''simple docstring'''




								super().__init__(**lowerCamelCase__)
								snake_case__  :						Optional[int]		=      hidden_size
								snake_case__  :						Union[str, Any]		=      image_size
								snake_case__  :						Any		=      patch_size
								snake_case__  :						int		=      image_size // patch_size
								snake_case__  :						Optional[Any]		=      mask_input_channels
								snake_case__  :						Optional[Any]		=      num_point_embeddings
								snake_case__  :						Any		=      hidden_act
								snake_case__  :						Union[str, Any]		=      layer_norm_eps


class 			SCREAMING_SNAKE_CASE_  (   lowerCamelCase_):




							'''simple docstring'''





							def __init__(						self	,					lowerCamelCase__=256	,					lowerCamelCase__="relu"	,					lowerCamelCase__=2_048	,					lowerCamelCase__=2	,					lowerCamelCase__=8	,					lowerCamelCase__=2	,					lowerCamelCase__=3	,					lowerCamelCase__=3	,					lowerCamelCase__=256	,					lowerCamelCase__=1E-6	,					**lowerCamelCase__	,					)   ->	Union[str, Any]:







								'''simple docstring'''




								super().__init__(**lowerCamelCase__)
								snake_case__  :						str		=      hidden_size
								snake_case__  :						Dict		=      hidden_act
								snake_case__  :						Union[str, Any]		=      mlp_dim
								snake_case__  :						Tuple		=      num_hidden_layers
								snake_case__  :						List[str]		=      num_attention_heads
								snake_case__  :						List[Any]		=      attention_downsample_rate
								snake_case__  :						Union[str, Any]		=      num_multimask_outputs
								snake_case__  :						List[Any]		=      iou_head_depth
								snake_case__  :						Tuple		=      iou_head_hidden_dim
								snake_case__  :						List[Any]		=      layer_norm_eps


class 			SCREAMING_SNAKE_CASE_  (   lowerCamelCase_):




							'''simple docstring'''





							def __init__(						self	,					lowerCamelCase__=768	,					lowerCamelCase__=256	,					lowerCamelCase__=12	,					lowerCamelCase__=12	,					lowerCamelCase__=3	,					lowerCamelCase__=1_024	,					lowerCamelCase__=16	,					lowerCamelCase__="gelu"	,					lowerCamelCase__=1E-06	,					lowerCamelCase__=0.0	,					lowerCamelCase__=1E-10	,					lowerCamelCase__=True	,					lowerCamelCase__=4.0	,					lowerCamelCase__=True	,					lowerCamelCase__=True	,					lowerCamelCase__=14	,					lowerCamelCase__=[2, 5, 8, 11]	,					lowerCamelCase__=128	,					lowerCamelCase__=None	,					**lowerCamelCase__	,					)   ->	List[Any]:







								'''simple docstring'''




								super().__init__(**lowerCamelCase__)

								snake_case__  :						Dict		=      hidden_size
								snake_case__  :						List[Any]		=      output_channels
								snake_case__  :						List[Any]		=      num_hidden_layers
								snake_case__  :						List[str]		=      num_attention_heads
								snake_case__  :						Optional[int]		=      num_channels
								snake_case__  :						Union[str, Any]		=      image_size
								snake_case__  :						Dict		=      patch_size
								snake_case__  :						int		=      hidden_act
								snake_case__  :						Dict		=      layer_norm_eps
								snake_case__  :						Dict		=      attention_dropout
								snake_case__  :						Optional[int]		=      initializer_range
								snake_case__  :						Tuple		=      qkv_bias
								snake_case__  :						List[Any]		=      mlp_ratio
								snake_case__  :						Optional[Any]		=      use_abs_pos
								snake_case__  :						Any		=      use_rel_pos
								snake_case__  :						Any		=      window_size
								snake_case__  :						Union[str, Any]		=      global_attn_indexes
								snake_case__  :						Any		=      num_pos_feats
								snake_case__  :						Optional[int]		=      int(hidden_size * mlp_ratio) if mlp_dim is None else mlp_dim


class 			SCREAMING_SNAKE_CASE_  (   lowerCamelCase_):




							'''simple docstring'''





							__magic_name__					:     Optional[Any]				  =  "sam"
							__magic_name__					:     List[Any]				  =  True




							def __init__(						self	,					lowerCamelCase__=None	,					lowerCamelCase__=None	,					lowerCamelCase__=None	,					lowerCamelCase__=0.02	,					**lowerCamelCase__	,					)   ->	List[Any]:







								'''simple docstring'''




								super().__init__(**lowerCamelCase__)
								snake_case__  :						List[str]		=      vision_config if vision_config is not None else {}
								snake_case__  :						List[str]		=      prompt_encoder_config if prompt_encoder_config is not None else {}
								snake_case__  :						Optional[int]		=      mask_decoder_config if mask_decoder_config is not None else {}

								if isinstance(lowerCamelCase__	,					lowerCamelCase__):
									snake_case__  :						Optional[Any]		=      vision_config.to_dict()
								if isinstance(lowerCamelCase__	,					lowerCamelCase__):
									snake_case__  :						int		=      prompt_encoder_config.to_dict()
								if isinstance(lowerCamelCase__	,					lowerCamelCase__):
									snake_case__  :						Any		=      mask_decoder_config.to_dict()

								snake_case__  :						str		=      SamVisionConfig(**lowerCamelCase__)
								snake_case__  :						Any		=      SamPromptEncoderConfig(**lowerCamelCase__)
								snake_case__  :						Optional[int]		=      SamMaskDecoderConfig(**lowerCamelCase__)
								snake_case__  :						Union[str, Any]		=      initializer_range







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







								'''simple docstring'''




								snake_case__  :						Tuple		=      copy.deepcopy(self.__dict__)
								snake_case__  :						Tuple		=      self.vision_config.to_dict()
								snake_case__  :						List[Any]		=      self.prompt_encoder_config.to_dict()
								snake_case__  :						List[Any]		=      self.mask_decoder_config.to_dict()
								snake_case__  :						int		=      self.__class__.model_type
								return output











'''simple docstring'''






import timeit
from typing import Callable, Optional

from ..configuration_utils import PretrainedConfig
from ..models.auto.modeling_auto import MODEL_MAPPING, MODEL_WITH_LM_HEAD_MAPPING
from ..utils import is_pyanvml_available, is_torch_available, logging
from .benchmark_utils import (
    Benchmark,
    Memory,
    MemorySummary,
    measure_peak_memory_cpu,
    start_memory_tracing,
    stop_memory_tracing,
)


if is_torch_available():
      import torch

      from .benchmark_args import PyTorchBenchmarkArguments


if is_pyanvml_available():
      import pyanvml.pyanvml as nvml


lowercase						:   List[Any]      						=							logging.get_logger(__name__)

class 	SCREAMING_SNAKE_CASE_		(							lowerCamelCase_					):
 __snake_case						:  PyTorchBenchmarkArguments
 __snake_case						:  PretrainedConfig
 __snake_case						:  str       =   "PyTorch"



 @property
 def  SCREAMING_SNAKE_CASE(	self			):






        '''simple docstring'''




        return torch.__version__



 def  SCREAMING_SNAKE_CASE(	self ,		A ,		A ,		A			):






        '''simple docstring'''




        lowercase	:		str    =   self._prepare_inference_func(A ,		A ,		A			)
        return self._measure_speed(_inference			)



 def  SCREAMING_SNAKE_CASE(	self ,		A ,		A ,		A			):






        '''simple docstring'''




        lowercase	:		int    =   self._prepare_inference_func(A ,		A ,		A			)
        return self._measure_memory(_inference			)



 def  SCREAMING_SNAKE_CASE(	self ,		A ,		A ,		A			):






        '''simple docstring'''




        lowercase	:		Union[str, Any]    =   self._prepare_train_func(A ,		A ,		A			)
        return self._measure_speed(_train			)



 def  SCREAMING_SNAKE_CASE(	self ,		A ,		A ,		A			):






        '''simple docstring'''




        lowercase	:		Any    =   self._prepare_train_func(A ,		A ,		A			)
        return self._measure_memory(_train			)



 def  SCREAMING_SNAKE_CASE(	self ,		A ,		A ,		A			):






        '''simple docstring'''




        lowercase	:		Any    =   self.config_dict[model_name]

        if self.args.torchscript:
               lowercase	:		Any    =   True

        lowercase	:		Union[str, Any]    =   (
            hasattr(A ,		'''architectures'''			)
            and isinstance(config.architectures ,		A			)
            and len(config.architectures			) > 0
        )
        if not self.args.only_pretrain_model and has_model_class_in_config:
               try:
                      lowercase	:		Any    =   config.architectures[0]
                      lowercase	:		Dict    =   __import__('''transformers''' ,		fromlist=[model_class]			)
                      lowercase	:		List[str]    =   getattr(A ,		A			)
                      lowercase	:		Dict    =   model_cls(A			)
               except ImportError:
                      raise ImportError(
                          f"""{model_class} does not exist. If you just want to test the pretrained model, you might want to"""
                          ''' set `--only_pretrain_model` or `args.only_pretrain_model=True`.'''			)
        else:
               lowercase	:		Optional[int]    =   MODEL_MAPPING[config.__class__](A			)

        model.eval()
        model.to(self.args.device			)

        # encoder-decoder has vocab size saved differently
        lowercase	:		str    =   config.vocab_size if hasattr(A ,		'''vocab_size'''			) else config.encoder.vocab_size
        lowercase	:		Union[str, Any]    =   torch.randint(A ,		(batch_size, sequence_length) ,		dtype=torch.long ,		device=self.args.device			)

        if self.args.fpaa:
               logger.info('''Running training in Mixed Precision...'''			)
               if not self.args.is_gpu:
                      raise ValueError('''Mixed precision is possible only for GPU.'''			)
               # amp seems to have memory leaks so that memory usage
               # is measured using .half() for now https://github.com/NVIDIA/apex/issues/439
               model.half()

        if self.args.torchscript:
               with torch.no_grad():
                      lowercase	:		int    =   torch.jit.trace(A ,		A			)
        else:
               lowercase	:		Any    =   model

        def encoder_decoder_forward():
               with torch.no_grad():
                      lowercase	:		int    =   inference_model(A ,		decoder_input_ids=A			)
               return outputs

        def encoder_forward():
               with torch.no_grad():
                      lowercase	:		Tuple    =   inference_model(A			)
               return outputs

        lowercase	:		int    =   encoder_decoder_forward if config.is_encoder_decoder else encoder_forward
        return _forward



 def  SCREAMING_SNAKE_CASE(	self ,		A ,		A ,		A			):






        '''simple docstring'''




        lowercase	:		Optional[int]    =   self.config_dict[model_name]

        lowercase	:		Optional[Any]    =   (
            hasattr(A ,		'''architectures'''			)
            and isinstance(config.architectures ,		A			)
            and len(config.architectures			) > 0
        )
        if not self.args.only_pretrain_model and has_model_class_in_config:
               try:
                      lowercase	:		str    =   config.architectures[0]
                      lowercase	:		List[str]    =   __import__('''transformers''' ,		fromlist=[model_class]			)
                      lowercase	:		int    =   getattr(A ,		A			)
                      lowercase	:		Any    =   model_cls(A			)
               except ImportError:
                      raise ImportError(
                          f"""{model_class} does not exist. If you just want to test the pretrained model, you might want to"""
                          ''' set `--only_pretrain_model` or `args.only_pretrain_model=True`.'''			)
        else:
               lowercase	:		Union[str, Any]    =   MODEL_WITH_LM_HEAD_MAPPING[config.__class__](A			)

        if self.args.torchscript:
               raise NotImplementedError('''Training for torchscript is currently not implemented'''			)
        else:
               lowercase	:		Dict    =   model

        model.train()
        model.to(self.args.device			)

        # encoder-decoder has vocab size saved differently
        lowercase	:		Union[str, Any]    =   config.vocab_size if hasattr(A ,		'''vocab_size'''			) else config.encoder.vocab_size
        lowercase	:		List[Any]    =   torch.randint(A ,		(batch_size, sequence_length) ,		dtype=torch.long ,		device=self.args.device			)

        if self.args.fpaa:
               logger.info('''Running training in Mixed Precision...'''			)
               if not self.args.is_gpu:
                      raise ValueError('''Mixed precision is possible only for GPU.'''			)

               # amp seems to have memory leaks so that memory usage
               # is measured using .half() for now https://github.com/NVIDIA/apex/issues/439
               model.half()

        def compute_loss_and_backprob_encoder():
               lowercase	:		Optional[Any]    =   train_model(A ,		labels=A			)[0]
               loss.backward()
               return loss

        def compute_loss_and_backprob_encoder_decoder():
               lowercase	:		List[Any]    =   train_model(A ,		decoder_input_ids=A ,		labels=A			)[0]
               loss.backward()
               return loss

        lowercase	:		Any    =   (
            compute_loss_and_backprob_encoder_decoder
            if config.is_encoder_decoder
            else compute_loss_and_backprob_encoder
        )
        return _train



 def  SCREAMING_SNAKE_CASE(	self ,		A			):






        '''simple docstring'''




        try:
               if self.args.is_tpu or self.args.torchscript:
                      # run additional 10 times to stabilize compilation for tpu and torchscript
                      logger.info('''Do inference on TPU or torchscript. Running model 5 times to stabilize compilation'''			)
                      timeit.repeat(
                          A ,		repeat=1 ,		number=5 ,		)

               # as written in https://docs.python.org/2/library/timeit.html#timeit.Timer.repeat, min should be taken rather than the average
               lowercase	:		str    =   timeit.repeat(
                   A ,		repeat=self.args.repeat ,		number=10 ,		)

               if self.args.is_tpu and self.args.torch_xla_tpu_print_metrics:
                      import torch_xla.debug.metrics as met

                      self.print_fn(met.metrics_report()			)

               return min(A			) / 1_0.0
        except RuntimeError as e:
               self.print_fn(f"""Doesn't fit on GPU. {e}"""			)
               return "N/A"





 def  SCREAMING_SNAKE_CASE(	self ,		A			):






        '''simple docstring'''




        try:
               if self.args.trace_memory_line_by_line:
                      lowercase	:		int    =   start_memory_tracing('''transformers'''			)

               if self.args.is_tpu:
                      # tpu
                      raise NotImplementedError(
                          '''Memory Benchmarking is currently not implemented for TPU. Please disable memory benchmarking with'''
                          ''' `--no-memory` or `args.memory=False`'''			)
               elif self.args.is_gpu:
                      if not is_pyanvml_available():
                             logger.warning(
                                 '''py3nvml not installed, we won\'t log GPU memory usage. '''
                                 '''Install py3nvml (pip install py3nvml) to log information about GPU.'''			)
                             lowercase	:		str    =   '''N/A'''
                      else:
                             logger.info(
                                 '''Measuring total GPU usage on GPU device. Make sure to not have additional processes running'''
                                 ''' on the same GPU.'''			)
                             # init nvml
                             nvml.nvmlInit()
                             func()
                             lowercase	:		List[Any]    =   nvml.nvmlDeviceGetHandleByIndex(self.args.device_idx			)
                             lowercase	:		List[Any]    =   nvml.nvmlDeviceGetMemoryInfo(A			)
                             lowercase	:		int    =   meminfo.used
                             lowercase	:		Dict    =   Memory(A			)
                             # shutdown nvml
                             nvml.nvmlShutdown()
               else:
                      # cpu
                      lowercase	:		Optional[Any]    =   measure_peak_memory_cpu(A			)
                      lowercase	:		Union[str, Any]    =   Memory(A			) if isinstance(A ,		A			) else memory_bytes

               if self.args.trace_memory_line_by_line:
                      lowercase	:		Tuple    =   stop_memory_tracing(A			)
               else:
                      lowercase	:		int    =   None

               return memory, summary
        except RuntimeError as e:
               self.print_fn(f"""Doesn't fit on GPU. {e}"""			)
               return "N/A", None




