






import argparse

import requests
import torch
from PIL import Image

from transformers import ViTMAEConfig, ViTMAEForPreTraining, ViTMAEImageProcessor

def      lowerCAmelCase__	(    _a       :			List[Any]    ):
		if "cls_token" in name:
				snake_case_				:							Tuple						 =       name.replace("cls_token"  ,      "vit.embeddings.cls_token"    )
		if "mask_token" in name:
				snake_case_				:							str						 =       name.replace("mask_token"  ,      "decoder.mask_token"    )
		if "decoder_pos_embed" in name:
				snake_case_				:							Optional[Any]						 =       name.replace("decoder_pos_embed"  ,      "decoder.decoder_pos_embed"    )
		if "pos_embed" in name and "decoder" not in name:
				snake_case_				:							Dict						 =       name.replace("pos_embed"  ,      "vit.embeddings.position_embeddings"    )
		if "patch_embed.proj" in name:
				snake_case_				:							Dict						 =       name.replace("patch_embed.proj"  ,      "vit.embeddings.patch_embeddings.projection"    )
		if "patch_embed.norm" in name:
				snake_case_				:							Tuple						 =       name.replace("patch_embed.norm"  ,      "vit.embeddings.norm"    )
		if "decoder_blocks" in name:
				snake_case_				:							List[Any]						 =       name.replace("decoder_blocks"  ,      "decoder.decoder_layers"    )
		if "blocks" in name:
				snake_case_				:							Any						 =       name.replace("blocks"  ,      "vit.encoder.layer"    )
		if "attn.proj" in name:
				snake_case_				:							Tuple						 =       name.replace("attn.proj"  ,      "attention.output.dense"    )
		if "attn" in name:
				snake_case_				:							List[Any]						 =       name.replace("attn"  ,      "attention.self"    )
		if "norm1" in name:
				snake_case_				:							List[str]						 =       name.replace("norm1"  ,      "layernorm_before"    )
		if "norm2" in name:
				snake_case_				:							str						 =       name.replace("norm2"  ,      "layernorm_after"    )
		if "mlp.fc1" in name:
				snake_case_				:							Any						 =       name.replace("mlp.fc1"  ,      "intermediate.dense"    )
		if "mlp.fc2" in name:
				snake_case_				:							Union[str, Any]						 =       name.replace("mlp.fc2"  ,      "output.dense"    )
		if "decoder_embed" in name:
				snake_case_				:							Optional[Any]						 =       name.replace("decoder_embed"  ,      "decoder.decoder_embed"    )
		if "decoder_norm" in name:
				snake_case_				:							Dict						 =       name.replace("decoder_norm"  ,      "decoder.decoder_norm"    )
		if "decoder_pred" in name:
				snake_case_				:							List[str]						 =       name.replace("decoder_pred"  ,      "decoder.decoder_pred"    )
		if "norm.weight" in name and "decoder" not in name:
				snake_case_				:							List[str]						 =       name.replace("norm.weight"  ,      "vit.layernorm.weight"    )
		if "norm.bias" in name and "decoder" not in name:
				snake_case_				:							str						 =       name.replace("norm.bias"  ,      "vit.layernorm.bias"    )

		return name

def      lowerCAmelCase__	(    _a       :			Dict  ,      _a       :			List[Any]    ):
		for key in orig_state_dict.copy().keys():
				snake_case_				:							int						 =       orig_state_dict.pop(_a    )

				if "qkv" in key:
						snake_case_				:							Dict						 =       key.split("."    )
						snake_case_				:							Any						 =       int(key_split[1]    )
						if "decoder_blocks" in key:
								snake_case_				:							Any						 =       config.decoder_hidden_size
								snake_case_				:							Optional[Any]						 =       "decoder.decoder_layers."
								if "weight" in key:
										snake_case_				:							Dict						 =       val[:dim, :]
										snake_case_				:							Optional[int]						 =       val[dim : dim * 2, :]
										snake_case_				:							int						 =       val[-dim:, :]
								elif "bias" in key:
										snake_case_				:							Any						 =       val[:dim]
										snake_case_				:							Any						 =       val[dim : dim * 2]
										snake_case_				:							Union[str, Any]						 =       val[-dim:]
						else:
								snake_case_				:							Optional[int]						 =       config.hidden_size
								snake_case_				:							Optional[int]						 =       "vit.encoder.layer."
								if "weight" in key:
										snake_case_				:							Dict						 =       val[:dim, :]
										snake_case_				:							Any						 =       val[dim : dim * 2, :]
										snake_case_				:							List[Any]						 =       val[-dim:, :]
								elif "bias" in key:
										snake_case_				:							List[Any]						 =       val[:dim]
										snake_case_				:							Any						 =       val[dim : dim * 2]
										snake_case_				:							Optional[int]						 =       val[-dim:]

				else:
						snake_case_				:							Optional[int]						 =       val

		return orig_state_dict

def      lowerCAmelCase__	(    _a       :			str  ,      _a       :			int    ):
		snake_case_				:							Any						 =       ViTMAEConfig()
		if "large" in checkpoint_url:
				snake_case_				:							Dict						 =       10_24
				snake_case_				:							List[str]						 =       40_96
				snake_case_				:							Dict						 =       24
				snake_case_				:							Any						 =       16
		elif "huge" in checkpoint_url:
				snake_case_				:							Any						 =       14
				snake_case_				:							Union[str, Any]						 =       12_80
				snake_case_				:							List[str]						 =       51_20
				snake_case_				:							List[str]						 =       32
				snake_case_				:							int						 =       16

		snake_case_				:							Optional[int]						 =       ViTMAEForPreTraining(_a    )

		snake_case_				:							Optional[int]						 =       torch.hub.load_state_dict_from_url(_a  ,      map_location="cpu"    )["model"]

		snake_case_				:							Any						 =       ViTMAEImageProcessor(size=config.image_size    )

		snake_case_				:							Union[str, Any]						 =       convert_state_dict(_a  ,      _a    )

		model.load_state_dict(_a    )
		model.eval()

		snake_case_				:							str						 =       "https://user-images.githubusercontent.com/11435359/147738734-196fd92f-9260-48d5-ba7e-bf103d29364d.jpg"

		snake_case_				:							List[str]						 =       Image.open(requests.get(_a  ,      stream=_a    ).raw    )
		snake_case_				:							List[str]						 =       ViTMAEImageProcessor(size=config.image_size    )
		snake_case_				:							int						 =       image_processor(images=_a  ,      return_tensors="pt"    )

		# forward pass
		torch.manual_seed(2    )
		snake_case_				:							Optional[int]						 =       model(**_a    )
		snake_case_				:							Optional[Any]						 =       outputs.logits

		if "large" in checkpoint_url:
				snake_case_				:							Optional[Any]						 =       torch.tensor(
				    [[-0.7_309, -0.7_128, -1.0_169], [-1.0_161, -0.9_058, -1.1_878], [-1.0_478, -0.9_411, -1.1_911]]    )
		elif "huge" in checkpoint_url:
				snake_case_				:							Optional[Any]						 =       torch.tensor(
				    [[-1.1_599, -0.9_199, -1.2_221], [-1.1_952, -0.9_269, -1.2_307], [-1.2_143, -0.9_337, -1.2_262]]    )
		else:
				snake_case_				:							Any						 =       torch.tensor(
				    [[-0.9_192, -0.8_481, -1.1_259], [-1.1_349, -1.0_034, -1.2_599], [-1.1_757, -1.0_429, -1.2_726]]    )

		# verify logits
		assert torch.allclose(logits[0, :3, :3]  ,      _a  ,      atol=1E-4    )

		print(F'''Saving model to {pytorch_dump_folder_path}'''    )
		model.save_pretrained(_a    )

		print(F'''Saving image processor to {pytorch_dump_folder_path}'''    )
		image_processor.save_pretrained(_a    )


if __name__ == "__main__":
							lowercase  :							Dict			  =    argparse.ArgumentParser()
							# Required parameters
							parser.add_argument(
							    '''--checkpoint_url''',
							    default='''https://dl.fbaipublicfiles.com/mae/visualize/mae_visualize_vit_base.pth''',
							    type=str,
							    help='''URL of the checkpoint you\'d like to convert.''',
							)
							parser.add_argument(
							    '''--pytorch_dump_folder_path''', default=None, type=str, help='''Path to the output PyTorch model directory.'''
							)

							lowercase  :							Dict			  =    parser.parse_args()
							convert_vit_mae_checkpoint(args.checkpoint_url, args.pytorch_dump_folder_path)








import importlib
import json
import os
import sys
import tempfile
import unittest
from pathlib import Path

import transformers
import transformers.models.auto
from transformers.models.auto.configuration_auto import CONFIG_MAPPING, AutoConfig
from transformers.models.bert.configuration_bert import BertConfig
from transformers.models.roberta.configuration_roberta import RobertaConfig
from transformers.testing_utils import DUMMY_UNKNOWN_IDENTIFIER, get_tests_dir


sys.path.append(str(Path(__file__).parent.parent.parent.parent / '''utils'''))

from test_module.custom_configuration import CustomConfig  # noqa E402


lowercase  :							Optional[Any]			  =    get_tests_dir('''fixtures/dummy-config.json''')




class 		UpperCAmelCase_						(	unittest.TestCase					):


						'''simple docstring'''




						def       _lowerCAmelCase       (	self				) ->				int:
								snake_case_				:							str						 =       0






						def       _lowerCAmelCase       (	self				) ->				str:
								self.assertIsNotNone(transformers.models.auto.__spec__				)
								self.assertIsNotNone(importlib.util.find_spec("transformers.models.auto"				)				)






						def       _lowerCAmelCase       (	self				) ->				int:
								snake_case_				:							List[Any]						 =       AutoConfig.from_pretrained("bert-base-uncased"				)
								self.assertIsInstance(_SCREAMING_SNAKE_CASE		,				_SCREAMING_SNAKE_CASE				)






						def       _lowerCAmelCase       (	self				) ->				Optional[int]:
								snake_case_				:							List[str]						 =       AutoConfig.from_pretrained(_SCREAMING_SNAKE_CASE				)
								self.assertIsInstance(_SCREAMING_SNAKE_CASE		,				_SCREAMING_SNAKE_CASE				)






						def       _lowerCAmelCase       (	self				) ->				str:
								snake_case_				:							str						 =       AutoConfig.from_pretrained(_SCREAMING_SNAKE_CASE				)
								self.assertIsInstance(_SCREAMING_SNAKE_CASE		,				_SCREAMING_SNAKE_CASE				)






						def       _lowerCAmelCase       (	self				) ->				Dict:
								snake_case_				:							Tuple						 =       AutoConfig.for_model("roberta"				)
								self.assertIsInstance(_SCREAMING_SNAKE_CASE		,				_SCREAMING_SNAKE_CASE				)






						def       _lowerCAmelCase       (	self				) ->				Tuple:
								with tempfile.TemporaryDirectory() as tmp_dir:
										# This model name contains bert and roberta, but roberta ends up being picked.
										snake_case_				:							str						 =       os.path.join(_SCREAMING_SNAKE_CASE		,				"fake-roberta"				)
										os.makedirs(_SCREAMING_SNAKE_CASE		,				exist_ok=_SCREAMING_SNAKE_CASE				)
										with open(os.path.join(_SCREAMING_SNAKE_CASE		,				"config.json"				)		,				"w"				) as f:
												f.write(json.dumps({}				)				)
										snake_case_				:							int						 =       AutoConfig.from_pretrained(_SCREAMING_SNAKE_CASE				)
										self.assertEqual(type(_SCREAMING_SNAKE_CASE				)		,				_SCREAMING_SNAKE_CASE				)






						def       _lowerCAmelCase       (	self				) ->				Dict:
								try:
										AutoConfig.register("custom"		,				_SCREAMING_SNAKE_CASE				)
										# Wrong model type will raise an error
										with self.assertRaises(_SCREAMING_SNAKE_CASE				):
												AutoConfig.register("model"		,				_SCREAMING_SNAKE_CASE				)
										# Trying to register something existing in the Transformers library will raise an error
										with self.assertRaises(_SCREAMING_SNAKE_CASE				):
												AutoConfig.register("bert"		,				_SCREAMING_SNAKE_CASE				)

										# Now that the config is registered, it can be used as any other config with the auto-API
										snake_case_				:							Union[str, Any]						 =       CustomConfig()
										with tempfile.TemporaryDirectory() as tmp_dir:
												config.save_pretrained(_SCREAMING_SNAKE_CASE				)
												snake_case_				:							int						 =       AutoConfig.from_pretrained(_SCREAMING_SNAKE_CASE				)
												self.assertIsInstance(_SCREAMING_SNAKE_CASE		,				_SCREAMING_SNAKE_CASE				)

								finally:
										if "custom" in CONFIG_MAPPING._extra_content:
												del CONFIG_MAPPING._extra_content["custom"]






						def       _lowerCAmelCase       (	self				) ->				int:
								with self.assertRaisesRegex(
								    _SCREAMING_SNAKE_CASE		,				"bert-base is not a local folder and is not a valid model identifier"				):
										snake_case_				:							Optional[Any]						 =       AutoConfig.from_pretrained("bert-base"				)






						def       _lowerCAmelCase       (	self				) ->				Tuple:
								with self.assertRaisesRegex(
								    _SCREAMING_SNAKE_CASE		,				r"aaaaaa is not a valid git identifier \(branch name, tag name or commit id\)"				):
										snake_case_				:							List[Any]						 =       AutoConfig.from_pretrained(_SCREAMING_SNAKE_CASE		,				revision="aaaaaa"				)






						def       _lowerCAmelCase       (	self				) ->				str:
								with self.assertRaisesRegex(
								    _SCREAMING_SNAKE_CASE		,				"hf-internal-testing/no-config-test-repo does not appear to have a file named config.json."		,				):
										snake_case_				:							Dict						 =       AutoConfig.from_pretrained("hf-internal-testing/no-config-test-repo"				)






						def       _lowerCAmelCase       (	self				) ->				Optional[int]:
								# If remote code is not set, we will time out when asking whether to load the model.
								with self.assertRaises(_SCREAMING_SNAKE_CASE				):
										snake_case_				:							Tuple						 =       AutoConfig.from_pretrained("hf-internal-testing/test_dynamic_model"				)
								# If remote code is disabled, we can't load this config.
								with self.assertRaises(_SCREAMING_SNAKE_CASE				):
										snake_case_				:							Optional[Any]						 =       AutoConfig.from_pretrained("hf-internal-testing/test_dynamic_model"		,				trust_remote_code=_SCREAMING_SNAKE_CASE				)

								snake_case_				:							List[Any]						 =       AutoConfig.from_pretrained("hf-internal-testing/test_dynamic_model"		,				trust_remote_code=_SCREAMING_SNAKE_CASE				)
								self.assertEqual(config.__class__.__name__		,				"NewModelConfig"				)

								# Test config can be reloaded.
								with tempfile.TemporaryDirectory() as tmp_dir:
										config.save_pretrained(_SCREAMING_SNAKE_CASE				)
										snake_case_				:							Optional[Any]						 =       AutoConfig.from_pretrained(_SCREAMING_SNAKE_CASE		,				trust_remote_code=_SCREAMING_SNAKE_CASE				)
								self.assertEqual(reloaded_config.__class__.__name__		,				"NewModelConfig"				)






						def       _lowerCAmelCase       (	self				) ->				Optional[Any]:




								class 		UpperCAmelCase_						(	SCREAMING_SNAKE_CASE__					):


														'''simple docstring'''




														A     :   List[Any]						=					'new-model'

								try:
										AutoConfig.register("new-model"		,				_SCREAMING_SNAKE_CASE				)
										# If remote code is not set, the default is to use local
										snake_case_				:							Union[str, Any]						 =       AutoConfig.from_pretrained("hf-internal-testing/test_dynamic_model"				)
										self.assertEqual(config.__class__.__name__		,				"NewModelConfigLocal"				)

										# If remote code is disabled, we load the local one.
										snake_case_				:							Optional[Any]						 =       AutoConfig.from_pretrained("hf-internal-testing/test_dynamic_model"		,				trust_remote_code=_SCREAMING_SNAKE_CASE				)
										self.assertEqual(config.__class__.__name__		,				"NewModelConfigLocal"				)

										# If remote is enabled, we load from the Hub
										snake_case_				:							List[str]						 =       AutoConfig.from_pretrained("hf-internal-testing/test_dynamic_model"		,				trust_remote_code=_SCREAMING_SNAKE_CASE				)
										self.assertEqual(config.__class__.__name__		,				"NewModelConfig"				)

								finally:
										if "new-model" in CONFIG_MAPPING._extra_content:
												del CONFIG_MAPPING._extra_content["new-model"]
