



'''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_   (	):
		__SCREAMING_SNAKE_CASE       :		List[str]           =		"""https://storage.googleapis.com/sfr-vision-language-research/LAVIS/assets/merlion.png"""
		__SCREAMING_SNAKE_CASE       :		Union[str, Any]           =		Image.open(requests.get(_lowerCamelCase       ,      stream=_lowerCamelCase					).raw					).convert("""RGB"""					)

		return image


def 				lowerCAmelCase_   (	_lowerCamelCase:   Dict					):
		__SCREAMING_SNAKE_CASE       :		Union[str, Any]           =		[]
		# 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_   (	_lowerCamelCase:   int       ,      _lowerCamelCase:   str       ,      _lowerCamelCase:   int					):
		__SCREAMING_SNAKE_CASE       :		Optional[Any]           =		dct.pop(_lowerCamelCase					)
		__SCREAMING_SNAKE_CASE       :		int           =		val


def 				lowerCAmelCase_   (	_lowerCamelCase:   Tuple       ,      _lowerCamelCase:   Union[str, Any]					):
		for i in range(config.vision_config.num_hidden_layers					):
				# read in original q and v biases
				__SCREAMING_SNAKE_CASE       :		Tuple           =		state_dict.pop(F"visual_encoder.blocks.{i}.attn.q_bias"					)
				__SCREAMING_SNAKE_CASE       :		Optional[Any]           =		state_dict.pop(F"visual_encoder.blocks.{i}.attn.v_bias"					)

				# next, set bias in the state dict
				__SCREAMING_SNAKE_CASE       :		str           =		torch.cat((q_bias, torch.zeros_like(_lowerCamelCase       ,      requires_grad=_lowerCamelCase					), v_bias)					)
				__SCREAMING_SNAKE_CASE       :		Optional[int]           =		qkv_bias


def 				lowerCAmelCase_   (	_lowerCamelCase:   Any       ,      _lowerCamelCase:   int					):
		__SCREAMING_SNAKE_CASE       :		Dict           =		3_64 if """coco""" in model_name else 2_24
		__SCREAMING_SNAKE_CASE       :		str           =		BlipaVisionConfig(image_size=_lowerCamelCase					).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       :		Tuple           =		OPTConfig.from_pretrained("""facebook/opt-2.7b"""       ,      eos_token_id=_lowerCamelCase					).to_dict()
		elif "opt-6.7b" in model_name:
				__SCREAMING_SNAKE_CASE       :		Optional[int]           =		OPTConfig.from_pretrained("""facebook/opt-6.7b"""       ,      eos_token_id=_lowerCamelCase					).to_dict()
		elif "t5-xl" in model_name:
				__SCREAMING_SNAKE_CASE       :		Tuple           =		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       :		List[str]           =		TaConfig.from_pretrained("""google/flan-t5-xxl"""       ,      dense_act_fn="""gelu"""       ,      bos_token_id=1					).to_dict()

		__SCREAMING_SNAKE_CASE       :		List[str]           =		BlipaConfig(vision_config=_lowerCamelCase       ,      text_config=_lowerCamelCase					)

		return config, image_size


@torch.no_grad()
def 				lowerCAmelCase_   (	_lowerCamelCase:   List[Any]       ,      _lowerCamelCase:   Tuple=None       ,      _lowerCamelCase:   Union[str, Any]=False					):
		__SCREAMING_SNAKE_CASE       :		List[str]           =		(
		    AutoTokenizer.from_pretrained("""facebook/opt-2.7b"""					)
		    if """opt""" in model_name
		    else AutoTokenizer.from_pretrained("""google/flan-t5-xl"""					)
		)
		__SCREAMING_SNAKE_CASE       :		List[Any]           =		tokenizer("""\n"""       ,      add_special_tokens=_lowerCamelCase					).input_ids[0]
		__SCREAMING_SNAKE_CASE       ,						__SCREAMING_SNAKE_CASE       :		Any           =		get_blipa_config(_lowerCamelCase       ,      eos_token_id=_lowerCamelCase					)

		__SCREAMING_SNAKE_CASE       :		Dict           =		BlipaForConditionalGeneration(_lowerCamelCase					).eval()

		__SCREAMING_SNAKE_CASE       :		Optional[Any]           =		{
		    """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       ,						__SCREAMING_SNAKE_CASE       :		Any           =		model_name_to_original[model_name]

		# load original model
		print("""Loading original model..."""					)
		__SCREAMING_SNAKE_CASE       :		List[Any]           =		"""cuda""" if torch.cuda.is_available() else """cpu"""
		__SCREAMING_SNAKE_CASE       ,						__SCREAMING_SNAKE_CASE       ,						__SCREAMING_SNAKE_CASE       :		Union[str, Any]           =		load_model_and_preprocess(
		    name=_lowerCamelCase       ,      model_type=_lowerCamelCase       ,      is_eval=_lowerCamelCase       ,      device=_lowerCamelCase					)
		original_model.eval()
		print("""Done!"""					)

		# update state dict keys
		__SCREAMING_SNAKE_CASE       :		Tuple           =		original_model.state_dict()
		__SCREAMING_SNAKE_CASE       :		Optional[int]           =		create_rename_keys(_lowerCamelCase					)
		for src, dest in rename_keys:
				rename_key(_lowerCamelCase       ,      _lowerCamelCase       ,      _lowerCamelCase					)

		# some keys can be renamed efficiently
		for key, val in state_dict.copy().items():
				__SCREAMING_SNAKE_CASE       :		List[str]           =		state_dict.pop(_lowerCamelCase					)
				if key.startswith("""Qformer.bert"""					):
						__SCREAMING_SNAKE_CASE       :		str           =		key.replace("""Qformer.bert"""       ,      """qformer"""					)
				if "attention.self" in key:
						__SCREAMING_SNAKE_CASE       :		List[Any]           =		key.replace("""self"""       ,      """attention"""					)
				if "opt_proj" in key:
						__SCREAMING_SNAKE_CASE       :		Tuple           =		key.replace("""opt_proj"""       ,      """language_projection"""					)
				if "t5_proj" in key:
						__SCREAMING_SNAKE_CASE       :		int           =		key.replace("""t5_proj"""       ,      """language_projection"""					)
				if key.startswith("""opt"""					):
						__SCREAMING_SNAKE_CASE       :		Dict           =		key.replace("""opt"""       ,      """language"""					)
				if key.startswith("""t5"""					):
						__SCREAMING_SNAKE_CASE       :		Optional[int]           =		key.replace("""t5"""       ,      """language"""					)
				__SCREAMING_SNAKE_CASE       :		Optional[Any]           =		val

		# read in qv biases
		read_in_q_v_bias(_lowerCamelCase       ,      _lowerCamelCase					)

		__SCREAMING_SNAKE_CASE       ,						__SCREAMING_SNAKE_CASE       :		Optional[Any]           =		hf_model.load_state_dict(_lowerCamelCase       ,      strict=_lowerCamelCase					)
		assert len(_lowerCamelCase					) == 0
		assert unexpected_keys == ["qformer.embeddings.position_ids"]

		__SCREAMING_SNAKE_CASE       :		List[str]           =		load_demo_image()
		__SCREAMING_SNAKE_CASE       :		List[str]           =		vis_processors["""eval"""](_lowerCamelCase					).unsqueeze(0					).to(_lowerCamelCase					)
		__SCREAMING_SNAKE_CASE       :		Dict           =		tokenizer(["""\n"""]       ,      return_tensors="""pt"""					).input_ids.to(_lowerCamelCase					)

		# create processor
		__SCREAMING_SNAKE_CASE       :		List[Any]           =		BlipImageProcessor(
		    size={"""height""": image_size, """width""": image_size}       ,      image_mean=_lowerCamelCase       ,      image_std=_lowerCamelCase					)
		__SCREAMING_SNAKE_CASE       :		Any           =		BlipaProcessor(image_processor=_lowerCamelCase       ,      tokenizer=_lowerCamelCase					)
		__SCREAMING_SNAKE_CASE       :		Any           =		processor(images=_lowerCamelCase       ,      return_tensors="""pt"""					).pixel_values.to(_lowerCamelCase					)

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

		original_model.to(_lowerCamelCase					)
		hf_model.to(_lowerCamelCase					)
		with torch.no_grad():
				if "opt" in model_name:
						__SCREAMING_SNAKE_CASE       :		Tuple           =		original_model({"""image""": original_pixel_values, """text_input""": [""""""]}					).logits
						__SCREAMING_SNAKE_CASE       :		Union[str, Any]           =		hf_model(_lowerCamelCase       ,      _lowerCamelCase					).logits
				else:
						__SCREAMING_SNAKE_CASE       :		str           =		original_model(
						    {"""image""": original_pixel_values, """text_input""": ["""\n"""], """text_output""": ["""\n"""]}					).logits
						__SCREAMING_SNAKE_CASE       :		Any           =		input_ids.masked_fill(input_ids == tokenizer.pad_token_id       ,      -1_00					)
						__SCREAMING_SNAKE_CASE       :		Dict           =		hf_model(_lowerCamelCase       ,      _lowerCamelCase       ,      labels=_lowerCamelCase					).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       :		Any           =		torch.tensor(
				    [[-41.58_50, -4.44_40, -8.99_22], [-47.43_22, -5.91_43, -1.73_40]]       ,      device=_lowerCamelCase					)
				assert torch.allclose(logits[0, :3, :3]       ,      _lowerCamelCase       ,      atol=1E-4					)
		elif model_name == "blip2-flan-t5-xl-coco":
				__SCREAMING_SNAKE_CASE       :		List[Any]           =		torch.tensor(
				    [[-57.01_09, -9.89_67, -12.62_80], [-68.65_78, -12.71_91, -10.50_65]]       ,      device=_lowerCamelCase					)
		else:
				# cast to same type
				__SCREAMING_SNAKE_CASE       :		int           =		logits.dtype
				assert torch.allclose(original_logits.to(_lowerCamelCase					)       ,      _lowerCamelCase       ,      atol=1E-2					)
		print("""Looks ok!"""					)

		print("""Generating a caption..."""					)
		__SCREAMING_SNAKE_CASE       :		Tuple           =		""""""
		__SCREAMING_SNAKE_CASE       :		Optional[int]           =		tokenizer(_lowerCamelCase       ,      return_tensors="""pt"""					).input_ids.to(_lowerCamelCase					)

		__SCREAMING_SNAKE_CASE       :		List[str]           =		original_model.generate({"""image""": original_pixel_values}					)
		__SCREAMING_SNAKE_CASE       :		Optional[int]           =		hf_model.generate(
		    _lowerCamelCase       ,      _lowerCamelCase       ,      do_sample=_lowerCamelCase       ,      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:"""       ,      _lowerCamelCase					)
		__SCREAMING_SNAKE_CASE       :		Union[str, Any]           =		input_ids.shape[1]
		__SCREAMING_SNAKE_CASE       :		str           =		processor.batch_decode(outputs[:, prompt_length:]       ,      skip_special_tokens=_lowerCamelCase					)
		__SCREAMING_SNAKE_CASE       :		Dict           =		[text.strip() for text in output_text]
		print("""HF generation:"""       ,      _lowerCamelCase					)

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

		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__       :	str    = argparse.ArgumentParser()
						UpperCamelCase__       :	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''',
						)

						UpperCamelCase__       :	Tuple    = parser.parse_args()

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




'''simple docstring'''




from .dependency_versions_table import deps
from .utils.versions import require_version, require_version_core


# define which module versions we always want to check at run time
# (usually the ones defined in `install_requires` in setup.py)
#
# order specific notes:
# - tqdm must be checked before tokenizers

UpperCamelCase__       :	Dict    = [
    '''python''',
    '''tqdm''',
    '''regex''',
    '''requests''',
    '''packaging''',
    '''filelock''',
    '''numpy''',
    '''tokenizers''',
    '''huggingface-hub''',
    '''safetensors''',
    '''accelerate''',
    '''pyyaml''',
]

for pkg in pkgs_to_check_at_runtime:
						if pkg in deps:
												if pkg == "tokenizers":
																		# must be loaded here, or else tqdm check may fail
																		from .utils import is_tokenizers_available

																		if not is_tokenizers_available():
																								continue  # not required, check version only if installed
												elif pkg == "accelerate":
																		# must be loaded here, or else tqdm check may fail
																		from .utils import is_accelerate_available

																		# Maybe switch to is_torch_available in the future here so that Accelerate is hard dep of
																		# Transformers with PyTorch
																		if not is_accelerate_available():
																								continue  # not required, check version only if installed

												require_version_core(deps[pkg])
						else:
												raise ValueError(f"can't find {pkg} in {deps.keys()}, check dependency_versions_table.py")


def 				lowerCAmelCase_   (	_lowerCamelCase:   List[Any]       ,      _lowerCamelCase:   Optional[int]=None					):
		require_version(deps[pkg]       ,      _lowerCamelCase					)