






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			(		)							->  Tuple:






						"""simple docstring"""





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

						return image

def        __lowerCamelCase			(		snake_case__		)							->  int:






						"""simple docstring"""





						_SCREAMING_SNAKE_CASE	      =  []
						# 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			(		snake_case__       ,snake_case__       ,snake_case__		)							->  str:






						"""simple docstring"""





						_SCREAMING_SNAKE_CASE	      =  dct.pop(A__		)
						_SCREAMING_SNAKE_CASE	      =  val

def        __lowerCamelCase			(		snake_case__       ,snake_case__		)							->  Dict:






						"""simple docstring"""





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

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

def        __lowerCamelCase			(		snake_case__       ,snake_case__		)							->  int:






						"""simple docstring"""





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

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

						return config, image_size

@torch.no_grad()
def        __lowerCamelCase			(		snake_case__       ,snake_case__=None       ,snake_case__=False		)							->  int:






						"""simple docstring"""





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

						_SCREAMING_SNAKE_CASE	      =  BlipaForConditionalGeneration(A__		).eval()

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

						_SCREAMING_SNAKE_CASE	      =  model_name_to_original[model_name]

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

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

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

						# read in qv biases
						read_in_q_v_bias(A__       ,A__		)

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

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

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

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

						original_model.to(A__		)
						hf_model.to(A__		)
						with torch.no_grad():
												if "opt" in model_name:
																		_SCREAMING_SNAKE_CASE	      =  original_model({"""image""": original_pixel_values, """text_input""": [""""""]}		).logits
																		_SCREAMING_SNAKE_CASE	      =  hf_model(A__       ,A__		).logits
												else:
																		_SCREAMING_SNAKE_CASE	      =  original_model(
																		    {"""image""": original_pixel_values, """text_input""": ["""\n"""], """text_output""": ["""\n"""]}		).logits
																		_SCREAMING_SNAKE_CASE	      =  input_ids.masked_fill(input_ids == tokenizer.pad_token_id       ,-1_00		)
																		_SCREAMING_SNAKE_CASE	      =  hf_model(A__       ,A__       ,labels=A__		).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":
												_SCREAMING_SNAKE_CASE	      =  torch.tensor(
												    [[-41.5_850, -4.4_440, -8.9_922], [-47.4_322, -5.9_143, -1.7_340]]       ,device=A__		)
												assert torch.allclose(logits[0, :3, :3]       ,A__       ,atol=1e-4		)
						elif model_name == "blip2-flan-t5-xl-coco":
												_SCREAMING_SNAKE_CASE	      =  torch.tensor(
												    [[-57.0_109, -9.8_967, -12.6_280], [-68.6_578, -12.7_191, -10.5_065]]       ,device=A__		)
						else:
												# cast to same type
												_SCREAMING_SNAKE_CASE	      =  logits.dtype
												assert torch.allclose(original_logits.to(A__		)       ,A__       ,atol=1e-2		)
						print("""Looks ok!"""		)

						print("""Generating a caption..."""		)
						_SCREAMING_SNAKE_CASE	      =  ""
						_SCREAMING_SNAKE_CASE	      =  tokenizer(A__       ,return_tensors="""pt"""		).input_ids.to(A__		)

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

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

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


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

		UpperCamelCase 				=	parser.parse_args()

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









"""simple docstring"""
import torch
from torch import nn
from transformers import CLIPPreTrainedModel, CLIPVisionModel

from ...models.attention import BasicTransformerBlock
from ...utils import logging


lowerCamelCase_					=      logging.get_logger(__name__)  # pylint: disable=invalid-name







class 			UpperCamelCase_       (__A     ):





	def __init__(      self					: Optional[int]	,	lowerCAmelCase_					: List[Any]	,	lowerCAmelCase_					: Dict=768						)						->			List[Any]:
				super().__init__(lowerCAmelCase_						)
				UpperCAmelCase_     : Dict			     =					proj_size

				UpperCAmelCase_     : Optional[Any]			     =					CLIPVisionModel(lowerCAmelCase_						)
				UpperCAmelCase_     : Tuple			     =					PaintByExampleMapper(lowerCAmelCase_						)
				UpperCAmelCase_     : str			     =					nn.LayerNorm(config.hidden_size						)
				UpperCAmelCase_     : List[Any]			     =					nn.Linear(config.hidden_size	,	self.proj_size						)

				# uncondition for scaling
				UpperCAmelCase_     : Optional[int]			     =					nn.Parameter(torch.randn((1, 1, self.proj_size)						)						)





	def      _SCREAMING_SNAKE_CASE      (      self					: int	,	lowerCAmelCase_					: int	,	lowerCAmelCase_					: Dict=False						)						->			Union[str, Any]:
				UpperCAmelCase_     : Optional[int]			     =					self.model(pixel_values=lowerCAmelCase_						)
				UpperCAmelCase_     : Optional[Any]			     =					clip_output.pooler_output
				UpperCAmelCase_     : List[Any]			     =					self.mapper(latent_states[:, None]						)
				UpperCAmelCase_     : List[str]			     =					self.final_layer_norm(lowerCAmelCase_						)
				UpperCAmelCase_     : Union[str, Any]			     =					self.proj_out(lowerCAmelCase_						)
				if return_uncond_vector:
							return latent_states, self.uncond_vector

				return latent_states







class 			UpperCamelCase_       (nn.Module     ):





	def __init__(      self					: Dict	,	lowerCAmelCase_					: Union[str, Any]						)						->			Tuple:
				super().__init__()
				UpperCAmelCase_     : List[Any]			     =					(config.num_hidden_layers + 1) // 5
				UpperCAmelCase_     : Optional[Any]			     =					config.hidden_size
				UpperCAmelCase_     : List[str]			     =					1
				UpperCAmelCase_     : Union[str, Any]			     =					nn.ModuleList(
				    [
				        BasicTransformerBlock(lowerCAmelCase_	,	lowerCAmelCase_	,	lowerCAmelCase_	,	activation_fn="gelu"	,	attention_bias=lowerCAmelCase_						)
				        for _ in range(lowerCAmelCase_						)
				    ]						)





	def      _SCREAMING_SNAKE_CASE      (      self					: List[str]	,	lowerCAmelCase_					: List[str]						)						->			str:
				for block in self.blocks:
							UpperCAmelCase_     : int			     =					block(lowerCAmelCase_						)

				return hidden_states



