


import argparse
import json
from pathlib import Path

import requests
import torch
from huggingface_hub import hf_hub_download
from PIL import Image

from transformers import (
    BertTokenizer,
    ViltConfig,
    ViltForImageAndTextRetrieval,
    ViltForImagesAndTextClassification,
    ViltForMaskedLM,
    ViltForQuestionAnswering,
    ViltImageProcessor,
    ViltProcessor,
)
from transformers.utils import logging


logging.set_verbosity_info()
snake_case							:       List[Any]										=	logging.get_logger(__name__)
def 							__lowerCamelCase		(					UpperCAmelCase_		:						Union[str, Any]					,    UpperCAmelCase_		:						str=False					,    UpperCAmelCase_		:						Any=False					,    UpperCAmelCase_		:						int=False		):




      """simple docstring"""





      a		:Union[str, Any]									=			[]
      for i in range(config.num_hidden_layers		):
            # encoder layers: output projection, 2 feedforward neural networks and 2 layernorms
            rename_keys.append((F'''transformer.blocks.{i}.norm1.weight''', F'''vilt.encoder.layer.{i}.layernorm_before.weight''')		)
            rename_keys.append((F'''transformer.blocks.{i}.norm1.bias''', F'''vilt.encoder.layer.{i}.layernorm_before.bias''')		)
            rename_keys.append(
                (F'''transformer.blocks.{i}.attn.proj.weight''', F'''vilt.encoder.layer.{i}.attention.output.dense.weight''')		)
            rename_keys.append(
                (F'''transformer.blocks.{i}.attn.proj.bias''', F'''vilt.encoder.layer.{i}.attention.output.dense.bias''')		)
            rename_keys.append((F'''transformer.blocks.{i}.norm2.weight''', F'''vilt.encoder.layer.{i}.layernorm_after.weight''')		)
            rename_keys.append((F'''transformer.blocks.{i}.norm2.bias''', F'''vilt.encoder.layer.{i}.layernorm_after.bias''')		)
            rename_keys.append(
                (F'''transformer.blocks.{i}.mlp.fc1.weight''', F'''vilt.encoder.layer.{i}.intermediate.dense.weight''')		)
            rename_keys.append((F'''transformer.blocks.{i}.mlp.fc1.bias''', F'''vilt.encoder.layer.{i}.intermediate.dense.bias''')		)
            rename_keys.append((F'''transformer.blocks.{i}.mlp.fc2.weight''', F'''vilt.encoder.layer.{i}.output.dense.weight''')		)
            rename_keys.append((F'''transformer.blocks.{i}.mlp.fc2.bias''', F'''vilt.encoder.layer.{i}.output.dense.bias''')		)

      # embeddings
      rename_keys.extend(
          [
              # text embeddings
              ('''text_embeddings.word_embeddings.weight''', '''vilt.embeddings.text_embeddings.word_embeddings.weight'''),
              (
                  '''text_embeddings.position_embeddings.weight''',
                  '''vilt.embeddings.text_embeddings.position_embeddings.weight''',
              ),
              ('''text_embeddings.position_ids''', '''vilt.embeddings.text_embeddings.position_ids'''),
              (
                  '''text_embeddings.token_type_embeddings.weight''',
                  '''vilt.embeddings.text_embeddings.token_type_embeddings.weight''',
              ),
              ('''text_embeddings.LayerNorm.weight''', '''vilt.embeddings.text_embeddings.LayerNorm.weight'''),
              ('''text_embeddings.LayerNorm.bias''', '''vilt.embeddings.text_embeddings.LayerNorm.bias'''),
              # patch embeddings
              ('''transformer.cls_token''', '''vilt.embeddings.cls_token'''),
              ('''transformer.patch_embed.proj.weight''', '''vilt.embeddings.patch_embeddings.projection.weight'''),
              ('''transformer.patch_embed.proj.bias''', '''vilt.embeddings.patch_embeddings.projection.bias'''),
              ('''transformer.pos_embed''', '''vilt.embeddings.position_embeddings'''),
              # token type embeddings
              ('''token_type_embeddings.weight''', '''vilt.embeddings.token_type_embeddings.weight'''),
          ]		)

      # final layernorm + pooler
      rename_keys.extend(
          [
              ('''transformer.norm.weight''', '''vilt.layernorm.weight'''),
              ('''transformer.norm.bias''', '''vilt.layernorm.bias'''),
              ('''pooler.dense.weight''', '''vilt.pooler.dense.weight'''),
              ('''pooler.dense.bias''', '''vilt.pooler.dense.bias'''),
          ]		)

      # classifier head(s)
      if vqa_model:
            # classification head
            rename_keys.extend(
                [
                    ('''vqa_classifier.0.weight''', '''classifier.0.weight'''),
                    ('''vqa_classifier.0.bias''', '''classifier.0.bias'''),
                    ('''vqa_classifier.1.weight''', '''classifier.1.weight'''),
                    ('''vqa_classifier.1.bias''', '''classifier.1.bias'''),
                    ('''vqa_classifier.3.weight''', '''classifier.3.weight'''),
                    ('''vqa_classifier.3.bias''', '''classifier.3.bias'''),
                ]		)
      elif nlvr_model:
            # classification head
            rename_keys.extend(
                [
                    ('''nlvr2_classifier.0.weight''', '''classifier.0.weight'''),
                    ('''nlvr2_classifier.0.bias''', '''classifier.0.bias'''),
                    ('''nlvr2_classifier.1.weight''', '''classifier.1.weight'''),
                    ('''nlvr2_classifier.1.bias''', '''classifier.1.bias'''),
                    ('''nlvr2_classifier.3.weight''', '''classifier.3.weight'''),
                    ('''nlvr2_classifier.3.bias''', '''classifier.3.bias'''),
                ]		)
      else:
            pass

      return rename_keys
def 							__lowerCamelCase		(					UpperCAmelCase_		:						Optional[int]					,    UpperCAmelCase_		:						Optional[Any]		):




      """simple docstring"""





      for i in range(config.num_hidden_layers		):
            a		:Any									=			'''vilt.'''
            # read in weights + bias of input projection layer (in timm, this is a single matrix + bias)
            a		:List[Any]									=			state_dict.pop(F'''transformer.blocks.{i}.attn.qkv.weight'''		)
            a		:List[Any]									=			state_dict.pop(F'''transformer.blocks.{i}.attn.qkv.bias'''		)
            # next, add query, keys and values (in that order) to the state dict
            a		:Union[str, Any]									=			in_proj_weight[
                : config.hidden_size, :
            ]
            a		:str									=			in_proj_bias[: config.hidden_size]
            a		:Tuple									=			in_proj_weight[
                config.hidden_size : config.hidden_size * 2, :
            ]
            a		:Any									=			in_proj_bias[
                config.hidden_size : config.hidden_size * 2
            ]
            a		:str									=			in_proj_weight[
                -config.hidden_size :, :
            ]
            a		:Any									=			in_proj_bias[-config.hidden_size :]
def 							__lowerCamelCase		(					UpperCAmelCase_		:						int		):




      """simple docstring"""





      a		:List[str]									=			['''head.weight''', '''head.bias''']
      for k in ignore_keys:
            state_dict.pop(UpperCAmelCase_					,    UpperCAmelCase_		)
def 							__lowerCamelCase		(					UpperCAmelCase_		:						int					,    UpperCAmelCase_		:						str					,    UpperCAmelCase_		:						str		):




      """simple docstring"""





      a		:Tuple									=			dct.pop(UpperCAmelCase_		)
      a		:Tuple									=			val
@torch.no_grad()
def 							__lowerCamelCase		(					UpperCAmelCase_		:						Tuple					,    UpperCAmelCase_		:						str		):




      """simple docstring"""





      a		:Tuple									=			ViltConfig(image_size=384					,    patch_size=32					,    tie_word_embeddings=UpperCAmelCase_		)
      a		:List[Any]									=			False
      a		:Optional[int]									=			False
      a		:str									=			False
      a		:Dict									=			False
      if "vqa" in checkpoint_url:
            a		:List[Any]									=			True
            a		:List[Any]									=			3129
            a		:str									=			'''huggingface/label-files'''
            a		:str									=			'''vqa2-id2label.json'''
            a		:List[Any]									=			json.load(open(hf_hub_download(UpperCAmelCase_					,    UpperCAmelCase_					,    repo_type='''dataset'''		)					,    '''r'''		)		)
            a		:Dict									=			{int(UpperCAmelCase_		): v for k, v in idalabel.items()}
            a		:List[str]									=			idalabel
            a		:List[str]									=			{v: k for k, v in idalabel.items()}
            a		:List[Any]									=			ViltForQuestionAnswering(UpperCAmelCase_		)
      elif "nlvr" in checkpoint_url:
            a		:Dict									=			True
            a		:int									=			2
            a		:Optional[int]									=			{0: '''False''', 1: '''True'''}
            a		:Dict									=			{v: k for k, v in config.idalabel.items()}
            a		:int									=			3
            a		:Dict									=			ViltForImagesAndTextClassification(UpperCAmelCase_		)
      elif "irtr" in checkpoint_url:
            a		:Tuple									=			True
            a		:int									=			ViltForImageAndTextRetrieval(UpperCAmelCase_		)
      elif "mlm_itm" in checkpoint_url:
            a		:Tuple									=			True
            a		:Tuple									=			ViltForMaskedLM(UpperCAmelCase_		)
      else:
            raise ValueError('''Unknown model type'''		)

      # load state_dict of original model, remove and rename some keys
      a		:Union[str, Any]									=			torch.hub.load_state_dict_from_url(UpperCAmelCase_					,    map_location='''cpu'''		)['''state_dict''']
      a		:int									=			create_rename_keys(UpperCAmelCase_					,    UpperCAmelCase_					,    UpperCAmelCase_					,    UpperCAmelCase_		)
      for src, dest in rename_keys:
            rename_key(UpperCAmelCase_					,    UpperCAmelCase_					,    UpperCAmelCase_		)
      read_in_q_k_v(UpperCAmelCase_					,    UpperCAmelCase_		)
      if mlm_model or irtr_model:
            a		:List[Any]									=			['''itm_score.fc.weight''', '''itm_score.fc.bias''']
            for k in ignore_keys:
                  state_dict.pop(UpperCAmelCase_					,    UpperCAmelCase_		)

    # load state dict into HuggingFace model
      model.eval()
      if mlm_model:
            a				,							a		:Union[str, Any]									=			model.load_state_dict(UpperCAmelCase_					,    strict=UpperCAmelCase_		)
            assert missing_keys == ["mlm_score.decoder.bias"]
      else:
            model.load_state_dict(UpperCAmelCase_		)

      # Define processor
      a		:Optional[Any]									=			ViltImageProcessor(size=384		)
      a		:Tuple									=			BertTokenizer.from_pretrained('''bert-base-uncased'''		)
      a		:int									=			ViltProcessor(UpperCAmelCase_					,    UpperCAmelCase_		)

      # Forward pass on example inputs (image + text)
      if nlvr_model:
            a		:Optional[int]									=			Image.open(requests.get('''https://lil.nlp.cornell.edu/nlvr/exs/ex0_0.jpg'''					,    stream=UpperCAmelCase_		).raw		)
            a		:List[Any]									=			Image.open(requests.get('''https://lil.nlp.cornell.edu/nlvr/exs/ex0_0.jpg'''					,    stream=UpperCAmelCase_		).raw		)
            a		:Dict									=			(
                '''The left image contains twice the number of dogs as the right image, and at least two dogs in total are'''
                ''' standing.'''
            )
            a		:int									=			processor(UpperCAmelCase_					,    UpperCAmelCase_					,    return_tensors='''pt'''		)
            a		:List[Any]									=			processor(UpperCAmelCase_					,    UpperCAmelCase_					,    return_tensors='''pt'''		)
            a		:Optional[Any]									=			model(
                input_ids=encoding_a.input_ids					,    pixel_values=encoding_a.pixel_values					,    pixel_values_a=encoding_a.pixel_values					,    )
      else:
            a		:int									=			Image.open(requests.get('''http://images.cocodataset.org/val2017/000000039769.jpg'''					,    stream=UpperCAmelCase_		).raw		)
            if mlm_model:
                  a		:str									=			'''a bunch of [MASK] laying on a [MASK].'''
            else:
                  a		:Optional[int]									=			'''How many cats are there?'''
            a		:List[Any]									=			processor(UpperCAmelCase_					,    UpperCAmelCase_					,    return_tensors='''pt'''		)
            a		:Tuple									=			model(**UpperCAmelCase_		)

      # Verify outputs
      if mlm_model:
            a		:List[Any]									=			torch.Size([1, 11, 3_0522]		)
            a		:Optional[int]									=			torch.tensor([-12.5061, -12.5123, -12.5174]		)
            assert outputs.logits.shape == expected_shape
            assert torch.allclose(outputs.logits[0, 0, :3]					,    UpperCAmelCase_					,    atol=1E-4		)

            # verify masked token prediction equals "cats"
            a		:Optional[Any]									=			outputs.logits[0, 4, :].argmax(-1		).item()
            assert tokenizer.decode([predicted_id]		) == "cats"
      elif vqa_model:
            a		:Optional[Any]									=			torch.Size([1, 3129]		)
            a		:Tuple									=			torch.tensor([-15.9495, -18.1472, -10.3041]		)
            assert torch.allclose(outputs.logits[0, :3]					,    UpperCAmelCase_					,    atol=1E-4		)
            assert outputs.logits.shape == expected_shape
            assert torch.allclose(outputs.logits[0, 0, :3]					,    UpperCAmelCase_					,    atol=1E-4		)

            # verify vqa prediction equals "2"
            a		:Tuple									=			outputs.logits.argmax(-1		).item()
            assert model.config.idalabel[predicted_idx] == "2"
      elif nlvr_model:
            a		:str									=			torch.Size([1, 2]		)
            a		:Tuple									=			torch.tensor([-2.8721, 2.1291]		)
            assert torch.allclose(outputs.logits[0, :3]					,    UpperCAmelCase_					,    atol=1E-4		)
            assert outputs.logits.shape == expected_shape

      Path(UpperCAmelCase_		).mkdir(exist_ok=UpperCAmelCase_		)
      print(F'''Saving model and processor to {pytorch_dump_folder_path}'''		)
      model.save_pretrained(UpperCAmelCase_		)
      processor.save_pretrained(UpperCAmelCase_		)


if __name__ == "__main__":
     snake_case							:       List[str]										=	argparse.ArgumentParser()
     # Required parameters
     parser.add_argument(
         '''--checkpoint_url''',
         default='''https://github.com/dandelin/ViLT/releases/download/200k/vilt_200k_mlm_itm.ckpt''',
         type=str,
         help='''URL of the checkpoint you\'d like to convert.''',
     )
     parser.add_argument(
         '''--pytorch_dump_folder_path''', default=None, type=str, help='''Path to the output PyTorch model directory.'''
     )

     snake_case							:       Optional[Any]										=	parser.parse_args()
     convert_vilt_checkpoint(args.checkpoint_url, args.pytorch_dump_folder_path)









import datasets


snake_case							:       int										=	'''\
@InProceedings{conneau2018xnli,
  author = "Conneau, Alexis
                 and Rinott, Ruty
                 and Lample, Guillaume
                 and Williams, Adina
                 and Bowman, Samuel R.
                 and Schwenk, Holger
                 and Stoyanov, Veselin",
  title = "XNLI: Evaluating Cross-lingual Sentence Representations",
  booktitle = "Proceedings of the 2018 Conference on Empirical Methods
               in Natural Language Processing",
  year = "2018",
  publisher = "Association for Computational Linguistics",
  location = "Brussels, Belgium",
}
'''

snake_case							:       Tuple										=	'''\
XNLI is a subset of a few thousand examples from MNLI which has been translated
into a 14 different languages (some low-ish resource). As with MNLI, the goal is
to predict textual entailment (does sentence A imply/contradict/neither sentence
B) and is a classification task (given two sentences, predict one of three
labels).
'''

snake_case							:       Union[str, Any]										=	'''
Computes XNLI score which is just simple accuracy.
Args:
    predictions: Predicted labels.
    references: Ground truth labels.
Returns:
    \'accuracy\': accuracy
Examples:

    >>> predictions = [0, 1]
    >>> references = [0, 1]
    >>> xnli_metric = datasets.load_metric("xnli")
    >>> results = xnli_metric.compute(predictions=predictions, references=references)
    >>> print(results)
    {\'accuracy\': 1.0}
'''
def 							__lowerCamelCase		(					UpperCAmelCase_		:						List[Any]					,    UpperCAmelCase_		:						List[str]		):




      """simple docstring"""





      return (preds == labels).mean()







@datasets.utils.file_utils.add_start_docstrings(_DESCRIPTION		,       _KWARGS_DESCRIPTION				)
class 						_snake_case    ( datasets.Metric				):




 def 			SCREAMING_SNAKE_CASE__							(						self       ):
       return datasets.MetricInfo(
           description=_DESCRIPTION   ,    citation=_CITATION   ,    inputs_description=_KWARGS_DESCRIPTION   ,    features=datasets.Features(
               {
                   '''predictions''': datasets.Value('''int64''' if self.config_name != '''sts-b''' else '''float32'''       ),
                   '''references''': datasets.Value('''int64''' if self.config_name != '''sts-b''' else '''float32'''       ),
               }       )   ,    codebase_urls=[]   ,    reference_urls=[]   ,    format='''numpy'''   ,    )




 def 			SCREAMING_SNAKE_CASE__							(						self   ,    _lowerCamelCase   ,    _lowerCamelCase       ):
       return {"accuracy": simple_accuracy(_lowerCamelCase   ,    _lowerCamelCase       )}





