


'''simple docstring'''





from typing import List, Optional, Union

import numpy as np

from ...feature_extraction_sequence_utils import SequenceFeatureExtractor
from ...feature_extraction_utils import BatchFeature
from ...utils import PaddingStrategy, TensorType, logging


lowerCamelCase		=	logging.get_logger(__name__)





class       _a							(       _lowercase):
	_a						:						Optional[int]   					=							['''input_values''', '''attention_mask''']




	def __init__(      self		:	Optional[int]	,      _SCREAMING_SNAKE_CASE		:	str=1	,      _SCREAMING_SNAKE_CASE		:	List[Any]=1_6000	,      _SCREAMING_SNAKE_CASE		:	Union[str, Any]=0.0	,      _SCREAMING_SNAKE_CASE		:	Optional[int]=False	,      _SCREAMING_SNAKE_CASE		:	List[str]=True	,      **_SCREAMING_SNAKE_CASE		:	List[str]	,      )-> Optional[Any]:
			super().__init__(feature_size=_SCREAMING_SNAKE_CASE	,      sampling_rate=_SCREAMING_SNAKE_CASE	,      padding_value=_SCREAMING_SNAKE_CASE	,      **_SCREAMING_SNAKE_CASE	)
			lowerCAmelCase__     :    Optional[int]					  =      return_attention_mask
			lowerCAmelCase__     :    Optional[int]					  =      do_normalize




	@staticmethod
	def 							UpperCAmelCase__(      _SCREAMING_SNAKE_CASE		:	List[np.ndarray]	,      _SCREAMING_SNAKE_CASE		:	List[np.ndarray]	,      _SCREAMING_SNAKE_CASE		:	float = 0.0	)-> List[np.ndarray]:
			if attention_mask is not None:
					lowerCAmelCase__     :    List[str]					  =      np.array(_SCREAMING_SNAKE_CASE	,      np.intaa	)
					lowerCAmelCase__     :    Dict					  =      []

					for vector, length in zip(_SCREAMING_SNAKE_CASE	,      attention_mask.sum(-1	)	):
							lowerCAmelCase__     :    Union[str, Any]					  =      (vector - vector[:length].mean()) / np.sqrt(vector[:length].var() + 1E-7	)
							if length < normed_slice.shape[0]:
									lowerCAmelCase__     :    int					  =      padding_value

							normed_input_values.append(_SCREAMING_SNAKE_CASE	)
			else:
					lowerCAmelCase__     :    Any					  =      [(x - x.mean()) / np.sqrt(x.var() + 1E-7	) for x in input_values]

			return normed_input_values




	def __call__(      self		:	Union[str, Any]	,      _SCREAMING_SNAKE_CASE		:	Union[np.ndarray, List[float], List[np.ndarray], List[List[float]]]	,      _SCREAMING_SNAKE_CASE		:	Union[bool, str, PaddingStrategy] = False	,      _SCREAMING_SNAKE_CASE		:	Optional[int] = None	,      _SCREAMING_SNAKE_CASE		:	bool = False	,      _SCREAMING_SNAKE_CASE		:	Optional[int] = None	,      _SCREAMING_SNAKE_CASE		:	Optional[bool] = None	,      _SCREAMING_SNAKE_CASE		:	Optional[Union[str, TensorType]] = None	,      _SCREAMING_SNAKE_CASE		:	Optional[int] = None	,      **_SCREAMING_SNAKE_CASE		:	Any	,      )-> BatchFeature:

			if sampling_rate is not None:
					if sampling_rate != self.sampling_rate:
							raise ValueError(
							    F'The model corresponding to this feature extractor: {self} was trained using a sampling rate of'
							    F' {self.sampling_rate}. Please make sure that the provided `raw_speech` input was sampled with'
							    F' {self.sampling_rate} and not {sampling_rate}.'	)
			else:
					logger.warning(
					    '''It is strongly recommended to pass the ``sampling_rate`` argument to this function. '''
					    '''Failing to do so can result in silent errors that might be hard to debug.'''	)

			lowerCAmelCase__     :    Union[str, Any]					  =      isinstance(_SCREAMING_SNAKE_CASE	,      np.ndarray	) and len(raw_speech.shape	) > 1
			if is_batched_numpy and len(raw_speech.shape	) > 2:
					raise ValueError(F'Only mono-channel audio is supported for input to {self}'	)
			lowerCAmelCase__     :    Optional[Any]					  =      is_batched_numpy or (
			    isinstance(_SCREAMING_SNAKE_CASE	,      (list, tuple)	) and (isinstance(raw_speech[0]	,      (np.ndarray, tuple, list)	))
			)

			# always return batch
			if not is_batched:
					lowerCAmelCase__     :    Union[str, Any]					  =      [raw_speech]

			# convert into correct format for padding
			lowerCAmelCase__     :    Dict					  =      BatchFeature({'''input_values''': raw_speech}	)

			lowerCAmelCase__     :    Union[str, Any]					  =      self.pad(
			    _SCREAMING_SNAKE_CASE	,      padding=_SCREAMING_SNAKE_CASE	,      max_length=_SCREAMING_SNAKE_CASE	,      truncation=_SCREAMING_SNAKE_CASE	,      pad_to_multiple_of=_SCREAMING_SNAKE_CASE	,      return_attention_mask=_SCREAMING_SNAKE_CASE	,      )

			# convert input values to correct format
			lowerCAmelCase__     :    Union[str, Any]					  =      padded_inputs['''input_values''']
			if not isinstance(input_values[0]	,      np.ndarray	):
					lowerCAmelCase__     :    int					  =      [np.asarray(_SCREAMING_SNAKE_CASE	,      dtype=np.floataa	) for array in input_values]
			elif (
			    not isinstance(_SCREAMING_SNAKE_CASE	,      np.ndarray	)
			    and isinstance(input_values[0]	,      np.ndarray	)
			    and input_values[0].dtype is np.dtype(np.floataa	)
			):
					lowerCAmelCase__     :    Union[str, Any]					  =      [array.astype(np.floataa	) for array in input_values]
			elif isinstance(_SCREAMING_SNAKE_CASE	,      np.ndarray	) and input_values.dtype is np.dtype(np.floataa	):
					lowerCAmelCase__     :    str					  =      input_values.astype(np.floataa	)

			# convert attention_mask to correct format
			lowerCAmelCase__     :    List[Any]					  =      padded_inputs.get('''attention_mask'''	)
			if attention_mask is not None:
					lowerCAmelCase__     :    List[str]					  =      [np.asarray(_SCREAMING_SNAKE_CASE	,      dtype=np.intaa	) for array in attention_mask]

			# zero-mean and unit-variance normalization
			if self.do_normalize:
					lowerCAmelCase__     :    Dict					  =      (
					    attention_mask
					    if self._get_padding_strategies(_SCREAMING_SNAKE_CASE	,      max_length=_SCREAMING_SNAKE_CASE	) is not PaddingStrategy.DO_NOT_PAD
					    else None
					)
					lowerCAmelCase__     :    Union[str, Any]					  =      self.zero_mean_unit_var_norm(
					    padded_inputs['''input_values''']	,      attention_mask=_SCREAMING_SNAKE_CASE	,      padding_value=self.padding_value	)

			if return_tensors is not None:
					lowerCAmelCase__     :    Optional[int]					  =      padded_inputs.convert_to_tensors(_SCREAMING_SNAKE_CASE	)

			return padded_inputs








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


lowerCamelCase		=	logging.get_logger(__name__)





class       _a							(       _lowercase):
	_a						:						PyTorchBenchmarkArguments
	_a						:						PretrainedConfig
	_a						:						str   					=							"PyTorch"




	@property
	def 							UpperCAmelCase__(      self		:	Dict	)-> Any:
			return torch.__version__




	def 							UpperCAmelCase__(      self		:	List[Any]	,      _SCREAMING_SNAKE_CASE		:	str	,      _SCREAMING_SNAKE_CASE		:	int	,      _SCREAMING_SNAKE_CASE		:	int	)-> float:
			lowerCAmelCase__     :    Optional[Any]					  =      self._prepare_inference_func(_SCREAMING_SNAKE_CASE	,      _SCREAMING_SNAKE_CASE	,      _SCREAMING_SNAKE_CASE	)
			return self._measure_speed(_inference	)




	def 							UpperCAmelCase__(      self		:	List[str]	,      _SCREAMING_SNAKE_CASE		:	str	,      _SCREAMING_SNAKE_CASE		:	int	,      _SCREAMING_SNAKE_CASE		:	int	)-> [Memory, Optional[MemorySummary]]:
			lowerCAmelCase__     :    List[Any]					  =      self._prepare_inference_func(_SCREAMING_SNAKE_CASE	,      _SCREAMING_SNAKE_CASE	,      _SCREAMING_SNAKE_CASE	)
			return self._measure_memory(_inference	)




	def 							UpperCAmelCase__(      self		:	Tuple	,      _SCREAMING_SNAKE_CASE		:	str	,      _SCREAMING_SNAKE_CASE		:	int	,      _SCREAMING_SNAKE_CASE		:	int	)-> float:
			lowerCAmelCase__     :    Any					  =      self._prepare_train_func(_SCREAMING_SNAKE_CASE	,      _SCREAMING_SNAKE_CASE	,      _SCREAMING_SNAKE_CASE	)
			return self._measure_speed(_train	)




	def 							UpperCAmelCase__(      self		:	Optional[Any]	,      _SCREAMING_SNAKE_CASE		:	str	,      _SCREAMING_SNAKE_CASE		:	int	,      _SCREAMING_SNAKE_CASE		:	int	)-> [Memory, Optional[MemorySummary]]:
			lowerCAmelCase__     :    Tuple					  =      self._prepare_train_func(_SCREAMING_SNAKE_CASE	,      _SCREAMING_SNAKE_CASE	,      _SCREAMING_SNAKE_CASE	)
			return self._measure_memory(_train	)




	def 							UpperCAmelCase__(      self		:	int	,      _SCREAMING_SNAKE_CASE		:	str	,      _SCREAMING_SNAKE_CASE		:	int	,      _SCREAMING_SNAKE_CASE		:	int	)-> Callable[[], None]:
			lowerCAmelCase__     :    int					  =      self.config_dict[model_name]

			if self.args.torchscript:
					lowerCAmelCase__     :    List[Any]					  =      True

			lowerCAmelCase__     :    List[Any]					  =      (
			    hasattr(_SCREAMING_SNAKE_CASE	,      '''architectures'''	)
			    and isinstance(config.architectures	,      _SCREAMING_SNAKE_CASE	)
			    and len(config.architectures	) > 0
			)
			if not self.args.only_pretrain_model and has_model_class_in_config:
					try:
							lowerCAmelCase__     :    Dict					  =      config.architectures[0]
							lowerCAmelCase__     :    Optional[Any]					  =      __import__('''transformers'''	,      fromlist=[model_class]	)
							lowerCAmelCase__     :    Any					  =      getattr(_SCREAMING_SNAKE_CASE	,      _SCREAMING_SNAKE_CASE	)
							lowerCAmelCase__     :    List[Any]					  =      model_cls(_SCREAMING_SNAKE_CASE	)
					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:
					lowerCAmelCase__     :    Union[str, Any]					  =      MODEL_MAPPING[config.__class__](_SCREAMING_SNAKE_CASE	)

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

			# encoder-decoder has vocab size saved differently
			lowerCAmelCase__     :    str					  =      config.vocab_size if hasattr(_SCREAMING_SNAKE_CASE	,      '''vocab_size'''	) else config.encoder.vocab_size
			lowerCAmelCase__     :    Dict					  =      torch.randint(_SCREAMING_SNAKE_CASE	,      (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():
							lowerCAmelCase__     :    int					  =      torch.jit.trace(_SCREAMING_SNAKE_CASE	,      _SCREAMING_SNAKE_CASE	)
			else:
					lowerCAmelCase__     :    Optional[int]					  =      model

			def encoder_decoder_forward():
					with torch.no_grad():
							lowerCAmelCase__     :    str					  =      inference_model(_SCREAMING_SNAKE_CASE	,      decoder_input_ids=_SCREAMING_SNAKE_CASE	)
					return outputs

			def encoder_forward():
					with torch.no_grad():
							lowerCAmelCase__     :    List[Any]					  =      inference_model(_SCREAMING_SNAKE_CASE	)
					return outputs

			lowerCAmelCase__     :    Any					  =      encoder_decoder_forward if config.is_encoder_decoder else encoder_forward
			return _forward




	def 							UpperCAmelCase__(      self		:	str	,      _SCREAMING_SNAKE_CASE		:	str	,      _SCREAMING_SNAKE_CASE		:	int	,      _SCREAMING_SNAKE_CASE		:	int	)-> Callable[[], None]:
			lowerCAmelCase__     :    Optional[int]					  =      self.config_dict[model_name]

			lowerCAmelCase__     :    List[str]					  =      (
			    hasattr(_SCREAMING_SNAKE_CASE	,      '''architectures'''	)
			    and isinstance(config.architectures	,      _SCREAMING_SNAKE_CASE	)
			    and len(config.architectures	) > 0
			)
			if not self.args.only_pretrain_model and has_model_class_in_config:
					try:
							lowerCAmelCase__     :    Optional[Any]					  =      config.architectures[0]
							lowerCAmelCase__     :    List[str]					  =      __import__('''transformers'''	,      fromlist=[model_class]	)
							lowerCAmelCase__     :    str					  =      getattr(_SCREAMING_SNAKE_CASE	,      _SCREAMING_SNAKE_CASE	)
							lowerCAmelCase__     :    Union[str, Any]					  =      model_cls(_SCREAMING_SNAKE_CASE	)
					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:
					lowerCAmelCase__     :    Any					  =      MODEL_WITH_LM_HEAD_MAPPING[config.__class__](_SCREAMING_SNAKE_CASE	)

			if self.args.torchscript:
					raise NotImplementedError('''Training for torchscript is currently not implemented'''	)
			else:
					lowerCAmelCase__     :    Union[str, Any]					  =      model

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

			# encoder-decoder has vocab size saved differently
			lowerCAmelCase__     :    Union[str, Any]					  =      config.vocab_size if hasattr(_SCREAMING_SNAKE_CASE	,      '''vocab_size'''	) else config.encoder.vocab_size
			lowerCAmelCase__     :    List[str]					  =      torch.randint(_SCREAMING_SNAKE_CASE	,      (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():
					lowerCAmelCase__     :    Optional[Any]					  =      train_model(_SCREAMING_SNAKE_CASE	,      labels=_SCREAMING_SNAKE_CASE	)[0]
					loss.backward()
					return loss

			def compute_loss_and_backprob_encoder_decoder():
					lowerCAmelCase__     :    List[str]					  =      train_model(_SCREAMING_SNAKE_CASE	,      decoder_input_ids=_SCREAMING_SNAKE_CASE	,      labels=_SCREAMING_SNAKE_CASE	)[0]
					loss.backward()
					return loss

			lowerCAmelCase__     :    List[Any]					  =      (
			    compute_loss_and_backprob_encoder_decoder
			    if config.is_encoder_decoder
			    else compute_loss_and_backprob_encoder
			)
			return _train




	def 							UpperCAmelCase__(      self		:	Union[str, Any]	,      _SCREAMING_SNAKE_CASE		:	List[str]	)-> float:
			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(
							    _SCREAMING_SNAKE_CASE	,      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
					lowerCAmelCase__     :    Tuple					  =      timeit.repeat(
					    _SCREAMING_SNAKE_CASE	,      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(_SCREAMING_SNAKE_CASE	) / 10.0
			except RuntimeError as e:
					self.print_fn(F'Doesn\'t fit on GPU. {e}'	)
					return "N/A"




	def 							UpperCAmelCase__(      self		:	int	,      _SCREAMING_SNAKE_CASE		:	Callable[[], None]	)-> [Memory, MemorySummary]:
			try:
					if self.args.trace_memory_line_by_line:
							lowerCAmelCase__     :    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.'''	)
									lowerCAmelCase__     :    Union[str, Any]					  =      '''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()
									lowerCAmelCase__     :    Optional[int]					  =      nvml.nvmlDeviceGetHandleByIndex(self.args.device_idx	)
									lowerCAmelCase__     :    Any					  =      nvml.nvmlDeviceGetMemoryInfo(_SCREAMING_SNAKE_CASE	)
									lowerCAmelCase__     :    int					  =      meminfo.used
									lowerCAmelCase__     :    Tuple					  =      Memory(_SCREAMING_SNAKE_CASE	)
									# shutdown nvml
									nvml.nvmlShutdown()
					else:
							# cpu
							lowerCAmelCase__     :    Union[str, Any]					  =      measure_peak_memory_cpu(_SCREAMING_SNAKE_CASE	)
							lowerCAmelCase__     :    Union[str, Any]					  =      Memory(_SCREAMING_SNAKE_CASE	) if isinstance(_SCREAMING_SNAKE_CASE	,      _SCREAMING_SNAKE_CASE	) else memory_bytes

					if self.args.trace_memory_line_by_line:
							lowerCAmelCase__     :    int					  =      stop_memory_tracing(_SCREAMING_SNAKE_CASE	)
					else:
							lowerCAmelCase__     :    str					  =      None

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




