


import random
import timeit
from functools import wraps
from typing import Callable, Optional

from ..configuration_utils import PretrainedConfig
from ..models.auto.modeling_tf_auto import TF_MODEL_MAPPING, TF_MODEL_WITH_LM_HEAD_MAPPING
from ..utils import is_pyanvml_available, is_tf_available, logging
from .benchmark_utils import (
    Benchmark,
    Memory,
    MemorySummary,
    measure_peak_memory_cpu,
    start_memory_tracing,
    stop_memory_tracing,
)


if is_tf_available():
	import tensorflow as tf
	from tensorflow.python.framework.errors_impl import ResourceExhaustedError

	from .benchmark_args_tf import TensorFlowBenchmarkArguments

if is_pyanvml_available():
	import pyanvml.pyanvml as nvml

A							:					List[str]     						=     logging.get_logger(__name__)





def 	_lowerCAmelCase       (    _lowerCAmelCase      ,	_lowerCAmelCase )						->	Dict:


						'''simple docstring'''






						def run_func(_lowerCAmelCase ):
												@wraps(_lowerCAmelCase )
												def run_in_eager_mode(*_lowerCAmelCase      ,	**_lowerCAmelCase ):
																		return func(*_lowerCAmelCase      ,	**_lowerCAmelCase )

												@wraps(_lowerCAmelCase )
												@tf.function(experimental_compile=_lowerCAmelCase )
												def run_in_graph_mode(*_lowerCAmelCase      ,	**_lowerCAmelCase ):
																		return func(*_lowerCAmelCase      ,	**_lowerCAmelCase )

												if do_eager_mode is True:
																		if use_xla is not False:
																								raise ValueError(
																								    "Cannot run model in XLA, if `args.eager_mode` is set to `True`. Please set `args.eager_mode=False`." )
																		return run_in_eager_mode
												else:
																		return run_in_graph_mode

						return run_func





def 	_lowerCAmelCase       (    _lowerCAmelCase      ,	_lowerCAmelCase      ,	_lowerCAmelCase )						->	["tf.Tensor"]:


						'''simple docstring'''






						__snake_case				=		random.Random()
						__snake_case				=		[rng.randint(0      ,	vocab_size - 1 ) for i in range(batch_size * sequence_length )]
						return tf.constant(_lowerCAmelCase      ,	shape=(batch_size, sequence_length)      ,	dtype=tf.intaa )






class     UpperCamelCase(  _a   ):
					snake_case_		:				TensorFlowBenchmarkArguments
					snake_case_		:				PretrainedConfig
					snake_case_		:				str										=	"TensorFlow"


					@property
					def 							SCREAMING_SNAKE_CASE_  (						self	:		int						)			->	Dict:




											'''simple docstring'''

											return tf.__version__


					def 							SCREAMING_SNAKE_CASE_  (						self	:		List[str]     ,    SCREAMING_SNAKE_CASE	:		str     ,    SCREAMING_SNAKE_CASE	:		int     ,    SCREAMING_SNAKE_CASE	:		int						)			->	float:




											'''simple docstring'''

											__snake_case				=		self.args.strategy
											if strategy is None:
																	raise ValueError("A device strategy has to be initialized before using TensorFlow."						)
											__snake_case				=		self._prepare_inference_func(SCREAMING_SNAKE_CASE     ,    SCREAMING_SNAKE_CASE     ,    SCREAMING_SNAKE_CASE						)
											return self._measure_speed(_inference						)


					def 							SCREAMING_SNAKE_CASE_  (						self	:		Any     ,    SCREAMING_SNAKE_CASE	:		str     ,    SCREAMING_SNAKE_CASE	:		int     ,    SCREAMING_SNAKE_CASE	:		int						)			->	float:




											'''simple docstring'''

											__snake_case				=		self.args.strategy
											if strategy is None:
																	raise ValueError("A device strategy has to be initialized before using TensorFlow."						)
											__snake_case				=		self._prepare_train_func(SCREAMING_SNAKE_CASE     ,    SCREAMING_SNAKE_CASE     ,    SCREAMING_SNAKE_CASE						)
											return self._measure_speed(_train						)


					def 							SCREAMING_SNAKE_CASE_  (						self	:		List[Any]     ,    SCREAMING_SNAKE_CASE	:		str     ,    SCREAMING_SNAKE_CASE	:		int     ,    SCREAMING_SNAKE_CASE	:		int						)			->	[Memory, Optional[MemorySummary]]:




											'''simple docstring'''

											if self.args.is_gpu:
																	tf.config.experimental.set_memory_growth(self.args.gpu_list[self.args.device_idx]     ,    SCREAMING_SNAKE_CASE						)
											__snake_case				=		self.args.strategy
											if strategy is None:
																	raise ValueError("A device strategy has to be initialized before using TensorFlow."						)
											__snake_case				=		self._prepare_inference_func(SCREAMING_SNAKE_CASE     ,    SCREAMING_SNAKE_CASE     ,    SCREAMING_SNAKE_CASE						)
											return self._measure_memory(_inference						)


					def 							SCREAMING_SNAKE_CASE_  (						self	:		Tuple     ,    SCREAMING_SNAKE_CASE	:		str     ,    SCREAMING_SNAKE_CASE	:		int     ,    SCREAMING_SNAKE_CASE	:		int						)			->	[Memory, Optional[MemorySummary]]:




											'''simple docstring'''

											if self.args.is_gpu:
																	tf.config.experimental.set_memory_growth(self.args.gpu_list[self.args.device_idx]     ,    SCREAMING_SNAKE_CASE						)
											__snake_case				=		self.args.strategy
											if strategy is None:
																	raise ValueError("A device strategy has to be initialized before using TensorFlow."						)

											__snake_case				=		self._prepare_train_func(SCREAMING_SNAKE_CASE     ,    SCREAMING_SNAKE_CASE     ,    SCREAMING_SNAKE_CASE						)
											return self._measure_memory(_train						)


					def 							SCREAMING_SNAKE_CASE_  (						self	:		int     ,    SCREAMING_SNAKE_CASE	:		str     ,    SCREAMING_SNAKE_CASE	:		int     ,    SCREAMING_SNAKE_CASE	:		int						)			->	Callable[[], None]:




											'''simple docstring'''

											__snake_case				=		self.config_dict[model_name]

											if self.args.fpaa:
																	raise NotImplementedError("Mixed precision is currently not supported."						)

											__snake_case				=		(
											    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:
																							__snake_case				=		"TF" + config.architectures[0]  # prepend 'TF' for tensorflow model
																							__snake_case				=		__import__("transformers"     ,    fromlist=[model_class]						)
																							__snake_case				=		getattr(SCREAMING_SNAKE_CASE     ,    SCREAMING_SNAKE_CASE						)
																							__snake_case				=		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:
																	__snake_case				=		TF_MODEL_MAPPING[config.__class__](SCREAMING_SNAKE_CASE						)

											# encoder-decoder has vocab size saved differently
											__snake_case				=		config.vocab_size if hasattr(SCREAMING_SNAKE_CASE     ,    "vocab_size"						) else config.encoder.vocab_size
											__snake_case				=		random_input_ids(SCREAMING_SNAKE_CASE     ,    SCREAMING_SNAKE_CASE     ,    SCREAMING_SNAKE_CASE						)

											@run_with_tf_optimizations(self.args.eager_mode     ,    self.args.use_xla						)
											def encoder_decoder_forward():
																	return model(SCREAMING_SNAKE_CASE     ,    decoder_input_ids=SCREAMING_SNAKE_CASE     ,    training=SCREAMING_SNAKE_CASE						)

											@run_with_tf_optimizations(self.args.eager_mode     ,    self.args.use_xla						)
											def encoder_forward():
																	return model(SCREAMING_SNAKE_CASE     ,    training=SCREAMING_SNAKE_CASE						)

											__snake_case				=		encoder_decoder_forward if config.is_encoder_decoder else encoder_forward

											return _inference


					def 							SCREAMING_SNAKE_CASE_  (						self	:		Union[str, Any]     ,    SCREAMING_SNAKE_CASE	:		str     ,    SCREAMING_SNAKE_CASE	:		int     ,    SCREAMING_SNAKE_CASE	:		int						)			->	Callable[[], None]:




											'''simple docstring'''

											__snake_case				=		self.config_dict[model_name]

											if self.args.eager_mode is not False:
																	raise ValueError("Training cannot be done in eager mode. Please make sure that `args.eager_mode = False`."						)

											if self.args.fpaa:
																	raise NotImplementedError("Mixed precision is currently not supported."						)

											__snake_case				=		(
											    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:
																							__snake_case				=		"TF" + config.architectures[0]  # prepend 'TF' for tensorflow model
																							__snake_case				=		__import__("transformers"     ,    fromlist=[model_class]						)
																							__snake_case				=		getattr(SCREAMING_SNAKE_CASE     ,    SCREAMING_SNAKE_CASE						)
																							__snake_case				=		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:
																	__snake_case				=		TF_MODEL_WITH_LM_HEAD_MAPPING[config.__class__](SCREAMING_SNAKE_CASE						)

											# encoder-decoder has vocab size saved differently
											__snake_case				=		config.vocab_size if hasattr(SCREAMING_SNAKE_CASE     ,    "vocab_size"						) else config.encoder.vocab_size
											__snake_case				=		random_input_ids(SCREAMING_SNAKE_CASE     ,    SCREAMING_SNAKE_CASE     ,    SCREAMING_SNAKE_CASE						)

											@run_with_tf_optimizations(self.args.eager_mode     ,    self.args.use_xla						)
											def encoder_decoder_train():
																	__snake_case				=		model(SCREAMING_SNAKE_CASE     ,    decoder_input_ids=SCREAMING_SNAKE_CASE     ,    labels=SCREAMING_SNAKE_CASE     ,    training=SCREAMING_SNAKE_CASE						)[0]
																	__snake_case				=		tf.gradients(SCREAMING_SNAKE_CASE     ,    model.trainable_variables						)
																	return gradients

											@run_with_tf_optimizations(self.args.eager_mode     ,    self.args.use_xla						)
											def encoder_train():
																	__snake_case				=		model(SCREAMING_SNAKE_CASE     ,    labels=SCREAMING_SNAKE_CASE     ,    training=SCREAMING_SNAKE_CASE						)[0]
																	__snake_case				=		tf.gradients(SCREAMING_SNAKE_CASE     ,    model.trainable_variables						)
																	return gradients

											__snake_case				=		encoder_decoder_train if config.is_encoder_decoder else encoder_train

											return _train


					def 							SCREAMING_SNAKE_CASE_  (						self	:		Dict     ,    SCREAMING_SNAKE_CASE	:		Dict						)			->	float:




											'''simple docstring'''

											with self.args.strategy.scope():
																	try:
																							if self.args.is_tpu or self.args.use_xla:
																													# run additional 10 times to stabilize compilation for tpu
																													logger.info("Do inference on TPU. 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
																							__snake_case				=		timeit.repeat(
																							    SCREAMING_SNAKE_CASE     ,    repeat=self.args.repeat     ,    number=1_0     ,    )

																							return min(SCREAMING_SNAKE_CASE						) / 10.0
																	except ResourceExhaustedError as e:
																							self.print_fn(f'''Doesn\'t fit on GPU. {e}'''						)






					def 							SCREAMING_SNAKE_CASE_  (						self	:		Optional[Any]     ,    SCREAMING_SNAKE_CASE	:		Callable[[], None]						)			->	[Memory, MemorySummary]:




											'''simple docstring'''

											logger.info(
											    "Note that TensorFlow allocates more memory than "
											    "it might need to speed up computation. "
											    "The memory reported here corresponds to the memory "
											    "reported by `nvidia-smi`, which can vary depending "
											    "on total available memory on the GPU that is used."						)
											with self.args.strategy.scope():
																	try:
																							if self.args.trace_memory_line_by_line:
																													if not self.args.eager_mode:
																																			raise ValueError(
																																			    "`args.eager_mode` is set to `False`. Make sure to run model in eager mode to measure memory"
																																			    " consumption line by line."						)
																													__snake_case				=		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 `args.memory=False`"						)
																							elif self.args.is_gpu:
																													# 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."						)
																																			__snake_case				=		"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()
																																			__snake_case				=		nvml.nvmlDeviceGetHandleByIndex(self.args.device_idx						)
																																			__snake_case				=		nvml.nvmlDeviceGetMemoryInfo(SCREAMING_SNAKE_CASE						)
																																			__snake_case				=		meminfo.used
																																			__snake_case				=		Memory(SCREAMING_SNAKE_CASE						)
																																			# shutdown nvml
																																			nvml.nvmlShutdown()
																							else:
																													# cpu
																													if self.args.trace_memory_line_by_line:
																																			logger.info(
																																			    "When enabling line by line tracing, the max peak memory for CPU is inaccurate in"
																																			    " TensorFlow."						)
																																			__snake_case				=		None
																													else:
																																			__snake_case				=		measure_peak_memory_cpu(SCREAMING_SNAKE_CASE						)
																																			__snake_case				=		Memory(SCREAMING_SNAKE_CASE						) if isinstance(SCREAMING_SNAKE_CASE     ,    SCREAMING_SNAKE_CASE						) else memory_bytes
																							if self.args.trace_memory_line_by_line:
																													__snake_case				=		stop_memory_tracing(SCREAMING_SNAKE_CASE						)
																													if memory is None:
																																			__snake_case				=		summary.total
																							else:
																													__snake_case				=		None

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









import warnings

from ...utils import logging
from .image_processing_beit import BeitImageProcessor


A							:					Any     						=     logging.get_logger(__name__)






class     UpperCamelCase(  _a   ):


					def __init__(						self	:		Optional[int]     ,    *SCREAMING_SNAKE_CASE	:		Tuple     ,    **SCREAMING_SNAKE_CASE	:		List[Any]						)			->	None:




											'''simple docstring'''

											warnings.warn(
											    "The class BeitFeatureExtractor is deprecated and will be removed in version 5 of Transformers. Please"
											    " use BeitImageProcessor instead."     ,    SCREAMING_SNAKE_CASE     ,    )
											super().__init__(*SCREAMING_SNAKE_CASE     ,    **SCREAMING_SNAKE_CASE						)





