


"""simple docstring"""


import json
import os
import shutil
import sys
import tempfile
import unittest
import unittest.mock as mock
from pathlib import Path

from huggingface_hub import HfFolder, delete_repo
from requests.exceptions import HTTPError

from transformers import AutoConfig, BertConfig, GPTaConfig
from transformers.configuration_utils import PretrainedConfig
from transformers.testing_utils import TOKEN, USER, is_staging_test


sys.path.append(str(Path(__file__).parent.parent / "utils"))

from test_module.custom_configuration import CustomConfig  # noqa E402


UpperCamelCase						:				List[Any]             =      {
    "return_dict": False,
    "output_hidden_states": True,
    "output_attentions": True,
    "torchscript": True,
    "torch_dtype": "float16",
    "use_bfloat16": True,
    "tf_legacy_loss": True,
    "pruned_heads": {"a": 1},
    "tie_word_embeddings": False,
    "is_decoder": True,
    "cross_attention_hidden_size": 128,
    "add_cross_attention": True,
    "tie_encoder_decoder": True,
    "max_length": 50,
    "min_length": 3,
    "do_sample": True,
    "early_stopping": True,
    "num_beams": 3,
    "num_beam_groups": 3,
    "diversity_penalty": 0.5,
    "temperature": 2.0,
    "top_k": 10,
    "top_p": 0.7,
    "typical_p": 0.2,
    "repetition_penalty": 0.8,
    "length_penalty": 0.8,
    "no_repeat_ngram_size": 5,
    "encoder_no_repeat_ngram_size": 5,
    "bad_words_ids": [1, 2, 3],
    "num_return_sequences": 3,
    "chunk_size_feed_forward": 5,
    "output_scores": True,
    "return_dict_in_generate": True,
    "forced_bos_token_id": 2,
    "forced_eos_token_id": 3,
    "remove_invalid_values": True,
    "architectures": ["BertModel"],
    "finetuning_task": "translation",
    "id2label": {0: "label"},
    "label2id": {"label": "0"},
    "tokenizer_class": "BertTokenizerFast",
    "prefix": "prefix",
    "bos_token_id": 6,
    "pad_token_id": 7,
    "eos_token_id": 8,
    "sep_token_id": 9,
    "decoder_start_token_id": 10,
    "exponential_decay_length_penalty": (5, 1.01),
    "suppress_tokens": [0, 1],
    "begin_suppress_tokens": 2,
    "task_specific_params": {"translation": "some_params"},
    "problem_type": "regression",
}



@is_staging_test
class 			lowerCamelCase__						(   unittest.TestCase			):







						@classmethod
						def __a						(							cls   :    Optional[int]		):
								A					       = TOKEN
								HfFolder.save_token(_lowercase		)







						@classmethod
						def __a						(							cls   :    str		):
								try:
										delete_repo(token=cls._token			,			repo_id='test-config'		)
								except HTTPError:
										pass

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

								try:
										delete_repo(token=cls._token			,			repo_id='test-dynamic-config'		)
								except HTTPError:
										pass







						def __a						(							self   :    Union[str, Any]		):
								A					       = BertConfig(
								    vocab_size=99			,			hidden_size=32			,			num_hidden_layers=5			,			num_attention_heads=4			,			intermediate_size=37		)
								config.push_to_hub('test-config'			,			use_auth_token=self._token		)

								A					       = BertConfig.from_pretrained(f'{USER}/test-config'		)
								for k, v in config.to_dict().items():
										if k != "transformers_version":
												self.assertEqual(_lowercase			,			getattr(_lowercase			,			_lowercase		)		)

        # Reset repo
								delete_repo(token=self._token			,			repo_id='test-config'		)

								# Push to hub via save_pretrained
								with tempfile.TemporaryDirectory() as tmp_dir:
										config.save_pretrained(_lowercase			,			repo_id='test-config'			,			push_to_hub=_lowercase			,			use_auth_token=self._token		)

								A					       = BertConfig.from_pretrained(f'{USER}/test-config'		)
								for k, v in config.to_dict().items():
										if k != "transformers_version":
												self.assertEqual(_lowercase			,			getattr(_lowercase			,			_lowercase		)		)







						def __a						(							self   :    Union[str, Any]		):
								A					       = BertConfig(
								    vocab_size=99			,			hidden_size=32			,			num_hidden_layers=5			,			num_attention_heads=4			,			intermediate_size=37		)
								config.push_to_hub('valid_org/test-config-org'			,			use_auth_token=self._token		)

								A					       = BertConfig.from_pretrained('valid_org/test-config-org'		)
								for k, v in config.to_dict().items():
										if k != "transformers_version":
												self.assertEqual(_lowercase			,			getattr(_lowercase			,			_lowercase		)		)

        # Reset repo
								delete_repo(token=self._token			,			repo_id='valid_org/test-config-org'		)

								# Push to hub via save_pretrained
								with tempfile.TemporaryDirectory() as tmp_dir:
										config.save_pretrained(
										    _lowercase			,			repo_id='valid_org/test-config-org'			,			push_to_hub=_lowercase			,			use_auth_token=self._token		)

								A					       = BertConfig.from_pretrained('valid_org/test-config-org'		)
								for k, v in config.to_dict().items():
										if k != "transformers_version":
												self.assertEqual(_lowercase			,			getattr(_lowercase			,			_lowercase		)		)







						def __a						(							self   :    List[Any]		):
								CustomConfig.register_for_auto_class()
								A					       = CustomConfig(attribute=42		)

								config.push_to_hub('test-dynamic-config'			,			use_auth_token=self._token		)

								# This has added the proper auto_map field to the config
								self.assertDictEqual(config.auto_map			,			{'AutoConfig': 'custom_configuration.CustomConfig'}		)

								A					       = AutoConfig.from_pretrained(f'{USER}/test-dynamic-config'			,			trust_remote_code=_lowercase		)
								# Can't make an isinstance check because the new_config is from the FakeConfig class of a dynamic module
								self.assertEqual(new_config.__class__.__name__			,			'CustomConfig'		)
								self.assertEqual(new_config.attribute			,			42		)



class 			lowerCamelCase__						(   unittest.TestCase			):







						def __a						(							self   :    Tuple		):
								A					       = GPTaConfig()

								# attempt to modify each of int/float/bool/str config records and verify they were updated
								A					       = c.n_embd + 1  # int
								A					       = c.resid_pdrop + 1.0  # float
								A					       = not c.scale_attn_weights  # bool
								A					       = c.summary_type + 'foo'  # str
								c.update_from_string(
								    f'n_embd={n_embd},resid_pdrop={resid_pdrop},scale_attn_weights={scale_attn_weights},summary_type={summary_type}'		)
								self.assertEqual(_lowercase			,			c.n_embd			,			'mismatch for key: n_embd'		)
								self.assertEqual(_lowercase			,			c.resid_pdrop			,			'mismatch for key: resid_pdrop'		)
								self.assertEqual(_lowercase			,			c.scale_attn_weights			,			'mismatch for key: scale_attn_weights'		)
								self.assertEqual(_lowercase			,			c.summary_type			,			'mismatch for key: summary_type'		)







						def __a						(							self   :    Optional[int]		):
								A					       = PretrainedConfig()
								A					       = [key for key in base_config.__dict__ if key not in config_common_kwargs]
								# If this part of the test fails, you have arguments to addin config_common_kwargs above.
								self.assertListEqual(
								    _lowercase			,			['is_encoder_decoder', '_name_or_path', '_commit_hash', 'transformers_version']		)
								A					       = [key for key, value in config_common_kwargs.items() if value == getattr(_lowercase			,			_lowercase		)]
								if len(_lowercase		) > 0:
										raise ValueError(
										    'The following keys are set with the default values in'
										    ' `test_configuration_common.config_common_kwargs` pick another value for them:'
										    f' {", ".join(_lowercase		)}.'		)







						def __a						(							self   :    Optional[int]		):
								with self.assertRaises(_lowercase		):
										# config is in subfolder, the following should not work without specifying the subfolder
										A					       = BertConfig.from_pretrained('hf-internal-testing/tiny-random-bert-subfolder'		)

								A					       = BertConfig.from_pretrained('hf-internal-testing/tiny-random-bert-subfolder'			,			subfolder='bert'		)

								self.assertIsNotNone(_lowercase		)







						def __a						(							self   :    List[Any]		):
								# A mock response for an HTTP head request to emulate server down
								A					       = mock.Mock()
								A					       = 500
								A					       = {}
								A					       = HTTPError
								A					       = {}

								# Download this model to make sure it's in the cache.
								A					       = BertConfig.from_pretrained('hf-internal-testing/tiny-random-bert'		)

								# Under the mock environment we get a 500 error when trying to reach the model.
								with mock.patch('requests.Session.request'			,			return_value=_lowercase		) as mock_head:
										A					       = BertConfig.from_pretrained('hf-internal-testing/tiny-random-bert'		)
										# This check we did call the fake head request
										mock_head.assert_called()







						def __a						(							self   :    int		):
								# This test is for deprecated behavior and can be removed in v5
								A					       = BertConfig.from_pretrained(
								    'https://huggingface.co/hf-internal-testing/tiny-random-bert/resolve/main/config.json'		)







						def __a						(							self   :    List[str]		):
								A					       = AutoConfig.from_pretrained('bert-base-cased'		)
								A					       = ['config.4.0.0.json']

								with tempfile.TemporaryDirectory() as tmp_dir:
										configuration.save_pretrained(_lowercase		)
										A					       = 2
										json.dump(configuration.to_dict()			,			open(os.path.join(_lowercase			,			'config.4.0.0.json'		)			,			'w'		)		)

										# This should pick the new configuration file as the version of Transformers is > 4.0.0
										A					       = AutoConfig.from_pretrained(_lowercase		)
										self.assertEqual(new_configuration.hidden_size			,			2		)

										# Will need to be adjusted if we reach v42 and this test is still here.
										# Should pick the old configuration file as the version of Transformers is < 4.42.0
										A					       = ['config.42.0.0.json']
										A					       = 768
										configuration.save_pretrained(_lowercase		)
										shutil.move(os.path.join(_lowercase			,			'config.4.0.0.json'		)			,			os.path.join(_lowercase			,			'config.42.0.0.json'		)		)
										A					       = AutoConfig.from_pretrained(_lowercase		)
										self.assertEqual(new_configuration.hidden_size			,			768		)







						def __a						(							self   :    Tuple		):
								# This repo has two configuration files, one for v4.0.0 and above with a different hidden size.
								A					       = 'hf-internal-testing/test-two-configs'

								import transformers as new_transformers

								A					       = 'v4.0.0'
								A       , A					       = new_transformers.models.auto.AutoConfig.from_pretrained(
								    _lowercase			,			return_unused_kwargs=_lowercase		)
								self.assertEqual(new_configuration.hidden_size			,			2		)
								# This checks `_configuration_file` ia not kept in the kwargs by mistake.
								self.assertDictEqual(_lowercase			,			{}		)

								# Testing an older version by monkey-patching the version in the module it's used.
								import transformers as old_transformers

								A					       = 'v3.0.0'
								A					       = old_transformers.models.auto.AutoConfig.from_pretrained(_lowercase		)
								self.assertEqual(old_configuration.hidden_size			,			768		)









"""simple docstring"""


import argparse
import json
import os

import evaluate
import torch
from datasets import load_dataset
from torch.optim import AdamW
from torch.utils.data import DataLoader
from transformers import AutoModelForSequenceClassification, AutoTokenizer, get_linear_schedule_with_warmup, set_seed

from accelerate import Accelerator, DistributedType
from accelerate.utils.deepspeed import DummyOptim, DummyScheduler


UpperCamelCase						:				int             =      16
UpperCamelCase						:				Optional[int]             =      32







def  __snake_case       (   UpperCamelCase__ ,			UpperCamelCase__ = 16 ,			UpperCamelCase__ = "bert-base-cased"	)      ->		Optional[int]:







		"""simple docstring"""





		A					       = AutoTokenizer.from_pretrained(UpperCamelCase__	)
		A					       = load_dataset('glue' ,			'mrpc'	)

		def tokenize_function(UpperCamelCase__	):
				# max_length=None => use the model max length (it's actually the default)
				A					       = tokenizer(examples['sentence1'] ,			examples['sentence2'] ,			truncation=UpperCamelCase__ ,			max_length=UpperCamelCase__	)
				return outputs

		# Apply the method we just defined to all the examples in all the splits of the dataset
		A					       = datasets.map(
		    UpperCamelCase__ ,			batched=UpperCamelCase__ ,			remove_columns=['idx', 'sentence1', 'sentence2'] ,			load_from_cache_file=UpperCamelCase__	)

		# We also rename the 'label' column to 'labels' which is the expected name for labels by the models of the
		# transformers library
		A					       = tokenized_datasets.rename_column('label' ,			'labels'	)

		def collate_fn(UpperCamelCase__	):
				# On TPU it's best to pad everything to the same length or training will be very slow.
				if accelerator.distributed_type == DistributedType.TPU:
						return tokenizer.pad(UpperCamelCase__ ,			padding='max_length' ,			max_length=128 ,			return_tensors='pt'	)
				return tokenizer.pad(UpperCamelCase__ ,			padding='longest' ,			return_tensors='pt'	)

		# Instantiate dataloaders.
		A					       = DataLoader(
		    tokenized_datasets['train'] ,			shuffle=UpperCamelCase__ ,			collate_fn=UpperCamelCase__ ,			batch_size=UpperCamelCase__	)
		A					       = DataLoader(
		    tokenized_datasets['validation'] ,			shuffle=UpperCamelCase__ ,			collate_fn=UpperCamelCase__ ,			batch_size=UpperCamelCase__	)

		return train_dataloader, eval_dataloader







def  __snake_case       (   UpperCamelCase__ ,			UpperCamelCase__	)      ->		Optional[Any]:







		"""simple docstring"""





		A					       = Accelerator()

		# Sample hyper-parameters for learning rate, batch size, seed and a few other HPs
		A					       = config['lr']
		A					       = int(config['num_epochs']	)
		A					       = int(config['seed']	)
		A					       = int(config['batch_size']	)
		A					       = args.model_name_or_path

		set_seed(UpperCamelCase__	)
		A       , A					       = get_dataloaders(UpperCamelCase__ ,			UpperCamelCase__ ,			UpperCamelCase__	)

		# Instantiate the model (we build the model here so that the seed also control new weights initialization)
		A					       = AutoModelForSequenceClassification.from_pretrained(UpperCamelCase__ ,			return_dict=UpperCamelCase__	)

		# Instantiate optimizer
		A					       = (
		    AdamW
		    if accelerator.state.deepspeed_plugin is None
		    or 'optimizer' not in accelerator.state.deepspeed_plugin.deepspeed_config
		    else DummyOptim
		)
		A					       = optimizer_cls(params=model.parameters() ,			lr=UpperCamelCase__	)

		if accelerator.state.deepspeed_plugin is not None:
				A					       = accelerator.state.deepspeed_plugin.deepspeed_config[
				    'gradient_accumulation_steps'
				]
		else:
				A					       = 1
		A					       = (len(UpperCamelCase__	) * num_epochs) // gradient_accumulation_steps

		# Instantiate scheduler
		if (
		    accelerator.state.deepspeed_plugin is None
		    or "scheduler" not in accelerator.state.deepspeed_plugin.deepspeed_config
		):
				A					       = get_linear_schedule_with_warmup(
				    optimizer=UpperCamelCase__ ,			num_warmup_steps=0 ,			num_training_steps=UpperCamelCase__ ,			)
		else:
				A					       = DummyScheduler(UpperCamelCase__ ,			total_num_steps=UpperCamelCase__ ,			warmup_num_steps=0	)

		# Prepare everything
		# There is no specific order to remember, we just need to unpack the objects in the same order we gave them to the
		# prepare method.
		A       , A       , A       , A       , A					       = accelerator.prepare(
		    UpperCamelCase__ ,			UpperCamelCase__ ,			UpperCamelCase__ ,			UpperCamelCase__ ,			UpperCamelCase__	)

		# We need to keep track of how many total steps we have iterated over
		A					       = 0
		# We also need to keep track of the stating epoch so files are named properly
		A					       = 0

		# Now we train the model
		A					       = evaluate.load('glue' ,			'mrpc'	)
		A					       = 0
		A					       = {}
		for epoch in range(UpperCamelCase__ ,			UpperCamelCase__	):
				model.train()
				for step, batch in enumerate(UpperCamelCase__	):
						A					       = model(**UpperCamelCase__	)
						A					       = outputs.loss
						A					       = loss / gradient_accumulation_steps
						accelerator.backward(UpperCamelCase__	)
						if step % gradient_accumulation_steps == 0:
								optimizer.step()
								lr_scheduler.step()
								optimizer.zero_grad()

						overall_step += 1

				model.eval()
				A					       = 0
				for step, batch in enumerate(UpperCamelCase__	):
						# We could avoid this line since we set the accelerator with `device_placement=True`.
						batch.to(accelerator.device	)
						with torch.no_grad():
								A					       = model(**UpperCamelCase__	)
						A					       = outputs.logits.argmax(dim=-1	)
						# It is slightly faster to call this once, than multiple times
						A       , A					       = accelerator.gather(
						    (predictions, batch['labels'])	)  # If we are in a multiprocess environment, the last batch has duplicates
						if accelerator.use_distributed:
								if step == len(UpperCamelCase__	) - 1:
										A					       = predictions[: len(eval_dataloader.dataset	) - samples_seen]
										A					       = references[: len(eval_dataloader.dataset	) - samples_seen]
								else:
										samples_seen += references.shape[0]
						metric.add_batch(
						    predictions=UpperCamelCase__ ,			references=UpperCamelCase__ ,			)

				A					       = metric.compute()
				# Use accelerator.print to print only on the main process.
				accelerator.print(f'epoch {epoch}:' ,			UpperCamelCase__	)
				A					       = eval_metric['accuracy']

				if best_performance < eval_metric["accuracy"]:
						A					       = eval_metric['accuracy']

		if args.performance_lower_bound is not None:
				assert (
				    args.performance_lower_bound <= best_performance
				), f'Best performance metric {best_performance} is lower than the lower bound {args.performance_lower_bound}'

		accelerator.wait_for_everyone()
		if accelerator.is_main_process:
				with open(os.path.join(args.output_dir ,			'all_results.json'	) ,			'w'	) as f:
						json.dump(UpperCamelCase__ ,			UpperCamelCase__	)







def  __snake_case       (   )      ->		Optional[int]:







		"""simple docstring"""





		A					       = argparse.ArgumentParser(description='Simple example of training script tracking peak GPU memory usage.'	)
		parser.add_argument(
		    '--model_name_or_path' ,			type=UpperCamelCase__ ,			default='bert-base-cased' ,			help='Path to pretrained model or model identifier from huggingface.co/models.' ,			required=UpperCamelCase__ ,			)
		parser.add_argument(
		    '--output_dir' ,			type=UpperCamelCase__ ,			default='.' ,			help='Optional save directory where all checkpoint folders will be stored. Default is the current working directory.' ,			)
		parser.add_argument(
		    '--performance_lower_bound' ,			type=UpperCamelCase__ ,			default=UpperCamelCase__ ,			help='Optional lower bound for the performance metric. If set, the training will throw error when the performance metric drops below this value.' ,			)
		parser.add_argument(
		    '--num_epochs' ,			type=UpperCamelCase__ ,			default=3 ,			help='Number of train epochs.' ,			)
		A					       = parser.parse_args()
		A					       = {'lr': 2E-5, 'num_epochs': args.num_epochs, 'seed': 42, 'batch_size': 16}
		training_function(UpperCamelCase__ ,			UpperCamelCase__	)


if __name__ == "__main__":
	main()





