




import argparse

import requests
import torch

# pip3 install salesforce-lavis
# I'm actually installing a slightly modified version: pip3 install git+https://github.com/nielsrogge/LAVIS.git@fix_lavis
from lavis.models import load_model_and_preprocess
from PIL import Image

from transformers import (
    AutoTokenizer,
    BlipaConfig,
    BlipaForConditionalGeneration,
    BlipaProcessor,
    BlipaVisionConfig,
    BlipImageProcessor,
    OPTConfig,
    TaConfig,
)
from transformers.utils.constants import OPENAI_CLIP_MEAN, OPENAI_CLIP_STD







def SCREAMING_SNAKE_CASE    (	)       ->	Optional[int]:



       """simple docstring"""

       A__							=   '''https://storage.googleapis.com/sfr-vision-language-research/LAVIS/assets/merlion.png'''
       A__							=   Image.open(requests.get(lowercase_			,    stream=lowercase_						).raw						).convert('''RGB'''						)

       return image







def SCREAMING_SNAKE_CASE    (	lowercase_						)       ->	List[str]:



       """simple docstring"""

       A__							=   []
       # fmt: off

       # vision encoder
       rename_keys.append(('''visual_encoder.cls_token''', '''vision_model.embeddings.class_embedding''')						)
       rename_keys.append(('''visual_encoder.pos_embed''', '''vision_model.embeddings.position_embedding''')						)
       rename_keys.append(('''visual_encoder.patch_embed.proj.weight''', '''vision_model.embeddings.patch_embedding.weight''')						)
       rename_keys.append(('''visual_encoder.patch_embed.proj.bias''', '''vision_model.embeddings.patch_embedding.bias''')						)
       rename_keys.append(('''ln_vision.weight''', '''vision_model.post_layernorm.weight''')						)
       rename_keys.append(('''ln_vision.bias''', '''vision_model.post_layernorm.bias''')						)

       for i in range(config.vision_config.num_hidden_layers						):
              rename_keys.append((f"""visual_encoder.blocks.{i}.norm1.weight""", f"""vision_model.encoder.layers.{i}.layer_norm1.weight""")						)
              rename_keys.append((f"""visual_encoder.blocks.{i}.norm1.bias""", f"""vision_model.encoder.layers.{i}.layer_norm1.bias""")						)
              rename_keys.append((f"""visual_encoder.blocks.{i}.norm2.weight""", f"""vision_model.encoder.layers.{i}.layer_norm2.weight""")						)
              rename_keys.append((f"""visual_encoder.blocks.{i}.norm2.bias""", f"""vision_model.encoder.layers.{i}.layer_norm2.bias""")						)
              rename_keys.append((f"""visual_encoder.blocks.{i}.attn.qkv.weight""", f"""vision_model.encoder.layers.{i}.self_attn.qkv.weight""")						)
              rename_keys.append((f"""visual_encoder.blocks.{i}.attn.proj.weight""", f"""vision_model.encoder.layers.{i}.self_attn.projection.weight""",)						)
              rename_keys.append((f"""visual_encoder.blocks.{i}.attn.proj.bias""", f"""vision_model.encoder.layers.{i}.self_attn.projection.bias""")						)
              rename_keys.append((f"""visual_encoder.blocks.{i}.mlp.fc1.weight""", f"""vision_model.encoder.layers.{i}.mlp.fc1.weight""")						)
              rename_keys.append((f"""visual_encoder.blocks.{i}.mlp.fc1.bias""", f"""vision_model.encoder.layers.{i}.mlp.fc1.bias""")						)
              rename_keys.append((f"""visual_encoder.blocks.{i}.mlp.fc2.weight""", f"""vision_model.encoder.layers.{i}.mlp.fc2.weight""")						)
              rename_keys.append((f"""visual_encoder.blocks.{i}.mlp.fc2.bias""", f"""vision_model.encoder.layers.{i}.mlp.fc2.bias""")						)

       # QFormer
       rename_keys.append(('''Qformer.bert.embeddings.LayerNorm.weight''', '''qformer.layernorm.weight''')						)
       rename_keys.append(('''Qformer.bert.embeddings.LayerNorm.bias''', '''qformer.layernorm.bias''')						)

       # fmt: on
       return rename_keys







def SCREAMING_SNAKE_CASE    (	lowercase_			,    lowercase_			,    lowercase_						)       ->	int:



       """simple docstring"""

       A__							=   dct.pop(lowercase_						)
       A__							=   val







def SCREAMING_SNAKE_CASE    (	lowercase_			,    lowercase_						)       ->	int:



       """simple docstring"""

       for i in range(config.vision_config.num_hidden_layers						):
              # read in original q and v biases
              A__							=   state_dict.pop(f"""visual_encoder.blocks.{i}.attn.q_bias"""						)
              A__							=   state_dict.pop(f"""visual_encoder.blocks.{i}.attn.v_bias"""						)

              # next, set bias in the state dict
              A__							=   torch.cat((q_bias, torch.zeros_like(lowercase_			,    requires_grad=lowercase_						), v_bias)						)
              A__							=   qkv_bias







def SCREAMING_SNAKE_CASE    (	lowercase_			,    lowercase_						)       ->	Any:



       """simple docstring"""

       A__							=   364 if '''coco''' in model_name else 224
       A__							=   BlipaVisionConfig(image_size=lowercase_						).to_dict()

       # make sure the models have proper bos_token_id and eos_token_id set (important for generation)
       # seems like flan-T5 models don't have bos_token_id properly set?
       if "opt-2.7b" in model_name:
              A__							=   OPTConfig.from_pretrained('''facebook/opt-2.7b'''			,    eos_token_id=lowercase_						).to_dict()
       elif "opt-6.7b" in model_name:
              A__							=   OPTConfig.from_pretrained('''facebook/opt-6.7b'''			,    eos_token_id=lowercase_						).to_dict()
       elif "t5-xl" in model_name:
              A__							=   TaConfig.from_pretrained('''google/flan-t5-xl'''			,    dense_act_fn='''gelu'''			,    bos_token_id=1						).to_dict()
       elif "t5-xxl" in model_name:
              A__							=   TaConfig.from_pretrained('''google/flan-t5-xxl'''			,    dense_act_fn='''gelu'''			,    bos_token_id=1						).to_dict()

       A__							=   BlipaConfig(vision_config=lowercase_			,    text_config=lowercase_						)

       return config, image_size







@torch.no_grad()
def SCREAMING_SNAKE_CASE    (	lowercase_			,    lowercase_=None			,    lowercase_=False						)       ->	List[str]:



       """simple docstring"""

       A__							=   (
           AutoTokenizer.from_pretrained('''facebook/opt-2.7b'''						)
           if '''opt''' in model_name
           else AutoTokenizer.from_pretrained('''google/flan-t5-xl'''						)
       )
       A__							=   tokenizer('''\n'''			,    add_special_tokens=lowercase_						).input_ids[0]
       A__			,							A__							=   get_blipa_config(lowercase_			,    eos_token_id=lowercase_						)

       A__							=   BlipaForConditionalGeneration(lowercase_						).eval()

       A__							=   {
           '''blip2-opt-2.7b''': ('''blip2_opt''', '''pretrain_opt2.7b'''),
           '''blip2-opt-6.7b''': ('''blip2_opt''', '''pretrain_opt6.7b'''),
           '''blip2-opt-2.7b-coco''': ('''blip2_opt''', '''caption_coco_opt2.7b'''),
           '''blip2-opt-6.7b-coco''': ('''blip2_opt''', '''caption_coco_opt6.7b'''),
           '''blip2-flan-t5-xl''': ('''blip2_t5''', '''pretrain_flant5xl'''),
           '''blip2-flan-t5-xl-coco''': ('''blip2_t5''', '''caption_coco_flant5xl'''),
           '''blip2-flan-t5-xxl''': ('''blip2_t5''', '''pretrain_flant5xxl'''),
       }

       A__			,							A__							=   model_name_to_original[model_name]

       # load original model
       print('''Loading original model...'''						)
       A__							=   '''cuda''' if torch.cuda.is_available() else '''cpu'''
       A__			,							A__			,							A__							=   load_model_and_preprocess(
           name=lowercase_			,    model_type=lowercase_			,    is_eval=lowercase_			,    device=lowercase_						)
       original_model.eval()
       print('''Done!'''						)

       # update state dict keys
       A__							=   original_model.state_dict()
       A__							=   create_rename_keys(lowercase_						)
       for src, dest in rename_keys:
              rename_key(lowercase_			,    lowercase_			,    lowercase_						)

       # some keys can be renamed efficiently
       for key, val in state_dict.copy().items():
              A__							=   state_dict.pop(lowercase_						)
              if key.startswith('''Qformer.bert'''						):
                     A__							=   key.replace('''Qformer.bert'''			,    '''qformer'''						)
              if "attention.self" in key:
                     A__							=   key.replace('''self'''			,    '''attention'''						)
              if "opt_proj" in key:
                     A__							=   key.replace('''opt_proj'''			,    '''language_projection'''						)
              if "t5_proj" in key:
                     A__							=   key.replace('''t5_proj'''			,    '''language_projection'''						)
              if key.startswith('''opt'''						):
                     A__							=   key.replace('''opt'''			,    '''language'''						)
              if key.startswith('''t5'''						):
                     A__							=   key.replace('''t5'''			,    '''language'''						)
              A__							=   val

       # read in qv biases
       read_in_q_v_bias(lowercase_			,    lowercase_						)

       A__			,							A__							=   hf_model.load_state_dict(lowercase_			,    strict=lowercase_						)
       assert len(lowercase_						) == 0
       assert unexpected_keys == ["qformer.embeddings.position_ids"]

       A__							=   load_demo_image()
       A__							=   vis_processors['''eval'''](lowercase_						).unsqueeze(0						).to(lowercase_						)
       A__							=   tokenizer(['''\n''']			,    return_tensors='''pt'''						).input_ids.to(lowercase_						)

       # create processor
       A__							=   BlipImageProcessor(
           size={'''height''': image_size, '''width''': image_size}			,    image_mean=lowercase_			,    image_std=lowercase_						)
       A__							=   BlipaProcessor(image_processor=lowercase_			,    tokenizer=lowercase_						)
       A__							=   processor(images=lowercase_			,    return_tensors='''pt'''						).pixel_values.to(lowercase_						)

       # make sure processor creates exact same pixel values
       assert torch.allclose(lowercase_			,    lowercase_						)

       original_model.to(lowercase_						)
       hf_model.to(lowercase_						)
       with torch.no_grad():
              if "opt" in model_name:
                     A__							=   original_model({'''image''': original_pixel_values, '''text_input''': ['''''']}						).logits
                     A__							=   hf_model(lowercase_			,    lowercase_						).logits
              else:
                     A__							=   original_model(
                         {'''image''': original_pixel_values, '''text_input''': ['''\n'''], '''text_output''': ['''\n''']}						).logits
                     A__							=   input_ids.masked_fill(input_ids == tokenizer.pad_token_id			,    -100						)
                     A__							=   hf_model(lowercase_			,    lowercase_			,    labels=lowercase_						).logits

       assert original_logits.shape == logits.shape
       print('''First values of original logits:'''			,    original_logits[0, :3, :3]						)
       print('''First values of HF logits:'''			,    logits[0, :3, :3]						)

       # assert values
       if model_name == "blip2-flan-t5-xl":
              A__							=   torch.tensor(
                  [[-41.5_850, -4.44_40, -8.99_22], [-47.4_322, -5.91_43, -1.73_40]]			,    device=lowercase_						)
              assert torch.allclose(logits[0, :3, :3]			,    lowercase_			,    atol=1E-4						)
       elif model_name == "blip2-flan-t5-xl-coco":
              A__							=   torch.tensor(
                  [[-57.0_109, -9.89_67, -12.6_280], [-68.6_578, -12.7_191, -10.5_065]]			,    device=lowercase_						)
       else:
              # cast to same type
              A__							=   logits.dtype
              assert torch.allclose(original_logits.to(lowercase_						)			,    lowercase_			,    atol=1E-2						)
       print('''Looks ok!'''						)

       print('''Generating a caption...'''						)
       A__							=   ''''''
       A__							=   tokenizer(lowercase_			,    return_tensors='''pt'''						).input_ids.to(lowercase_						)

       A__							=   original_model.generate({'''image''': original_pixel_values}						)
       A__							=   hf_model.generate(
           lowercase_			,    lowercase_			,    do_sample=lowercase_			,    num_beams=5			,    max_length=30			,    min_length=1			,    top_p=0.9			,    repetition_penalty=1.0			,    length_penalty=1.0			,    temperature=1			,    )
       print('''Original generation:'''			,    lowercase_						)
       A__							=   input_ids.shape[1]
       A__							=   processor.batch_decode(outputs[:, prompt_length:]			,    skip_special_tokens=lowercase_						)
       A__							=   [text.strip() for text in output_text]
       print('''HF generation:'''			,    lowercase_						)

       if pytorch_dump_folder_path is not None:
              processor.save_pretrained(lowercase_						)
              hf_model.save_pretrained(lowercase_						)

       if push_to_hub:
              processor.push_to_hub(f"""nielsr/{model_name}"""						)
              hf_model.push_to_hub(f"""nielsr/{model_name}"""						)


if __name__ == "__main__":
  _lowerCamelCase     :		Any								=       argparse.ArgumentParser()
  _lowerCamelCase     :		Tuple								=       [
      """blip2-opt-2.7b""",
      """blip2-opt-6.7b""",
      """blip2-opt-2.7b-coco""",
      """blip2-opt-6.7b-coco""",
      """blip2-flan-t5-xl""",
      """blip2-flan-t5-xl-coco""",
      """blip2-flan-t5-xxl""",
  ]
  parser.add_argument(
      """--model_name""",
      default="""blip2-opt-2.7b""",
      choices=choices,
      type=str,
      help="""Path to hf config.json of model to convert""",
  )
  parser.add_argument("""--pytorch_dump_folder_path""", default=None, type=str, help="""Path to the output PyTorch model.""")
  parser.add_argument(
      """--push_to_hub""",
      action="""store_true""",
      help="""Whether to push the model and processor to the hub after converting""",
  )

  _lowerCamelCase     :		Optional[int]								=       parser.parse_args()

  convert_blipa_checkpoint(args.model_name, args.pytorch_dump_folder_path, args.push_to_hub)








from typing import TYPE_CHECKING

from ...utils import (
    OptionalDependencyNotAvailable,
    _LazyModule,
    is_sentencepiece_available,
    is_speech_available,
    is_torch_available,
)


_lowerCamelCase     :		Optional[Any]								=       {
    """configuration_trocr""": ["""TROCR_PRETRAINED_CONFIG_ARCHIVE_MAP""", """TrOCRConfig"""],
    """processing_trocr""": ["""TrOCRProcessor"""],
}


try:
  if not is_torch_available():
    raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
  pass
else:
  _lowerCamelCase     :		Any								=       [
      """TROCR_PRETRAINED_MODEL_ARCHIVE_LIST""",
      """TrOCRForCausalLM""",
      """TrOCRPreTrainedModel""",
  ]


if TYPE_CHECKING:
  from .configuration_trocr import TROCR_PRETRAINED_CONFIG_ARCHIVE_MAP, TrOCRConfig
  from .processing_trocr import TrOCRProcessor

  try:
    if not is_torch_available():
      raise OptionalDependencyNotAvailable()
  except OptionalDependencyNotAvailable:
    pass
  else:
    from .modeling_trocr import TROCR_PRETRAINED_MODEL_ARCHIVE_LIST, TrOCRForCausalLM, TrOCRPreTrainedModel

else:
  import sys

  _lowerCamelCase     :		List[str]								=       _LazyModule(__name__, globals()["""__file__"""], _import_structure, module_spec=__spec__)


