


"""simple docstring"""



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()
__snake_case   			=    logging.get_logger(__name__)

__snake_case   			=    [
    ("""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"""),
]

__snake_case   			=    [
    """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   __lowerCAmelCase						(						lowercase  :  Union[str, Any] )	->						Optional[Any]:


    """simple docstring"""





    snake_case    :      Union[str, Any]      					=    torch.load(__A						,							map_location="cpu" )
    return sd







def   __lowerCAmelCase						(						lowercase  :  str						,							lowercase  :  Any						,							lowercase  :  Dict=rename_keys_prefix )	->						Optional[Any]:


    """simple docstring"""





    snake_case    :      Tuple      					=    OrderedDict()
    snake_case    :      Union[str, Any]      					=    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
        snake_case    :      Optional[Any]      					=    key
        for name_pair in rename_keys_prefix:
            snake_case    :      Optional[Any]      					=    new_key.replace(name_pair[0]						,							name_pair[1] )
        snake_case    :      str      					=    d[key]
        if key == "bert.cls.predictions.decoder.weight":
            # Old bert code didn't have `decoder.bias`, but was added separately
            snake_case    :      Union[str, Any]      					=    new_d["cls.predictions.bias"]
    return new_d







@torch.no_grad()
def   __lowerCAmelCase						(						lowercase  :  Optional[Any]						,							lowercase  :  List[Any] )	->						List[Any]:


    """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:
        snake_case    :      Any      					=    "pretraining"
        if "vcr" in checkpoint_path:
            snake_case    :      str      					=    {"visual_embedding_dim": 512}
        elif "vqa_advanced" in checkpoint_path:
            snake_case    :      Optional[int]      					=    {"visual_embedding_dim": 2048}
        elif "vqa" in checkpoint_path:
            snake_case    :      List[Any]      					=    {"visual_embedding_dim": 2048}
        elif "nlvr" in checkpoint_path:
            snake_case    :      Any      					=    {"visual_embedding_dim": 1024}
        else:
            raise NotImplementedError(F'No implementation found for `{checkpoint_path}`.' )
    else:
        if "vcr" in checkpoint_path:
            snake_case    :      int      					=    {"visual_embedding_dim": 512}
            snake_case    :      Dict      					=    "multichoice"
        elif "vqa_advanced" in checkpoint_path:
            snake_case    :      List[str]      					=    {"visual_embedding_dim": 2048}
            snake_case    :      Optional[Any]      					=    "vqa_advanced"
        elif "vqa" in checkpoint_path:
            snake_case    :      Tuple      					=    {"visual_embedding_dim": 2048, "num_labels": 3129}
            snake_case    :      str      					=    "vqa"
        elif "nlvr" in checkpoint_path:
            snake_case    :      int      					=    {
                "visual_embedding_dim": 1024,
                "num_labels": 2,
            }
            snake_case    :      Dict      					=    "nlvr"

    snake_case    :      List[Any]      					=    VisualBertConfig(**__A )

    # Load State Dict
    snake_case    :      Tuple      					=    load_state_dict(__A )

    snake_case    :      List[str]      					=    get_new_dict(__A						,							__A )

    if model_type == "pretraining":
        snake_case    :      int      					=    VisualBertForPreTraining(__A )
    elif model_type == "vqa":
        snake_case    :      Any      					=    VisualBertForQuestionAnswering(__A )
    elif model_type == "nlvr":
        snake_case    :      str      					=    VisualBertForVisualReasoning(__A )
    elif model_type == "multichoice":
        snake_case    :      Dict      					=    VisualBertForMultipleChoice(__A )

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


if __name__ == "__main__":
  __snake_case   			=    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.""")
  __snake_case   			=    parser.parse_args()
  convert_visual_bert_checkpoint(args.orig_checkpoint_path, args.pytorch_dump_folder_path)






from manim import *





class      A							(				UpperCAmelCase_     ):


   def 			lowercase_      (self     :						Union[str, Any]		)						->				List[str]:
         """simple docstring"""



         UpperCAmelCase__								=  Rectangle(height=0.5       ,  width=0.5		)
         UpperCAmelCase__								=  Rectangle(height=0.46       ,  width=0.46		).set_stroke(width=0		)

         UpperCAmelCase__								=  Rectangle(height=0.25       ,  width=0.25		)

         UpperCAmelCase__								=  [mem.copy() for i in range(6		)]
         UpperCAmelCase__								=  [mem.copy() for i in range(6		)]
         UpperCAmelCase__								=  VGroup(*__UpperCAmelCase		).arrange(__UpperCAmelCase       ,  buff=0		)
         UpperCAmelCase__								=  VGroup(*__UpperCAmelCase		).arrange(__UpperCAmelCase       ,  buff=0		)
         UpperCAmelCase__								=  VGroup(__UpperCAmelCase       ,  __UpperCAmelCase		).arrange(__UpperCAmelCase       ,  buff=0		)
         UpperCAmelCase__								=  Text("CPU"       ,  font_size=2_4		)
         UpperCAmelCase__								=  Group(__UpperCAmelCase       ,  __UpperCAmelCase		).arrange(__UpperCAmelCase       ,  buff=0.5       ,  aligned_edge=__UpperCAmelCase		)
         cpu.move_to([-2.5, -0.5, 0]		)
         self.add(__UpperCAmelCase		)

         UpperCAmelCase__								=  [mem.copy() for i in range(4		)]
         UpperCAmelCase__								=  VGroup(*__UpperCAmelCase		).arrange(__UpperCAmelCase       ,  buff=0		)
         UpperCAmelCase__								=  Text("GPU"       ,  font_size=2_4		)
         UpperCAmelCase__								=  Group(__UpperCAmelCase       ,  __UpperCAmelCase		).arrange(__UpperCAmelCase       ,  buff=0.5       ,  aligned_edge=__UpperCAmelCase		)
         gpu.move_to([-1, -1, 0]		)
         self.add(__UpperCAmelCase		)

         UpperCAmelCase__								=  [mem.copy() for i in range(6		)]
         UpperCAmelCase__								=  VGroup(*__UpperCAmelCase		).arrange(__UpperCAmelCase       ,  buff=0		)

         UpperCAmelCase__								=  Text("Model"       ,  font_size=2_4		)
         UpperCAmelCase__								=  Group(__UpperCAmelCase       ,  __UpperCAmelCase		).arrange(__UpperCAmelCase       ,  buff=0.5       ,  aligned_edge=__UpperCAmelCase		)
         model.move_to([3, -1.0, 0]		)
         self.add(__UpperCAmelCase		)

         UpperCAmelCase__								=  []
         UpperCAmelCase__								=  []

         for i, rect in enumerate(__UpperCAmelCase		):
               UpperCAmelCase__								=  fill.copy().set_fill(__UpperCAmelCase       ,  opacity=0.8		)
               target.move_to(__UpperCAmelCase		)
               model_arr.append(__UpperCAmelCase		)

               UpperCAmelCase__								=  Rectangle(height=0.46       ,  width=0.46		).set_stroke(width=0.0		).set_fill(__UpperCAmelCase       ,  opacity=0.8		)
               cpu_target.move_to(cpu_left_col_base[i]		)
               model_cpu_arr.append(__UpperCAmelCase		)

         self.add(*__UpperCAmelCase       ,  *__UpperCAmelCase		)

         UpperCAmelCase__								=  [meta_mem.copy() for i in range(6		)]
         UpperCAmelCase__								=  [meta_mem.copy() for i in range(6		)]
         UpperCAmelCase__								=  VGroup(*__UpperCAmelCase		).arrange(__UpperCAmelCase       ,  buff=0		)
         UpperCAmelCase__								=  VGroup(*__UpperCAmelCase		).arrange(__UpperCAmelCase       ,  buff=0		)
         UpperCAmelCase__								=  VGroup(__UpperCAmelCase       ,  __UpperCAmelCase		).arrange(__UpperCAmelCase       ,  buff=0		)
         UpperCAmelCase__								=  Text("Disk"       ,  font_size=2_4		)
         UpperCAmelCase__								=  Group(__UpperCAmelCase       ,  __UpperCAmelCase		).arrange(__UpperCAmelCase       ,  buff=0.5       ,  aligned_edge=__UpperCAmelCase		)
         disk.move_to([-4, -1.25, 0]		)
         self.add(__UpperCAmelCase       ,  __UpperCAmelCase		)

         UpperCAmelCase__								=  Square(side_length=2.2		)
         key.move_to([-5, 2, 0]		)

         UpperCAmelCase__								=  MarkupText(
             f"""<b>Key:</b>\n\n<span fgcolor='{YELLOW}'>●</span> Empty Model"""       ,  font_size=1_8       ,  )

         key_text.move_to([-5, 2.4, 0]		)

         self.add(__UpperCAmelCase       ,  __UpperCAmelCase		)

         UpperCAmelCase__								=  MarkupText(
             f"""<span fgcolor='{BLUE}'>●</span> Checkpoint"""       ,  font_size=1_8       ,  )

         blue_text.next_to(__UpperCAmelCase       ,  DOWN * 2.4       ,  aligned_edge=key_text.get_left()		)
         self.add(__UpperCAmelCase		)

         UpperCAmelCase__								=  MarkupText(
             f"""Now watch as an input is passed through the model\nand how the memory is utilized and handled."""       ,  font_size=2_4       ,  )
         step_a.move_to([2, 2, 0]		)

         self.play(Write(__UpperCAmelCase		)		)

         UpperCAmelCase__								=  Square(0.3		)
         input.set_fill(__UpperCAmelCase       ,  opacity=1.0		)
         input.set_stroke(width=0.0		)
         input.next_to(model_base[0]       ,  __UpperCAmelCase       ,  buff=0.5		)

         self.play(Write(__UpperCAmelCase		)		)

         input.generate_target()
         input.target.next_to(model_arr[0]       ,  direction=__UpperCAmelCase       ,  buff=0.02		)
         self.play(MoveToTarget(__UpperCAmelCase		)		)

         self.play(FadeOut(__UpperCAmelCase		)		)

         UpperCAmelCase__								=  Arrow(start=__UpperCAmelCase       ,  end=__UpperCAmelCase       ,  color=__UpperCAmelCase       ,  buff=0.5		)
         a.next_to(model_arr[0].get_left()       ,  __UpperCAmelCase       ,  buff=0.2		)

         model_cpu_arr[0].generate_target()
         model_cpu_arr[0].target.move_to(gpu_rect[0]		)

         UpperCAmelCase__								=  MarkupText(
             f"""As the input reaches a layer, the hook triggers\nand weights are moved from the CPU\nto the GPU and back."""       ,  font_size=2_4       ,  )
         step_a.move_to([2, 2, 0]		)

         self.play(Write(__UpperCAmelCase       ,  run_time=3		)		)

         UpperCAmelCase__								=  {"run_time": 1, "fade_in": True, "fade_out": True, "buff": 0.02}

         self.play(
             Write(__UpperCAmelCase		)       ,  Circumscribe(model_arr[0]       ,  color=__UpperCAmelCase       ,  **__UpperCAmelCase		)       ,  Circumscribe(model_cpu_arr[0]       ,  color=__UpperCAmelCase       ,  **__UpperCAmelCase		)       ,  Circumscribe(gpu_rect[0]       ,  color=__UpperCAmelCase       ,  **__UpperCAmelCase		)       ,  )
         self.play(MoveToTarget(model_cpu_arr[0]		)		)

         UpperCAmelCase__								=  a.copy()
         for i in range(6		):
               a_c.next_to(model_arr[i].get_right() + 0.02       ,  __UpperCAmelCase       ,  buff=0.2		)

               input.generate_target()
               input.target.move_to(model_arr[i].get_right() + 0.02		)

               UpperCAmelCase__								=  AnimationGroup(
                   FadeOut(__UpperCAmelCase       ,  run_time=0.5		)       ,  MoveToTarget(__UpperCAmelCase       ,  run_time=0.5		)       ,  FadeIn(__UpperCAmelCase       ,  run_time=0.5		)       ,  lag_ratio=0.2		)

               self.play(__UpperCAmelCase		)

               model_cpu_arr[i].generate_target()
               model_cpu_arr[i].target.move_to(cpu_left_col_base[i]		)

               if i < 5:
                     model_cpu_arr[i + 1].generate_target()
                     model_cpu_arr[i + 1].target.move_to(gpu_rect[0]		)
                     if i >= 1:
                           UpperCAmelCase__								=  0.7

                     self.play(
                         Circumscribe(model_arr[i]       ,  **__UpperCAmelCase		)       ,  Circumscribe(cpu_left_col_base[i]       ,  **__UpperCAmelCase		)       ,  Circumscribe(cpu_left_col_base[i + 1]       ,  color=__UpperCAmelCase       ,  **__UpperCAmelCase		)       ,  Circumscribe(gpu_rect[0]       ,  color=__UpperCAmelCase       ,  **__UpperCAmelCase		)       ,  Circumscribe(model_arr[i + 1]       ,  color=__UpperCAmelCase       ,  **__UpperCAmelCase		)       ,  )
                     if i < 1:
                           self.play(
                               MoveToTarget(model_cpu_arr[i]		)       ,  MoveToTarget(model_cpu_arr[i + 1]		)       ,  )
                     else:
                           self.play(
                               MoveToTarget(model_cpu_arr[i]       ,  run_time=0.7		)       ,  MoveToTarget(model_cpu_arr[i + 1]       ,  run_time=0.7		)       ,  )
               else:
                     model_cpu_arr[i].generate_target()
                     model_cpu_arr[i].target.move_to(cpu_left_col_base[-1]		)
                     input.generate_target()
                     input.target.next_to(model_arr[-1].get_right()       ,  RIGHT + 0.02       ,  buff=0.2		)

                     self.play(
                         Circumscribe(model_arr[-1]       ,  color=__UpperCAmelCase       ,  **__UpperCAmelCase		)       ,  Circumscribe(cpu_left_col_base[-1]       ,  color=__UpperCAmelCase       ,  **__UpperCAmelCase		)       ,  Circumscribe(gpu_rect[0]       ,  color=__UpperCAmelCase       ,  **__UpperCAmelCase		)       ,  )

                     self.play(MoveToTarget(model_cpu_arr[i]		)		)

               UpperCAmelCase__								=  a_c
               UpperCAmelCase__								=  a_c.copy()

         input.generate_target()
         input.target.next_to(model_base[-1]       ,  RIGHT + 0.02       ,  buff=0.5		)
         self.play(
             FadeOut(__UpperCAmelCase		)       ,  FadeOut(__UpperCAmelCase       ,  run_time=0.5		)       ,  )

         UpperCAmelCase__								=  MarkupText(f"""Inference on a model too large for GPU memory\nis successfully completed."""       ,  font_size=2_4		)
         step_a.move_to([2, 2, 0]		)

         self.play(Write(__UpperCAmelCase       ,  run_time=3		)       ,  MoveToTarget(__UpperCAmelCase		)		)

         self.wait()



