






# This test is meant to be run in on an instance with TPUs like this:
#
#   python examples/pytorch/xla_spawn.py --num_cores=8 tests/test_trainer_tpu.py
#
# Replace 8 with the number of TPU cores you have.
#

import sys
from typing import Dict

from transformers import EvalPrediction, HfArgumentParser, TrainingArguments, is_torch_available
from transformers.utils import logging


_a       =    logging.get_logger(__name__)


if is_torch_available():
		import torch
		from torch import nn
		from torch.utils.data import Dataset

		from transformers import Trainer





		class __lowerCamelCase					( snake_case__):





			"""simple docstring"""






			def __init__(				self			,       UpperCAmelCase = 101       ):
									"""simple docstring"""







									_UpperCAmelCase							   =     length

			def __len__(				self       ):
									"""simple docstring"""







									return self.length

			def __getitem__(				self			,       UpperCAmelCase       ):
									"""simple docstring"""







									return i





		class __lowerCamelCase					:





			"""simple docstring"""






			def __call__(				self			,       UpperCAmelCase       ):
									"""simple docstring"""







									return {"input_ids": torch.tensor(UpperCAmelCase       ), "labels": torch.tensor(UpperCAmelCase       )}





		class __lowerCamelCase					( nn.Module):





			"""simple docstring"""






			def __init__(				self       ):
									"""simple docstring"""







									super().__init__()
									# Add some (unused) params otherwise DDP will complain.
									_UpperCAmelCase							   =     nn.Linear(120			,       80       )

			def 			UpperCamelCase       (				self			,       UpperCAmelCase			,       UpperCAmelCase=None       ):
									"""simple docstring"""







									if labels is not None:
															return torch.tensor(0.0			,       device=input_ids.device       ), input_ids
									else:
															return input_ids


def __A       ( )->    Dict:





						"""simple docstring"""



						_UpperCAmelCase							   =     HfArgumentParser((TrainingArguments,)      )
						sys.argv += ["--output_dir", "./examples"]
						_UpperCAmelCase							   =     parser.parse_args_into_dataclasses()[0]

						logger.warning(
						    F"""Process rank: {training_args.local_rank}, device: {training_args.device}, """
						    F"""tpu_num_cores: {training_args.tpu_num_cores}"""					,						)

						# Essentially, what we want to verify in the distributed case is
						# that we get all samples back, in the right order.
						# (this is crucial for prediction for instance)
						for dataset_length in [1_001, 256, 15]:
												_UpperCAmelCase							   =     DummyDataset(__lowerCAmelCase      )

												def compute_metrics(__lowerCAmelCase      ) -> Dict:
																		_UpperCAmelCase							   =     list(range(len(__lowerCAmelCase      )      )      )
																		_UpperCAmelCase							   =     p.predictions.tolist() == sequential and p.label_ids.tolist() == sequential
																		return {"success": success}

												_UpperCAmelCase							   =     Trainer(
												    model=DummyModel()					,						args=__lowerCAmelCase					,						data_collator=DummyDataCollator()					,						eval_dataset=__lowerCAmelCase					,						compute_metrics=__lowerCAmelCase					,						)
												_UpperCAmelCase							   =     trainer.evaluate()
												logger.info(__lowerCAmelCase      )
												if metrics["eval_success"] is not True:
																		logger.error(__lowerCAmelCase      )
																		exit(1      )

												_UpperCAmelCase							   =     trainer.predict(__lowerCAmelCase      )
												logger.info(p.metrics      )
												if p.metrics["test_success"] is not True:
																		logger.error(p.metrics      )
																		exit(1      )

												_UpperCAmelCase							   =     2

												_UpperCAmelCase							   =     trainer.evaluate()
												logger.info(__lowerCAmelCase      )
												if metrics["eval_success"] is not True:
																		logger.error(__lowerCAmelCase      )
																		exit(1      )

												_UpperCAmelCase							   =     trainer.predict(__lowerCAmelCase      )
												logger.info(p.metrics      )
												if p.metrics["test_success"] is not True:
																		logger.error(p.metrics      )
																		exit(1      )

												_UpperCAmelCase							   =     None

						logger.info('🔥 All distributed tests successful'      )


def __A       ( __lowerCAmelCase      )->    Any:





						"""simple docstring"""



						main()


if __name__ == "__main__":
		main()








import argparse
import pathlib

import fairseq
import torch
from fairseq.models.roberta import RobertaModel as FairseqRobertaModel
from fairseq.modules import TransformerSentenceEncoderLayer
from packaging import version

from transformers import RobertaConfig, RobertaForMaskedLM, RobertaForSequenceClassification
from transformers.models.bert.modeling_bert import (
    BertIntermediate,
    BertLayer,
    BertOutput,
    BertSelfAttention,
    BertSelfOutput,
)
from transformers.utils import logging


if version.parse(fairseq.__version__) < version.parse('''0.9.0'''):
		raise Exception('''requires fairseq >= 0.9.0''')


logging.set_verbosity_info()
_a       =    logging.get_logger(__name__)

_a       =    '''Hello world! cécé herlolip'''


def __A       ( __lowerCAmelCase					,						__lowerCAmelCase					,						__lowerCAmelCase      )->    List[Any]:





						"""simple docstring"""



						_UpperCAmelCase							   =     FairseqRobertaModel.from_pretrained(__lowerCAmelCase      )
						roberta.eval()  # disable dropout
						_UpperCAmelCase							   =     roberta.model.encoder.sentence_encoder
						_UpperCAmelCase							   =     RobertaConfig(
						    vocab_size=roberta_sent_encoder.embed_tokens.num_embeddings					,						hidden_size=roberta.args.encoder_embed_dim					,						num_hidden_layers=roberta.args.encoder_layers					,						num_attention_heads=roberta.args.encoder_attention_heads					,						intermediate_size=roberta.args.encoder_ffn_embed_dim					,						max_position_embeddings=514					,						type_vocab_size=1					,						layer_norm_eps=1E-5					,						)
						if classification_head:
												_UpperCAmelCase							   =     roberta.model.classification_heads['mnli'].out_proj.weight.shape[0]
						print('Our BERT config:'					,						__lowerCAmelCase      )

						_UpperCAmelCase							   =     RobertaForSequenceClassification(__lowerCAmelCase      ) if classification_head else RobertaForMaskedLM(__lowerCAmelCase      )
						model.eval()

						# Now let's copy all the weights.
						# Embeddings
						_UpperCAmelCase							   =     roberta_sent_encoder.embed_tokens.weight
						_UpperCAmelCase							   =     roberta_sent_encoder.embed_positions.weight
						_UpperCAmelCase							   =     torch.zeros_like(
						    model.roberta.embeddings.token_type_embeddings.weight      )  # just zero them out b/c RoBERTa doesn't use them.
						_UpperCAmelCase							   =     roberta_sent_encoder.emb_layer_norm.weight
						_UpperCAmelCase							   =     roberta_sent_encoder.emb_layer_norm.bias

						for i in range(config.num_hidden_layers      ):
												# Encoder: start of layer
												_UpperCAmelCase							   =     model.roberta.encoder.layer[i]
												_UpperCAmelCase							   =     roberta_sent_encoder.layers[i]

												# self attention
												_UpperCAmelCase							   =     layer.attention.self
												assert (
												    roberta_layer.self_attn.k_proj.weight.data.shape
												    == roberta_layer.self_attn.q_proj.weight.data.shape
												    == roberta_layer.self_attn.v_proj.weight.data.shape
												    == torch.Size((config.hidden_size, config.hidden_size)      )
												)

												_UpperCAmelCase							   =     roberta_layer.self_attn.q_proj.weight
												_UpperCAmelCase							   =     roberta_layer.self_attn.q_proj.bias
												_UpperCAmelCase							   =     roberta_layer.self_attn.k_proj.weight
												_UpperCAmelCase							   =     roberta_layer.self_attn.k_proj.bias
												_UpperCAmelCase							   =     roberta_layer.self_attn.v_proj.weight
												_UpperCAmelCase							   =     roberta_layer.self_attn.v_proj.bias

												# self-attention output
												_UpperCAmelCase							   =     layer.attention.output
												assert self_output.dense.weight.shape == roberta_layer.self_attn.out_proj.weight.shape
												_UpperCAmelCase							   =     roberta_layer.self_attn.out_proj.weight
												_UpperCAmelCase							   =     roberta_layer.self_attn.out_proj.bias
												_UpperCAmelCase							   =     roberta_layer.self_attn_layer_norm.weight
												_UpperCAmelCase							   =     roberta_layer.self_attn_layer_norm.bias

												# intermediate
												_UpperCAmelCase							   =     layer.intermediate
												assert intermediate.dense.weight.shape == roberta_layer.fca.weight.shape
												_UpperCAmelCase							   =     roberta_layer.fca.weight
												_UpperCAmelCase							   =     roberta_layer.fca.bias

												# output
												_UpperCAmelCase							   =     layer.output
												assert bert_output.dense.weight.shape == roberta_layer.fca.weight.shape
												_UpperCAmelCase							   =     roberta_layer.fca.weight
												_UpperCAmelCase							   =     roberta_layer.fca.bias
												_UpperCAmelCase							   =     roberta_layer.final_layer_norm.weight
												_UpperCAmelCase							   =     roberta_layer.final_layer_norm.bias
												# end of layer

						if classification_head:
												_UpperCAmelCase							   =     roberta.model.classification_heads['mnli'].dense.weight
												_UpperCAmelCase							   =     roberta.model.classification_heads['mnli'].dense.bias
												_UpperCAmelCase							   =     roberta.model.classification_heads['mnli'].out_proj.weight
												_UpperCAmelCase							   =     roberta.model.classification_heads['mnli'].out_proj.bias
						else:
												# LM Head
												_UpperCAmelCase							   =     roberta.model.encoder.lm_head.dense.weight
												_UpperCAmelCase							   =     roberta.model.encoder.lm_head.dense.bias
												_UpperCAmelCase							   =     roberta.model.encoder.lm_head.layer_norm.weight
												_UpperCAmelCase							   =     roberta.model.encoder.lm_head.layer_norm.bias
												_UpperCAmelCase							   =     roberta.model.encoder.lm_head.weight
												_UpperCAmelCase							   =     roberta.model.encoder.lm_head.bias

						# Let's check that we get the same results.
						_UpperCAmelCase							   =     roberta.encode(__lowerCAmelCase      ).unsqueeze(0      )  # batch of size 1

						_UpperCAmelCase							   =     model(__lowerCAmelCase      )[0]
						if classification_head:
												_UpperCAmelCase							   =     roberta.model.classification_heads['mnli'](roberta.extract_features(__lowerCAmelCase      )      )
						else:
												_UpperCAmelCase							   =     roberta.model(__lowerCAmelCase      )[0]
						print(our_output.shape					,						their_output.shape      )
						_UpperCAmelCase							   =     torch.max(torch.abs(our_output - their_output      )      ).item()
						print(F"""max_absolute_diff = {max_absolute_diff}"""      )  # ~ 1e-7
						_UpperCAmelCase							   =     torch.allclose(__lowerCAmelCase					,						__lowerCAmelCase					,						atol=1E-3      )
						print('Do both models output the same tensors?'					,						'🔥' if success else '💩'      )
						if not success:
												raise Exception('Something went wRoNg'      )

						pathlib.Path(__lowerCAmelCase      ).mkdir(parents=__lowerCAmelCase					,						exist_ok=__lowerCAmelCase      )
						print(F"""Saving model to {pytorch_dump_folder_path}"""      )
						model.save_pretrained(__lowerCAmelCase      )


if __name__ == "__main__":
		_a       =    argparse.ArgumentParser()
		# Required parameters
		parser.add_argument(
		    '''--roberta_checkpoint_path''', default=None, type=str, required=True, help='''Path the official PyTorch dump.'''
		)
		parser.add_argument(
		    '''--pytorch_dump_folder_path''', default=None, type=str, required=True, help='''Path to the output PyTorch model.'''
		)
		parser.add_argument(
		    '''--classification_head''', action='''store_true''', help='''Whether to convert a final classification head.'''
		)
		_a       =    parser.parse_args()
		convert_roberta_checkpoint_to_pytorch(
		    args.roberta_checkpoint_path, args.pytorch_dump_folder_path, args.classification_head
		)
