




import tempfile
import unittest

import numpy as np
from huggingface_hub import HfFolder, delete_repo
from requests.exceptions import HTTPError

from transformers import BertConfig, is_flax_available
from transformers.testing_utils import TOKEN, USER, is_staging_test, require_flax


if is_flax_available():
							import os

							from flax.core.frozen_dict import unfreeze
							from flax.traverse_util import flatten_dict

							from transformers import FlaxBertModel

							UpperCAmelCase_		:				List[str]									=     '''0.12'''  # assumed parallelism: 8




@require_flax
@is_staging_test
class 		__A      (			unittest.TestCase			):

						@classmethod
						def     A__						(		cls   :Tuple ):
										'''simple docstring'''

										__magic_name__	:	List[str]								=TOKEN
										HfFolder.save_token(snake_case__ )

						@classmethod
						def     A__						(		cls   :List[Any] ):
										'''simple docstring'''

										try:
														delete_repo(token=cls._token    , repo_id="""test-model-flax""" )
										except HTTPError:
														pass

										try:
														delete_repo(token=cls._token    , repo_id="""valid_org/test-model-flax-org""" )
										except HTTPError:
														pass

						def     A__						(		self   :List[str] ):
										'''simple docstring'''

										__magic_name__	:	str								=BertConfig(
										    vocab_size=99    , hidden_size=32    , num_hidden_layers=5    , num_attention_heads=4    , intermediate_size=37 )
										__magic_name__	:	Any								=FlaxBertModel(snake_case__ )
										model.push_to_hub("""test-model-flax"""    , use_auth_token=self._token )

										__magic_name__	:	List[Any]								=FlaxBertModel.from_pretrained(f"{USER}/test-model-flax" )

										__magic_name__	:	Any								=flatten_dict(unfreeze(model.params ) )
										__magic_name__	:	Union[str, Any]								=flatten_dict(unfreeze(new_model.params ) )

										for key in base_params.keys():
														__magic_name__	:	Dict								=(base_params[key] - new_params[key]).sum().item()
														self.assertLessEqual(snake_case__    , 1E-3    , msg=f"{key} not identical" )

										# Reset repo
										delete_repo(token=self._token    , repo_id="""test-model-flax""" )

										# Push to hub via save_pretrained
										with tempfile.TemporaryDirectory() as tmp_dir:
														model.save_pretrained(snake_case__    , repo_id="""test-model-flax"""    , push_to_hub=snake_case__    , use_auth_token=self._token )

										__magic_name__	:	Any								=FlaxBertModel.from_pretrained(f"{USER}/test-model-flax" )

										__magic_name__	:	Optional[int]								=flatten_dict(unfreeze(model.params ) )
										__magic_name__	:	Tuple								=flatten_dict(unfreeze(new_model.params ) )

										for key in base_params.keys():
														__magic_name__	:	Dict								=(base_params[key] - new_params[key]).sum().item()
														self.assertLessEqual(snake_case__    , 1E-3    , msg=f"{key} not identical" )


						def     A__						(		self   :Tuple ):
										'''simple docstring'''

										__magic_name__	:	Any								=BertConfig(
										    vocab_size=99    , hidden_size=32    , num_hidden_layers=5    , num_attention_heads=4    , intermediate_size=37 )
										__magic_name__	:	int								=FlaxBertModel(snake_case__ )
										model.push_to_hub("""valid_org/test-model-flax-org"""    , use_auth_token=self._token )

										__magic_name__	:	Union[str, Any]								=FlaxBertModel.from_pretrained("""valid_org/test-model-flax-org""" )

										__magic_name__	:	List[Any]								=flatten_dict(unfreeze(model.params ) )
										__magic_name__	:	Optional[Any]								=flatten_dict(unfreeze(new_model.params ) )

										for key in base_params.keys():
														__magic_name__	:	List[Any]								=(base_params[key] - new_params[key]).sum().item()
														self.assertLessEqual(snake_case__    , 1E-3    , msg=f"{key} not identical" )

										# Reset repo
										delete_repo(token=self._token    , repo_id="""valid_org/test-model-flax-org""" )

										# Push to hub via save_pretrained
										with tempfile.TemporaryDirectory() as tmp_dir:
														model.save_pretrained(
														    snake_case__    , repo_id="""valid_org/test-model-flax-org"""    , push_to_hub=snake_case__    , use_auth_token=self._token )

										__magic_name__	:	Optional[int]								=FlaxBertModel.from_pretrained("""valid_org/test-model-flax-org""" )

										__magic_name__	:	Optional[int]								=flatten_dict(unfreeze(model.params ) )
										__magic_name__	:	Dict								=flatten_dict(unfreeze(new_model.params ) )

										for key in base_params.keys():
														__magic_name__	:	Dict								=(base_params[key] - new_params[key]).sum().item()
														self.assertLessEqual(snake_case__    , 1E-3    , msg=f"{key} not identical" )




def 		lowerCAmelCase_   (	lowerCamelCase	,     lowerCamelCase   ):
				__magic_name__	:	List[Any]								=True
				__magic_name__	:	Dict								=flatten_dict(modela.params   )
				__magic_name__	:	Tuple								=flatten_dict(modela.params   )
				for key in flat_params_a.keys():
								if np.sum(np.abs(flat_params_a[key] - flat_params_a[key]   )   ) > 1E-4:
												__magic_name__	:	Dict								=False

				return models_are_equal




@require_flax
class 		__A      (			unittest.TestCase			):

						def     A__						(		self   :Any ):
										'''simple docstring'''

										__magic_name__	:	Union[str, Any]								=BertConfig.from_pretrained("""hf-internal-testing/tiny-bert-flax-only""" )
										__magic_name__	:	Union[str, Any]								=FlaxBertModel(snake_case__ )

										__magic_name__	:	List[str]								="""bert"""
										with tempfile.TemporaryDirectory() as tmp_dir:
														model.save_pretrained(os.path.join(snake_case__    , snake_case__ ) )

														with self.assertRaises(snake_case__ ):
																		__magic_name__	:	Optional[int]								=FlaxBertModel.from_pretrained(snake_case__ )

														__magic_name__	:	Any								=FlaxBertModel.from_pretrained(snake_case__    , subfolder=snake_case__ )

										self.assertTrue(check_models_equal(snake_case__    , snake_case__ ) )

						def     A__						(		self   :Optional[Any] ):
										'''simple docstring'''

										__magic_name__	:	int								=BertConfig.from_pretrained("""hf-internal-testing/tiny-bert-flax-only""" )
										__magic_name__	:	Optional[int]								=FlaxBertModel(snake_case__ )

										__magic_name__	:	Tuple								="""bert"""
										with tempfile.TemporaryDirectory() as tmp_dir:
														model.save_pretrained(os.path.join(snake_case__    , snake_case__ )    , max_shard_size="""10KB""" )

														with self.assertRaises(snake_case__ ):
																		__magic_name__	:	Optional[int]								=FlaxBertModel.from_pretrained(snake_case__ )

														__magic_name__	:	int								=FlaxBertModel.from_pretrained(snake_case__    , subfolder=snake_case__ )

										self.assertTrue(check_models_equal(snake_case__    , snake_case__ ) )

						def     A__						(		self   :Tuple ):
										'''simple docstring'''

										__magic_name__	:	Optional[Any]								="""bert"""
										__magic_name__	:	Tuple								="""hf-internal-testing/tiny-random-bert-subfolder"""

										with self.assertRaises(snake_case__ ):
														__magic_name__	:	List[str]								=FlaxBertModel.from_pretrained(snake_case__ )

										__magic_name__	:	Union[str, Any]								=FlaxBertModel.from_pretrained(snake_case__    , subfolder=snake_case__ )

										self.assertIsNotNone(snake_case__ )


						def     A__						(		self   :str ):
										'''simple docstring'''

										__magic_name__	:	Optional[Any]								="""bert"""
										__magic_name__	:	List[str]								="""hf-internal-testing/tiny-random-bert-sharded-subfolder"""
										with self.assertRaises(snake_case__ ):
														__magic_name__	:	List[Any]								=FlaxBertModel.from_pretrained(snake_case__ )

										__magic_name__	:	str								=FlaxBertModel.from_pretrained(snake_case__    , subfolder=snake_case__ )

										self.assertIsNotNone(snake_case__ )






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

UpperCAmelCase_		:				Optional[Any]									=     logging.get_logger(__name__)




def 		lowerCAmelCase_   (	lowerCamelCase	,     lowerCamelCase   ):
				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   ):
				__magic_name__	:	Dict								=random.Random()
				__magic_name__	:	Union[str, Any]								=[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 		__A      (			UpperCamelCase__			):
						UpperCamelCase     						=					42
						UpperCamelCase     						=					42
						UpperCamelCase     						=					"TensorFlow"

						@property
						def     A__						(		self   :str ):
										'''simple docstring'''

										return tf.__version__

						def     A__						(		self   :str    , __snake_case   :str    , __snake_case   :int    , __snake_case   :int ):
										'''simple docstring'''

										__magic_name__	:	Dict								=self.args.strategy
										if strategy is None:
														raise ValueError("""A device strategy has to be initialized before using TensorFlow.""" )
										__magic_name__	:	Union[str, Any]								=self._prepare_inference_func(__snake_case    , __snake_case    , __snake_case )
										return self._measure_speed(_inference )

						def     A__						(		self   :int    , __snake_case   :str    , __snake_case   :int    , __snake_case   :int ):
										'''simple docstring'''

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

						def     A__						(		self   :str    , __snake_case   :str    , __snake_case   :int    , __snake_case   :int ):
										'''simple docstring'''

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

						def     A__						(		self   :str    , __snake_case   :str    , __snake_case   :int    , __snake_case   :int ):
										'''simple docstring'''

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

										__magic_name__	:	Any								=self._prepare_train_func(__snake_case    , __snake_case    , __snake_case )
										return self._measure_memory(_train )

						def     A__						(		self   :int    , __snake_case   :str    , __snake_case   :int    , __snake_case   :int ):
										'''simple docstring'''

										__magic_name__	:	int								=self.config_dict[model_name]

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

										__magic_name__	:	Any								=(
										    hasattr(__snake_case    , """architectures""" )
										    and isinstance(config.architectures    , __snake_case )
										    and len(config.architectures ) > 0
										)
										if not self.args.only_pretrain_model and has_model_class_in_config:
														try:
																		__magic_name__	:	Optional[int]								="""TF""" + config.architectures[0]  # prepend 'TF' for tensorflow model
																		__magic_name__	:	Optional[int]								=__import__("""transformers"""    , fromlist=[model_class] )
																		__magic_name__	:	Optional[Any]								=getattr(__snake_case    , __snake_case )
																		__magic_name__	:	Optional[Any]								=model_cls(__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:
														__magic_name__	:	Optional[int]								=TF_MODEL_MAPPING[config.__class__](__snake_case )

										# encoder-decoder has vocab size saved differently
										__magic_name__	:	List[str]								=config.vocab_size if hasattr(__snake_case    , """vocab_size""" ) else config.encoder.vocab_size
										__magic_name__	:	Any								=random_input_ids(__snake_case    , __snake_case    , __snake_case )

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

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

										__magic_name__	:	Tuple								=encoder_decoder_forward if config.is_encoder_decoder else encoder_forward

										return _inference

						def     A__						(		self   :int    , __snake_case   :str    , __snake_case   :int    , __snake_case   :int ):
										'''simple docstring'''

										__magic_name__	:	Tuple								=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.""" )

										__magic_name__	:	int								=(
										    hasattr(__snake_case    , """architectures""" )
										    and isinstance(config.architectures    , __snake_case )
										    and len(config.architectures ) > 0
										)
										if not self.args.only_pretrain_model and has_model_class_in_config:
														try:
																		__magic_name__	:	List[Any]								="""TF""" + config.architectures[0]  # prepend 'TF' for tensorflow model
																		__magic_name__	:	Optional[int]								=__import__("""transformers"""    , fromlist=[model_class] )
																		__magic_name__	:	str								=getattr(__snake_case    , __snake_case )
																		__magic_name__	:	List[Any]								=model_cls(__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:
														__magic_name__	:	int								=TF_MODEL_WITH_LM_HEAD_MAPPING[config.__class__](__snake_case )

										# encoder-decoder has vocab size saved differently
										__magic_name__	:	int								=config.vocab_size if hasattr(__snake_case    , """vocab_size""" ) else config.encoder.vocab_size
										__magic_name__	:	Optional[Any]								=random_input_ids(__snake_case    , __snake_case    , __snake_case )

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

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

										__magic_name__	:	Union[str, Any]								=encoder_decoder_train if config.is_encoder_decoder else encoder_train

										return _train

						def     A__						(		self   :Any    , __snake_case   :Union[str, Any] ):
										'''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(__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
																		__magic_name__	:	Union[str, Any]								=timeit.repeat(
																		    __snake_case    , repeat=self.args.repeat    , number=10    , )

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


						def     A__						(		self   :Any    , __snake_case   :Callable[[], None] ):
										'''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.""" )
																						__magic_name__	:	Union[str, Any]								=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.""" )
																										__magic_name__	:	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()
																										__magic_name__	:	List[str]								=nvml.nvmlDeviceGetHandleByIndex(self.args.device_idx )
																										__magic_name__	:	Tuple								=nvml.nvmlDeviceGetMemoryInfo(__snake_case )
																										__magic_name__	:	Any								=meminfo.used
																										__magic_name__	:	str								=Memory(__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.""" )
																										__magic_name__	:	List[str]								=None
																						else:
																										__magic_name__	:	List[Any]								=measure_peak_memory_cpu(__snake_case )
																										__magic_name__	:	str								=Memory(__snake_case ) if isinstance(__snake_case    , __snake_case ) else memory_bytes
																		if self.args.trace_memory_line_by_line:
																						__magic_name__	:	List[Any]								=stop_memory_tracing(__snake_case )
																						if memory is None:
																										__magic_name__	:	Any								=summary.total
																		else:
																						__magic_name__	:	Optional[Any]								=None

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




