



import argparse
from collections import OrderedDict
from pathlib import Path

import torch

from transformers import (
    VisualBertConfig,
    VisualBertForMultipleChoice,
    VisualBertForPreTraining,
    VisualBertForQuestionAnswering,
    VisualBertForVisualReasoning,
)
from transformers.utils import logging


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

__lowerCamelCase         =			[
    ('''bert.bert''', '''visual_bert'''),
    ('''bert.cls''', '''cls'''),
    ('''bert.classifier''', '''cls'''),
    ('''token_type_embeddings_visual''', '''visual_token_type_embeddings'''),
    ('''position_embeddings_visual''', '''visual_position_embeddings'''),
    ('''projection''', '''visual_projection'''),
]

__lowerCamelCase         =			[
    '''nlvr2_coco_pre_trained.th''',
    '''nlvr2_fine_tuned.th''',
    '''nlvr2_pre_trained.th''',
    '''vcr_coco_pre_train.th''',
    '''vcr_fine_tune.th''',
    '''vcr_pre_train.th''',
    '''vqa_coco_pre_trained.th''',
    '''vqa_fine_tuned.th''',
    '''vqa_pre_trained.th''',
]







def    _snake_case (       __snake_case    )     ->     Optional[Any]:






      '''simple docstring'''







      UpperCAmelCase_  :	Any				      =		torch.load(__snake_case					,  map_location="cpu"    )
      return sd







def    _snake_case (       __snake_case					,  __snake_case					,  __snake_case=rename_keys_prefix    )     ->     List[Any]:






      '''simple docstring'''







      UpperCAmelCase_  :	Any				      =		OrderedDict()
      UpperCAmelCase_  :	Dict				      =		torch.arange(config.max_position_embeddings    ).expand((1, -1)    )
      # detector_d = OrderedDict()
      for key in d:
            if "detector" in key:
                  # detector_d[key.replace('detector.','')] = d[key]
                  continue
            UpperCAmelCase_  :	List[str]				      =		key
            for name_pair in rename_keys_prefix:
                  UpperCAmelCase_  :	Any				      =		new_key.replace(name_pair[0]					,  name_pair[1]    )
            UpperCAmelCase_  :	Any				      =		d[key]
            if key == "bert.cls.predictions.decoder.weight":
                  # Old bert code didn't have `decoder.bias`, but was added separately
                  UpperCAmelCase_  :	Union[str, Any]				      =		new_d["cls.predictions.bias"]
      return new_d







@torch.no_grad()
def    _snake_case (       __snake_case					,  __snake_case    )     ->     int:






      '''simple docstring'''







      assert (
          checkpoint_path.split("/"    )[-1] in ACCEPTABLE_CHECKPOINTS
      ), F"""The checkpoint provided must be in {ACCEPTABLE_CHECKPOINTS}."""

      # Get Config
      if "pre" in checkpoint_path:
            UpperCAmelCase_  :	Tuple				      =		"pretraining"
            if "vcr" in checkpoint_path:
                  UpperCAmelCase_  :	List[str]				      =		{"visual_embedding_dim": 5_1_2}
            elif "vqa_advanced" in checkpoint_path:
                  UpperCAmelCase_  :	str				      =		{"visual_embedding_dim": 2_0_4_8}
            elif "vqa" in checkpoint_path:
                  UpperCAmelCase_  :	Any				      =		{"visual_embedding_dim": 2_0_4_8}
            elif "nlvr" in checkpoint_path:
                  UpperCAmelCase_  :	Any				      =		{"visual_embedding_dim": 1_0_2_4}
            else:
                  raise NotImplementedError(F"""No implementation found for `{checkpoint_path}`."""    )
      else:
            if "vcr" in checkpoint_path:
                  UpperCAmelCase_  :	List[Any]				      =		{"visual_embedding_dim": 5_1_2}
                  UpperCAmelCase_  :	Dict				      =		"multichoice"
            elif "vqa_advanced" in checkpoint_path:
                  UpperCAmelCase_  :	List[str]				      =		{"visual_embedding_dim": 2_0_4_8}
                  UpperCAmelCase_  :	Optional[Any]				      =		"vqa_advanced"
            elif "vqa" in checkpoint_path:
                  UpperCAmelCase_  :	Optional[Any]				      =		{"visual_embedding_dim": 2_0_4_8, "num_labels": 3_1_2_9}
                  UpperCAmelCase_  :	Optional[Any]				      =		"vqa"
            elif "nlvr" in checkpoint_path:
                  UpperCAmelCase_  :	Union[str, Any]				      =		{
                      "visual_embedding_dim": 1_0_2_4,
                      "num_labels": 2,
                  }
                  UpperCAmelCase_  :	List[str]				      =		"nlvr"

      UpperCAmelCase_  :	Tuple				      =		VisualBertConfig(**__snake_case    )

      # Load State Dict
      UpperCAmelCase_  :	Tuple				      =		load_state_dict(__snake_case    )

      UpperCAmelCase_  :	Optional[Any]				      =		get_new_dict(__snake_case					,  __snake_case    )

      if model_type == "pretraining":
            UpperCAmelCase_  :	Optional[Any]				      =		VisualBertForPreTraining(__snake_case    )
      elif model_type == "vqa":
            UpperCAmelCase_  :	int				      =		VisualBertForQuestionAnswering(__snake_case    )
      elif model_type == "nlvr":
            UpperCAmelCase_  :	Union[str, Any]				      =		VisualBertForVisualReasoning(__snake_case    )
      elif model_type == "multichoice":
            UpperCAmelCase_  :	Union[str, Any]				      =		VisualBertForMultipleChoice(__snake_case    )

      model.load_state_dict(__snake_case    )
      # Save Checkpoints
      Path(__snake_case    ).mkdir(exist_ok=__snake_case    )
      model.save_pretrained(__snake_case    )


if __name__ == "__main__":
   __lowerCamelCase         =			argparse.ArgumentParser()
   # Required parameters
   parser.add_argument('''orig_checkpoint_path''', type=str, help='''A path to .th on local filesystem.''')
   parser.add_argument('''pytorch_dump_folder_path''', type=str, help='''Path to the output PyTorch model.''')
   __lowerCamelCase         =			parser.parse_args()
   convert_visual_bert_checkpoint(args.orig_checkpoint_path, args.pytorch_dump_folder_path)





import os
from argparse import ArgumentParser, Namespace

from ..data import SingleSentenceClassificationProcessor as Processor
from ..pipelines import TextClassificationPipeline
from ..utils import is_tf_available, is_torch_available, logging
from . import BaseTransformersCLICommand


if not is_tf_available() and not is_torch_available():
   raise RuntimeError('''At least one of PyTorch or TensorFlow 2.0+ should be installed to use CLI training''')

# TF training parameters
__lowerCamelCase         =			False
__lowerCamelCase         =			False







def    _snake_case (       __snake_case    )     ->     Any:






      '''simple docstring'''







      return TrainCommand(__snake_case    )





class   snake_case_ (lowercase__  ):




       """simple docstring"""






       @staticmethod
       def  A_   (     lowercase):

             """simple docstring"""





             UpperCAmelCase_  :	str				      =		parser.add_parser("train"     ,help="CLI tool to train a model on a task.")

             train_parser.add_argument(
                 "--train_data"     ,type=lowercase     ,required=lowercase     ,help="path to train (and optionally evaluation) dataset as a csv with tab separated labels and sentences."     ,)
             train_parser.add_argument(
                 "--column_label"     ,type=lowercase     ,default=0     ,help="Column of the dataset csv file with example labels.")
             train_parser.add_argument(
                 "--column_text"     ,type=lowercase     ,default=1     ,help="Column of the dataset csv file with example texts.")
             train_parser.add_argument(
                 "--column_id"     ,type=lowercase     ,default=2     ,help="Column of the dataset csv file with example ids.")
             train_parser.add_argument(
                 "--skip_first_row"     ,action="store_true"     ,help="Skip the first row of the csv file (headers).")

             train_parser.add_argument("--validation_data"     ,type=lowercase     ,default=""     ,help="path to validation dataset.")
             train_parser.add_argument(
                 "--validation_split"     ,type=lowercase     ,default=0.1     ,help="if validation dataset is not provided, fraction of train dataset to use as validation dataset."     ,)

             train_parser.add_argument("--output"     ,type=lowercase     ,default="./"     ,help="path to saved the trained model.")

             train_parser.add_argument(
                 "--task"     ,type=lowercase     ,default="text_classification"     ,help="Task to train the model on.")
             train_parser.add_argument(
                 "--model"     ,type=lowercase     ,default="bert-base-uncased"     ,help="Model's name or path to stored model.")
             train_parser.add_argument("--train_batch_size"     ,type=lowercase     ,default=32     ,help="Batch size for training.")
             train_parser.add_argument("--valid_batch_size"     ,type=lowercase     ,default=64     ,help="Batch size for validation.")
             train_parser.add_argument("--learning_rate"     ,type=lowercase     ,default=3E-5     ,help="Learning rate.")
             train_parser.add_argument("--adam_epsilon"     ,type=lowercase     ,default=1E-08     ,help="Epsilon for Adam optimizer.")
             train_parser.set_defaults(func=lowercase)



       def __init__(     self     ,lowercase):

             """simple docstring"""





             UpperCAmelCase_  :	Optional[Any]				      =		logging.get_logger("transformers-cli/training")

             UpperCAmelCase_  :	List[Any]				      =		"tf" if is_tf_available() else "torch"

             os.makedirs(args.output     ,exist_ok=lowercase)
             UpperCAmelCase_  :	Union[str, Any]				      =		args.output

             UpperCAmelCase_  :	Optional[int]				      =		args.column_label
             UpperCAmelCase_  :	Dict				      =		args.column_text
             UpperCAmelCase_  :	Optional[Any]				      =		args.column_id

             self.logger.info(F"""Loading {args.task} pipeline for {args.model}""")
             if args.task == "text_classification":
                   UpperCAmelCase_  :	List[Any]				      =		TextClassificationPipeline.from_pretrained(args.model)
             elif args.task == "token_classification":
                   raise NotImplementedError
             elif args.task == "question_answering":
                   raise NotImplementedError

             self.logger.info(F"""Loading dataset from {args.train_data}""")
             UpperCAmelCase_  :	str				      =		Processor.create_from_csv(
                 args.train_data     ,column_label=args.column_label     ,column_text=args.column_text     ,column_id=args.column_id     ,skip_first_row=args.skip_first_row     ,)
             UpperCAmelCase_  :	str				      =		None
             if args.validation_data:
                   self.logger.info(F"""Loading validation dataset from {args.validation_data}""")
                   UpperCAmelCase_  :	Union[str, Any]				      =		Processor.create_from_csv(
                       args.validation_data     ,column_label=args.column_label     ,column_text=args.column_text     ,column_id=args.column_id     ,skip_first_row=args.skip_first_row     ,)

             UpperCAmelCase_  :	List[str]				      =		args.validation_split
             UpperCAmelCase_  :	Tuple				      =		args.train_batch_size
             UpperCAmelCase_  :	Optional[int]				      =		args.valid_batch_size
             UpperCAmelCase_  :	Dict				      =		args.learning_rate
             UpperCAmelCase_  :	List[str]				      =		args.adam_epsilon



       def  A_   (     self):

             """simple docstring"""





             if self.framework == "tf":
                   return self.run_tf()
             return self.run_torch()



       def  A_   (     self):

             """simple docstring"""





             raise NotImplementedError



       def  A_   (     self):

             """simple docstring"""





             self.pipeline.fit(
                 self.train_dataset     ,validation_data=self.valid_dataset     ,validation_split=self.validation_split     ,learning_rate=self.learning_rate     ,adam_epsilon=self.adam_epsilon     ,train_batch_size=self.train_batch_size     ,valid_batch_size=self.valid_batch_size     ,)

             # Save trained pipeline
             self.pipeline.save_pretrained(self.output)
