


'''simple docstring'''







import math
import time

from transformers import Trainer, is_torch_tpu_available
from transformers.trainer_utils import PredictionOutput, speed_metrics


if is_torch_tpu_available(check_device=False):
       import torch_xla.core.xla_model as xm
       import torch_xla.debug.metrics as met
class 						UpperCamelCase__       (			SCREAMING_SNAKE_CASE_						):



     """simple docstring"""






     def __init__(			self   ,						*snake_case__   ,						snake_case__=None   ,						snake_case__=None   ,						**snake_case__ ):

            '''simple docstring'''

            super().__init__(*snake_case__   ,						**snake_case__ )
            _lowerCAmelCase     :				Union[str, Any]       =							eval_examples
            _lowerCAmelCase     :				Union[str, Any]       =							post_process_function







     def a						(			self   ,						snake_case__=None   ,						snake_case__=None   ,						snake_case__=None   ,						snake_case__ = "eval" ):

            '''simple docstring'''

            _lowerCAmelCase     :				int       =							self.eval_dataset if eval_dataset is None else eval_dataset
            _lowerCAmelCase     :				Optional[Any]       =							self.get_eval_dataloader(snake_case__ )
            _lowerCAmelCase     :				Tuple       =							self.eval_examples if eval_examples is None else eval_examples

            # Temporarily disable metric computation, we will do it in the loop here.
            _lowerCAmelCase     :				Union[str, Any]       =							self.compute_metrics
            _lowerCAmelCase     :				Union[str, Any]       =							None
            _lowerCAmelCase     :				Union[str, Any]       =							self.prediction_loop if self.args.use_legacy_prediction_loop else self.evaluation_loop
            _lowerCAmelCase     :				List[str]       =							time.time()
            try:
                   _lowerCAmelCase     :				int       =							eval_loop(
                       snake_case__   ,						description='Evaluation'   ,						prediction_loss_only=True if compute_metrics is None else None   ,						ignore_keys=snake_case__   ,						metric_key_prefix=snake_case__   ,						)
            finally:
                   _lowerCAmelCase     :				Any       =							compute_metrics
            _lowerCAmelCase     :				str       =							self.args.eval_batch_size * self.args.world_size
            if F'{metric_key_prefix}_jit_compilation_time' in output.metrics:
                   start_time += output.metrics[F'{metric_key_prefix}_jit_compilation_time']
            output.metrics.update(
                speed_metrics(
                    snake_case__   ,						snake_case__   ,						num_samples=output.num_samples   ,						num_steps=math.ceil(output.num_samples / total_batch_size )   ,						) )
            if self.post_process_function is not None and self.compute_metrics is not None and self.args.should_save:
                   # Only the main node write the results by default
                   _lowerCAmelCase     :				List[str]       =							self.post_process_function(snake_case__   ,						snake_case__   ,						output.predictions )
                   _lowerCAmelCase     :				Optional[int]       =							self.compute_metrics(snake_case__ )

                   # Prefix all keys with metric_key_prefix + '_'
                   for key in list(metrics.keys() ):
                          if not key.startswith(F'{metric_key_prefix}_' ):
                                 _lowerCAmelCase     :				List[Any]       =							metrics.pop(snake_case__ )
                   metrics.update(output.metrics )
            else:
                   _lowerCAmelCase     :				Optional[int]       =							output.metrics

            if self.args.should_log:
                   # Only the main node log the results by default
                   self.log(snake_case__ )

            if self.args.tpu_metrics_debug or self.args.debug:
                   # tpu-comment: Logging debug metrics for PyTorch/XLA (compile, execute times, ops, etc.)
                   xm.master_print(met.metrics_report() )

            _lowerCAmelCase     :				Optional[Any]       =							self.callback_handler.on_evaluate(self.args   ,						self.state   ,						self.control   ,						snake_case__ )
            return metrics







     def a						(			self   ,						snake_case__   ,						snake_case__   ,						snake_case__=None   ,						snake_case__ = "test" ):

            '''simple docstring'''

            _lowerCAmelCase     :				List[str]       =							self.get_test_dataloader(snake_case__ )

            # Temporarily disable metric computation, we will do it in the loop here.
            _lowerCAmelCase     :				Tuple       =							self.compute_metrics
            _lowerCAmelCase     :				Any       =							None
            _lowerCAmelCase     :				Union[str, Any]       =							self.prediction_loop if self.args.use_legacy_prediction_loop else self.evaluation_loop
            _lowerCAmelCase     :				str       =							time.time()
            try:
                   _lowerCAmelCase     :				List[Any]       =							eval_loop(
                       snake_case__   ,						description='Prediction'   ,						prediction_loss_only=True if compute_metrics is None else None   ,						ignore_keys=snake_case__   ,						metric_key_prefix=snake_case__   ,						)
            finally:
                   _lowerCAmelCase     :				List[Any]       =							compute_metrics
            _lowerCAmelCase     :				Union[str, Any]       =							self.args.eval_batch_size * self.args.world_size
            if F'{metric_key_prefix}_jit_compilation_time' in output.metrics:
                   start_time += output.metrics[F'{metric_key_prefix}_jit_compilation_time']
            output.metrics.update(
                speed_metrics(
                    snake_case__   ,						snake_case__   ,						num_samples=output.num_samples   ,						num_steps=math.ceil(output.num_samples / total_batch_size )   ,						) )

            if self.post_process_function is None or self.compute_metrics is None:
                   return output

            _lowerCAmelCase     :				int       =							self.post_process_function(snake_case__   ,						snake_case__   ,						output.predictions   ,						'predict' )
            _lowerCAmelCase     :				List[str]       =							self.compute_metrics(snake_case__ )

            # Prefix all keys with metric_key_prefix + '_'
            for key in list(metrics.keys() ):
                   if not key.startswith(F'{metric_key_prefix}_' ):
                          _lowerCAmelCase     :				Dict       =							metrics.pop(snake_case__ )
            metrics.update(output.metrics )
            return PredictionOutput(predictions=predictions.predictions   ,						label_ids=predictions.label_ids   ,						metrics=snake_case__ )





'''simple docstring'''







from argparse import ArgumentParser, Namespace

from ..utils import logging
from . import BaseTransformersCLICommand






def       lowercase					(_A       ):







       """simple docstring"""







       return ConvertCommand(
           args.model_type ,    args.tf_checkpoint ,    args.pytorch_dump_output ,    args.config ,    args.finetuning_task_name       )


lowerCAmelCase     :  Optional[int]											=    """
transformers can only be used from the commandline to convert TensorFlow models in PyTorch, In that case, it requires
TensorFlow to be installed. Please see https://www.tensorflow.org/install/ for installation instructions.
"""
class 						UpperCamelCase__       (			SCREAMING_SNAKE_CASE_						):



     """simple docstring"""






     @staticmethod
     def a						(			snake_case__ ):

            '''simple docstring'''

            _lowerCAmelCase     :				str       =							parser.add_parser(
                'convert'   ,						help='CLI tool to run convert model from original author checkpoints to Transformers PyTorch checkpoints.'   ,						)
            train_parser.add_argument('--model_type'   ,						type=snake_case__   ,						required=snake_case__   ,						help='Model\'s type.' )
            train_parser.add_argument(
                '--tf_checkpoint'   ,						type=snake_case__   ,						required=snake_case__   ,						help='TensorFlow checkpoint path or folder.' )
            train_parser.add_argument(
                '--pytorch_dump_output'   ,						type=snake_case__   ,						required=snake_case__   ,						help='Path to the PyTorch saved model output.' )
            train_parser.add_argument('--config'   ,						type=snake_case__   ,						default=''   ,						help='Configuration file path or folder.' )
            train_parser.add_argument(
                '--finetuning_task_name'   ,						type=snake_case__   ,						default=snake_case__   ,						help='Optional fine-tuning task name if the TF model was a finetuned model.'   ,						)
            train_parser.set_defaults(func=snake_case__ )







     def __init__(			self   ,						snake_case__   ,						snake_case__   ,						snake_case__   ,						snake_case__   ,						snake_case__   ,						*snake_case__   ,						):

            '''simple docstring'''

            _lowerCAmelCase     :				str       =							logging.get_logger('transformers-cli/converting' )

            self._logger.info(F'Loading model {model_type}' )
            _lowerCAmelCase     :				Any       =							model_type
            _lowerCAmelCase     :				Any       =							tf_checkpoint
            _lowerCAmelCase     :				List[str]       =							pytorch_dump_output
            _lowerCAmelCase     :				int       =							config
            _lowerCAmelCase     :				str       =							finetuning_task_name







     def a						(			self ):

            '''simple docstring'''

            if self._model_type == "albert":
                   try:
                          from ..models.albert.convert_albert_original_tf_checkpoint_to_pytorch import (
                              convert_tf_checkpoint_to_pytorch,
                          )
                   except ImportError:
                          raise ImportError(snake_case__ )

                   convert_tf_checkpoint_to_pytorch(self._tf_checkpoint   ,						self._config   ,						self._pytorch_dump_output )
            elif self._model_type == "bert":
                   try:
                          from ..models.bert.convert_bert_original_tf_checkpoint_to_pytorch import (
                              convert_tf_checkpoint_to_pytorch,
                          )
                   except ImportError:
                          raise ImportError(snake_case__ )

                   convert_tf_checkpoint_to_pytorch(self._tf_checkpoint   ,						self._config   ,						self._pytorch_dump_output )
            elif self._model_type == "funnel":
                   try:
                          from ..models.funnel.convert_funnel_original_tf_checkpoint_to_pytorch import (
                              convert_tf_checkpoint_to_pytorch,
                          )
                   except ImportError:
                          raise ImportError(snake_case__ )

                   convert_tf_checkpoint_to_pytorch(self._tf_checkpoint   ,						self._config   ,						self._pytorch_dump_output )
            elif self._model_type == "t5":
                   try:
                          from ..models.ta.convert_ta_original_tf_checkpoint_to_pytorch import convert_tf_checkpoint_to_pytorch
                   except ImportError:
                          raise ImportError(snake_case__ )

                   convert_tf_checkpoint_to_pytorch(self._tf_checkpoint   ,						self._config   ,						self._pytorch_dump_output )
            elif self._model_type == "gpt":
                   from ..models.openai.convert_openai_original_tf_checkpoint_to_pytorch import (
                       convert_openai_checkpoint_to_pytorch,
                   )

                   convert_openai_checkpoint_to_pytorch(self._tf_checkpoint   ,						self._config   ,						self._pytorch_dump_output )
            elif self._model_type == "transfo_xl":
                   try:
                          from ..models.transfo_xl.convert_transfo_xl_original_tf_checkpoint_to_pytorch import (
                              convert_transfo_xl_checkpoint_to_pytorch,
                          )
                   except ImportError:
                          raise ImportError(snake_case__ )

                   if "ckpt" in self._tf_checkpoint.lower():
                          _lowerCAmelCase     :				List[Any]       =							self._tf_checkpoint
                          _lowerCAmelCase     :				Optional[int]       =							''
                   else:
                          _lowerCAmelCase     :				int       =							self._tf_checkpoint
                          _lowerCAmelCase     :				Dict       =							''
                   convert_transfo_xl_checkpoint_to_pytorch(
                       snake_case__   ,						self._config   ,						self._pytorch_dump_output   ,						snake_case__ )
            elif self._model_type == "gpt2":
                   try:
                          from ..models.gpta.convert_gpta_original_tf_checkpoint_to_pytorch import (
                              convert_gpta_checkpoint_to_pytorch,
                          )
                   except ImportError:
                          raise ImportError(snake_case__ )

                   convert_gpta_checkpoint_to_pytorch(self._tf_checkpoint   ,						self._config   ,						self._pytorch_dump_output )
            elif self._model_type == "xlnet":
                   try:
                          from ..models.xlnet.convert_xlnet_original_tf_checkpoint_to_pytorch import (
                              convert_xlnet_checkpoint_to_pytorch,
                          )
                   except ImportError:
                          raise ImportError(snake_case__ )

                   convert_xlnet_checkpoint_to_pytorch(
                       self._tf_checkpoint   ,						self._config   ,						self._pytorch_dump_output   ,						self._finetuning_task_name )
            elif self._model_type == "xlm":
                   from ..models.xlm.convert_xlm_original_pytorch_checkpoint_to_pytorch import (
                       convert_xlm_checkpoint_to_pytorch,
                   )

                   convert_xlm_checkpoint_to_pytorch(self._tf_checkpoint   ,						self._pytorch_dump_output )
            elif self._model_type == "lxmert":
                   from ..models.lxmert.convert_lxmert_original_tf_checkpoint_to_pytorch import (
                       convert_lxmert_checkpoint_to_pytorch,
                   )

                   convert_lxmert_checkpoint_to_pytorch(self._tf_checkpoint   ,						self._pytorch_dump_output )
            elif self._model_type == "rembert":
                   from ..models.rembert.convert_rembert_tf_checkpoint_to_pytorch import (
                       convert_rembert_tf_checkpoint_to_pytorch,
                   )

                   convert_rembert_tf_checkpoint_to_pytorch(self._tf_checkpoint   ,						self._config   ,						self._pytorch_dump_output )
            else:
                   raise ValueError(
                       '--model_type should be selected in the list [bert, gpt, gpt2, t5, transfo_xl, xlnet, xlm, lxmert]' )

