






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 		_a       ( )				->     Optional[Any]:
 a						    = '''https://storage.googleapis.com/sfr-vision-language-research/LAVIS/assets/merlion.png'''
 a						    = Image.open(requests.get(a      ,				stream=a					).raw					).convert('''RGB'''					)

 return image
def 		_a       ( a					:Dict					)				->     Any:
 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 		_a       ( a					:Optional[int]      ,				a					:List[str]      ,				a					:str					)				->     Tuple:
 a						    = dct.pop(a					)
 a						    = val
def 		_a       ( a					:Tuple      ,				a					:List[str]					)				->     List[str]:







 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(a      ,				requires_grad=a					), v_bias)					)
  a						    = qkv_bias
def 		_a       ( a					:str      ,				a					:List[str]					)				->     Dict:
 a						    = 364 if '''coco''' in model_name else 224
 a						    = 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:
  a						    = OPTConfig.from_pretrained('''facebook/opt-2.7b'''      ,				eos_token_id=a					).to_dict()
 elif "opt-6.7b" in model_name:
  a						    = OPTConfig.from_pretrained('''facebook/opt-6.7b'''      ,				eos_token_id=a					).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=a      ,				text_config=a					)

 return config, image_size
@torch.no_grad()
def 		_a       ( a					:Tuple      ,				a					:Any=None      ,				a					:Any=False					)				->     Dict:
 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=a					).input_ids[0]
 a    ,	a						    = get_blipa_config(a      ,				eos_token_id=a					)

 a						    = BlipaForConditionalGeneration(a					).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=a      ,				model_type=a      ,				is_eval=a      ,				device=a					)
 original_model.eval()
 print('''Done!'''					)

 # update state dict keys
 a						    = original_model.state_dict()
 a						    = 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():
  a						    = state_dict.pop(a					)
  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(a      ,				a					)

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

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

 # create processor
 a						    = BlipImageProcessor(
     size={'''height''': image_size, '''width''': image_size}      ,				image_mean=a      ,				image_std=a					)
 a						    = BlipaProcessor(image_processor=a      ,				tokenizer=a					)
 a						    = 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:
   a						    = original_model({'''image''': original_pixel_values, '''text_input''': ['''''']}					).logits
   a						    = hf_model(a      ,				a					).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(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":
  a						    = 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":
  a						    = 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
  a						    = logits.dtype
  assert torch.allclose(original_logits.to(a					)      ,				a      ,				atol=1e-2					)
 print('''Looks ok!'''					)

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

 a						    = original_model.generate({'''image''': original_pixel_values}					)
 a						    = 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					)
 a						    = input_ids.shape[1]
 a						    = processor.batch_decode(outputs[:, prompt_length:]      ,				skip_special_tokens=a					)
 a						    = [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)








import unittest

from diffusers import FlaxAutoencoderKL
from diffusers.utils import is_flax_available
from diffusers.utils.testing_utils import require_flax

from .test_modeling_common_flax import FlaxModelTesterMixin


if is_flax_available():
				import jax



@require_flax
class       a_       (     SCREAMING_SNAKE_CASE__  ,    unittest.TestCase     ):
	A    							= FlaxAutoencoderKL





	@property
	def 						A_(							self      )  ->					Optional[Any]:




				"""simple docstring"""



				SCREAMING_SNAKE_CASE_								=						4
				SCREAMING_SNAKE_CASE_								=						3
				SCREAMING_SNAKE_CASE_								=						(32, 32)

				SCREAMING_SNAKE_CASE_								=						jax.random.PRNGKey(0      )
				SCREAMING_SNAKE_CASE_								=						jax.random.uniform(SCREAMING_SNAKE_CASE      ,     ((batch_size, num_channels) + sizes)      )

				return {"sample": image, "prng_key": prng_key}





	def 						A_(							self      )  ->					Tuple:




				"""simple docstring"""



				SCREAMING_SNAKE_CASE_								=						{
				    'block_out_channels': [32, 64],
				    'in_channels': 3,
				    'out_channels': 3,
				    'down_block_types': ['DownEncoderBlock2D', 'DownEncoderBlock2D'],
				    'up_block_types': ['UpDecoderBlock2D', 'UpDecoderBlock2D'],
				    'latent_channels': 4,
				}
				SCREAMING_SNAKE_CASE_								=						self.dummy_input
				return init_dict, inputs_dict
