
"""simple docstring"""


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 	lowerCamelCase__			(							)->							Any:







       """simple docstring"""
       UpperCamelCase					 =		"https://storage.googleapis.com/sfr-vision-language-research/LAVIS/assets/merlion.png"
       UpperCamelCase					 =		Image.open(requests.get(UpperCAmelCase_		,      stream=UpperCAmelCase_				).raw				).convert("RGB"				)

       return image



def 	lowerCamelCase__			(							UpperCAmelCase_				)->							List[Any]:







       """simple docstring"""
       UpperCamelCase					 =		[]
       # 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 	lowerCamelCase__			(							UpperCAmelCase_		,      UpperCAmelCase_		,      UpperCAmelCase_				)->							List[Any]:







       """simple docstring"""
       UpperCamelCase					 =		dct.pop(UpperCAmelCase_				)
       UpperCamelCase					 =		val



def 	lowerCamelCase__			(							UpperCAmelCase_		,      UpperCAmelCase_				)->							str:







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

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



def 	lowerCamelCase__			(							UpperCAmelCase_		,      UpperCAmelCase_				)->							List[Any]:







       """simple docstring"""
       UpperCamelCase					 =		3_64 if "coco" in model_name else 2_24
       UpperCamelCase					 =		BlipaVisionConfig(image_size=UpperCAmelCase_				).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:
              UpperCamelCase					 =		OPTConfig.from_pretrained("facebook/opt-2.7b"		,      eos_token_id=UpperCAmelCase_				).to_dict()
       elif "opt-6.7b" in model_name:
              UpperCamelCase					 =		OPTConfig.from_pretrained("facebook/opt-6.7b"		,      eos_token_id=UpperCAmelCase_				).to_dict()
       elif "t5-xl" in model_name:
              UpperCamelCase					 =		TaConfig.from_pretrained("google/flan-t5-xl"		,      dense_act_fn="gelu"		,      bos_token_id=1				).to_dict()
       elif "t5-xxl" in model_name:
              UpperCamelCase					 =		TaConfig.from_pretrained("google/flan-t5-xxl"		,      dense_act_fn="gelu"		,      bos_token_id=1				).to_dict()

       UpperCamelCase					 =		BlipaConfig(vision_config=UpperCAmelCase_		,      text_config=UpperCAmelCase_				)

       return config, image_size



@torch.no_grad()
def 	lowerCamelCase__			(							UpperCAmelCase_		,      UpperCAmelCase_=None		,      UpperCAmelCase_=False				)->							int:







       """simple docstring"""
       UpperCamelCase					 =		(
           AutoTokenizer.from_pretrained("facebook/opt-2.7b"				)
           if "opt" in model_name
           else AutoTokenizer.from_pretrained("google/flan-t5-xl"				)
       )
       UpperCamelCase					 =		tokenizer("\n"		,      add_special_tokens=UpperCAmelCase_				).input_ids[0]
       UpperCamelCase ,       UpperCamelCase					 =		get_blipa_config(UpperCAmelCase_		,      eos_token_id=UpperCAmelCase_				)

       UpperCamelCase					 =		BlipaForConditionalGeneration(UpperCAmelCase_				).eval()

       UpperCamelCase					 =		{
           "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"),
       }

       UpperCamelCase ,       UpperCamelCase					 =		model_name_to_original[model_name]

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

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

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

       # read in qv biases
       read_in_q_v_bias(UpperCAmelCase_		,      UpperCAmelCase_				)

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

       UpperCamelCase					 =		load_demo_image()
       UpperCamelCase					 =		vis_processors["eval"](UpperCAmelCase_				).unsqueeze(0				).to(UpperCAmelCase_				)
       UpperCamelCase					 =		tokenizer(["\n"]		,      return_tensors="pt"				).input_ids.to(UpperCAmelCase_				)

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

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

       original_model.to(UpperCAmelCase_				)
       hf_model.to(UpperCAmelCase_				)
       with torch.no_grad():
              if "opt" in model_name:
                     UpperCamelCase					 =		original_model({"image": original_pixel_values, "text_input": [""]}				).logits
                     UpperCamelCase					 =		hf_model(UpperCAmelCase_		,      UpperCAmelCase_				).logits
              else:
                     UpperCamelCase					 =		original_model(
                         {"image": original_pixel_values, "text_input": ["\n"], "text_output": ["\n"]}				).logits
                     UpperCamelCase					 =		input_ids.masked_fill(input_ids == tokenizer.pad_token_id		,      -1_00				)
                     UpperCamelCase					 =		hf_model(UpperCAmelCase_		,      UpperCAmelCase_		,      labels=UpperCAmelCase_				).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":
              UpperCamelCase					 =		torch.tensor(
                  [[-41.5850, -4.4440, -8.9922], [-47.4322, -5.9143, -1.7340]]		,      device=UpperCAmelCase_				)
              assert torch.allclose(logits[0, :3, :3]		,      UpperCAmelCase_		,      atol=1E-4				)
       elif model_name == "blip2-flan-t5-xl-coco":
              UpperCamelCase					 =		torch.tensor(
                  [[-57.0109, -9.8967, -12.6280], [-68.6578, -12.7191, -10.5065]]		,      device=UpperCAmelCase_				)
       else:
              # cast to same type
              UpperCamelCase					 =		logits.dtype
              assert torch.allclose(original_logits.to(UpperCAmelCase_				)		,      UpperCAmelCase_		,      atol=1E-2				)
       print("Looks ok!"				)

       print("Generating a caption..."				)
       UpperCamelCase					 =		""
       UpperCamelCase					 =		tokenizer(UpperCAmelCase_		,      return_tensors="pt"				).input_ids.to(UpperCAmelCase_				)

       UpperCamelCase					 =		original_model.generate({"image": original_pixel_values}				)
       UpperCamelCase					 =		hf_model.generate(
           UpperCAmelCase_		,      UpperCAmelCase_		,      do_sample=UpperCAmelCase_		,      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:"		,      UpperCAmelCase_				)
       UpperCamelCase					 =		input_ids.shape[1]
       UpperCamelCase					 =		processor.batch_decode(outputs[:, prompt_length:]		,      skip_special_tokens=UpperCAmelCase_				)
       UpperCamelCase					 =		[text.strip() for text in output_text]
       print("HF generation:"		,      UpperCAmelCase_				)

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

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


if __name__ == "__main__":
      SCREAMING_SNAKE_CASE      =     argparse.ArgumentParser()
      SCREAMING_SNAKE_CASE      =     [
          """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""",
      )

      SCREAMING_SNAKE_CASE      =     parser.parse_args()

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







"""simple docstring"""


def 	lowerCamelCase__			(							UpperCAmelCase_ = 4_00_00_00				)->							int:







       """simple docstring"""
       UpperCamelCase					 =		[0, 1]
       UpperCamelCase					 =		0
       while fib[i] <= n:
              fib.append(fib[i] + fib[i + 1]				)
              if fib[i + 2] > n:
                     break
              i += 1
       UpperCamelCase					 =		0
       for j in range(len(UpperCAmelCase_				) - 1				):
              if fib[j] % 2 == 0:
                     total += fib[j]

       return total


if __name__ == "__main__":
      print(F'''{solution() = }''')





