


'''simple docstring'''





import argparse
import json
from pathlib import Path

import requests
import torch
from huggingface_hub import hf_hub_download
from PIL import Image

from transformers import ConvNextConfig, ConvNextForImageClassification, ConvNextImageProcessor
from transformers.utils import logging


logging.set_verbosity_info()
lowerCAmelCase					 =	logging.get_logger(__name__)







def  _lowerCamelCase(			lowercase__			)		->			str:

		'''simple docstring'''







		__lowercase=    ConvNextConfig()

		if "tiny" in checkpoint_url:
				__lowercase=    [3, 3, 9, 3]
				__lowercase=    [9_6, 1_9_2, 3_8_4, 7_6_8]
		if "small" in checkpoint_url:
				__lowercase=    [3, 3, 2_7, 3]
				__lowercase=    [9_6, 1_9_2, 3_8_4, 7_6_8]
		if "base" in checkpoint_url:
				__lowercase=    [3, 3, 2_7, 3]
				__lowercase=    [1_2_8, 2_5_6, 5_1_2, 1_0_2_4]
		if "large" in checkpoint_url:
				__lowercase=    [3, 3, 2_7, 3]
				__lowercase=    [1_9_2, 3_8_4, 7_6_8, 1_5_3_6]
		if "xlarge" in checkpoint_url:
				__lowercase=    [3, 3, 2_7, 3]
				__lowercase=    [2_5_6, 5_1_2, 1_0_2_4, 2_0_4_8]

		if "1k" in checkpoint_url:
				__lowercase=    1_0_0_0
				__lowercase=    'imagenet-1k-id2label.json'
				__lowercase=    (1, 1_0_0_0)
		else:
				__lowercase=    2_1_8_4_1
				__lowercase=    'imagenet-22k-id2label.json'
				__lowercase=    (1, 2_1_8_4_1)

		__lowercase=    'huggingface/label-files'
		__lowercase=    num_labels
		__lowercase=    json.load(open(hf_hub_download(lowerCAmelCase__     ,				lowerCAmelCase__     ,				repo_type='dataset'			)     ,				'r'			)			)
		__lowercase=    {int(lowerCAmelCase__			): v for k, v in idalabel.items()}
		if "1k" not in checkpoint_url:
				# this dataset contains 21843 labels but the model only has 21841
				# we delete the classes as mentioned in https://github.com/google-research/big_transfer/issues/18
				del idalabel[9_2_0_5]
				del idalabel[1_5_0_2_7]
		__lowercase=    idalabel
		__lowercase=    {v: k for k, v in idalabel.items()}
		__lowercase=    hidden_sizes
		__lowercase=    depths

		return config, expected_shape







def  _lowerCamelCase(			lowercase__			)		->			str:

		'''simple docstring'''







		if "downsample_layers.0.0" in name:
				__lowercase=    name.replace('downsample_layers.0.0'     ,				'embeddings.patch_embeddings'			)
		if "downsample_layers.0.1" in name:
				__lowercase=    name.replace('downsample_layers.0.1'     ,				'embeddings.norm'			)  # we rename to layernorm later on
		if "downsample_layers.1.0" in name:
				__lowercase=    name.replace('downsample_layers.1.0'     ,				'stages.1.downsampling_layer.0'			)
		if "downsample_layers.1.1" in name:
				__lowercase=    name.replace('downsample_layers.1.1'     ,				'stages.1.downsampling_layer.1'			)
		if "downsample_layers.2.0" in name:
				__lowercase=    name.replace('downsample_layers.2.0'     ,				'stages.2.downsampling_layer.0'			)
		if "downsample_layers.2.1" in name:
				__lowercase=    name.replace('downsample_layers.2.1'     ,				'stages.2.downsampling_layer.1'			)
		if "downsample_layers.3.0" in name:
				__lowercase=    name.replace('downsample_layers.3.0'     ,				'stages.3.downsampling_layer.0'			)
		if "downsample_layers.3.1" in name:
				__lowercase=    name.replace('downsample_layers.3.1'     ,				'stages.3.downsampling_layer.1'			)
		if "stages" in name and "downsampling_layer" not in name:
				# stages.0.0. for instance should be renamed to stages.0.layers.0.
				__lowercase=    name[: len('stages.0'			)] + '.layers' + name[len('stages.0'			) :]
		if "stages" in name:
				__lowercase=    name.replace('stages'     ,				'encoder.stages'			)
		if "norm" in name:
				__lowercase=    name.replace('norm'     ,				'layernorm'			)
		if "gamma" in name:
				__lowercase=    name.replace('gamma'     ,				'layer_scale_parameter'			)
		if "head" in name:
				__lowercase=    name.replace('head'     ,				'classifier'			)

		return name







def  _lowerCamelCase(			)		->			Any:

		'''simple docstring'''







		__lowercase=    'http://images.cocodataset.org/val2017/000000039769.jpg'
		__lowercase=    Image.open(requests.get(lowerCAmelCase__     ,				stream=lowerCAmelCase__			).raw			)
		return im







@torch.no_grad()
def  _lowerCamelCase(			lowercase__     ,				lowercase__			)		->			Union[str, Any]:

		'''simple docstring'''







		__lowercase=    get_convnext_config(lowerCAmelCase__			)
		# load original state_dict from URL
		__lowercase=    torch.hub.load_state_dict_from_url(lowerCAmelCase__			)['model']
		# rename keys
		for key in state_dict.copy().keys():
				__lowercase=    state_dict.pop(lowerCAmelCase__			)
				__lowercase=    val
		# add prefix to all keys expect classifier head
		for key in state_dict.copy().keys():
				__lowercase=    state_dict.pop(lowerCAmelCase__			)
				if not key.startswith('classifier'			):
						__lowercase=    'convnext.' + key
				__lowercase=    val

		# load HuggingFace model
		__lowercase=    ConvNextForImageClassification(lowerCAmelCase__			)
		model.load_state_dict(lowerCAmelCase__			)
		model.eval()

		# Check outputs on an image, prepared by ConvNextImageProcessor
		__lowercase=    2_2_4 if '224' in checkpoint_url else 3_8_4
		__lowercase=    ConvNextImageProcessor(size=lowerCAmelCase__			)
		__lowercase=    image_processor(images=prepare_img()     ,				return_tensors='pt'			).pixel_values

		__lowercase=    model(lowerCAmelCase__			).logits

		# note: the logits below were obtained without center cropping
		if checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_tiny_1k_224_ema.pth":
				__lowercase=    torch.tensor([-0.1210, -0.6605, 0.1918]			)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_small_1k_224_ema.pth":
				__lowercase=    torch.tensor([-0.4473, -0.1847, -0.6365]			)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_1k_224_ema.pth":
				__lowercase=    torch.tensor([0.4525, 0.7539, 0.0308]			)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_1k_384.pth":
				__lowercase=    torch.tensor([0.3561, 0.6350, -0.0384]			)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_1k_224_ema.pth":
				__lowercase=    torch.tensor([0.4174, -0.0989, 0.1489]			)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_1k_384.pth":
				__lowercase=    torch.tensor([0.2513, -0.1349, -0.1613]			)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_22k_224.pth":
				__lowercase=    torch.tensor([1.2980, 0.3631, -0.1198]			)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_22k_224.pth":
				__lowercase=    torch.tensor([1.2963, 0.1227, 0.1723]			)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_xlarge_22k_224.pth":
				__lowercase=    torch.tensor([1.7956, 0.8390, 0.2820]			)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_22k_1k_224.pth":
				__lowercase=    torch.tensor([-0.2822, -0.0502, -0.0878]			)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_22k_1k_384.pth":
				__lowercase=    torch.tensor([-0.5672, -0.0730, -0.4348]			)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_22k_1k_224.pth":
				__lowercase=    torch.tensor([0.2681, 0.2365, 0.6246]			)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_22k_1k_384.pth":
				__lowercase=    torch.tensor([-0.2642, 0.3931, 0.5116]			)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_xlarge_22k_1k_224_ema.pth":
				__lowercase=    torch.tensor([-0.6677, -0.1873, -0.8379]			)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_xlarge_22k_1k_384_ema.pth":
				__lowercase=    torch.tensor([-0.7749, -0.2967, -0.6444]			)
		else:
				raise ValueError(F'Unknown URL: {checkpoint_url}'			)

		assert torch.allclose(logits[0, :3]     ,				lowerCAmelCase__     ,				atol=1E-3			)
		assert logits.shape == expected_shape

		Path(lowerCAmelCase__			).mkdir(exist_ok=lowerCAmelCase__			)
		print(F'Saving model to {pytorch_dump_folder_path}'			)
		model.save_pretrained(lowerCAmelCase__			)
		print(F'Saving image processor to {pytorch_dump_folder_path}'			)
		image_processor.save_pretrained(lowerCAmelCase__			)

		print('Pushing model to the hub...'			)
		__lowercase=    'convnext'
		if "tiny" in checkpoint_url:
				model_name += "-tiny"
		elif "small" in checkpoint_url:
				model_name += "-small"
		elif "base" in checkpoint_url:
				model_name += "-base"
		elif "xlarge" in checkpoint_url:
				model_name += "-xlarge"
		elif "large" in checkpoint_url:
				model_name += "-large"
		if "224" in checkpoint_url:
				model_name += "-224"
		elif "384" in checkpoint_url:
				model_name += "-384"
		if "22k" in checkpoint_url and "1k" not in checkpoint_url:
				model_name += "-22k"
		if "22k" in checkpoint_url and "1k" in checkpoint_url:
				model_name += "-22k-1k"

		model.push_to_hub(
		    repo_path_or_name=Path(lowerCAmelCase__     ,				lowerCAmelCase__			)     ,				organization='nielsr'     ,				commit_message='Add model'     ,				)


if __name__ == "__main__":
	lowerCAmelCase					 =	argparse.ArgumentParser()
	# Required parameters
	parser.add_argument(
	    '''--checkpoint_url''',
	    default='''https://dl.fbaipublicfiles.com/convnext/convnext_tiny_1k_224_ema.pth''',
	    type=str,
	    help='''URL of the original ConvNeXT checkpoint you\'d like to convert.''',
	)
	parser.add_argument(
	    '''--pytorch_dump_folder_path''',
	    default=None,
	    type=str,
	    required=True,
	    help='''Path to the output PyTorch model directory.''',
	)

	lowerCAmelCase					 =	parser.parse_args()
	convert_convnext_checkpoint(args.checkpoint_url, args.pytorch_dump_folder_path)










import unittest

from transformers import is_torch_available
from transformers.testing_utils import require_torch, slow, torch_device


if is_torch_available():
	import torch

	from transformers import XLMProphetNetForConditionalGeneration, XLMProphetNetTokenizer





@require_torch
class    A					(     unittest.TestCase				):


							@slow
							def     _A (self      ):
									__lowercase=    XLMProphetNetForConditionalGeneration.from_pretrained('microsoft/xprophetnet-large-wiki100-cased'      )
									model.to(lowerCAmelCase      )

									# encoder-decoder outputs
									__lowercase=    torch.tensor([[1_7, 9_6_2_0_8, 1_0_3_4_7_1, 2]]      ).to(lowerCAmelCase      )
									__lowercase=    torch.tensor(
									    [[2, 2_5_0, 9_9_5_3, 3_4, 6_9_4_8_9, 1_6_2_0, 3_2, 1_1_8_4_2_4, 6_2_4, 2_1_0, 1_0_5, 2_9_1_3, 1_0_3_2, 3_5_1]]      ).to(lowerCAmelCase      )
									__lowercase=    model(
									    input_ids=lowerCAmelCase   ,       attention_mask=lowerCAmelCase   ,       encoder_outputs=lowerCAmelCase   ,       decoder_input_ids=lowerCAmelCase      )
									__lowercase=    output[0]
									__lowercase=    torch.Size((1, 1_4, 2_5_0_0_1_2)      )
									self.assertEqual(output_predited_logis.shape   ,       lowerCAmelCase      )
									__lowercase=    torch.tensor(
									    [[[-6.39_86, -8.23_91, 12.51_89], [-6.32_89, -8.08_64, 12.62_11], [-6.24_18, -8.04_45, 12.79_68]]]      ).to(lowerCAmelCase      )
									self.assertTrue(torch.allclose(output_predited_logis[:, :3, :3]   ,       lowerCAmelCase   ,       atol=1E-4      )      )

									# encoder outputs
									__lowercase=    model.prophetnet.encoder(lowerCAmelCase      )[0]
									__lowercase=    torch.tensor(
									    [[[-1.42_60, -0.76_28, 0.84_53], [-1.47_19, -0.13_91, 0.78_07], [-1.76_78, 0.01_14, 0.46_46]]]      ).to(lowerCAmelCase      )
									__lowercase=    torch.Size((1, 4, 1_0_2_4)      )
									self.assertEqual(encoder_outputs.shape   ,       lowerCAmelCase      )
									self.assertTrue(torch.allclose(encoder_outputs[:, :3, :3]   ,       lowerCAmelCase   ,       atol=1E-4      )      )

									# decoder outputs
									__lowercase=    model.prophetnet.decoder(
									    lowerCAmelCase   ,       encoder_hidden_states=lowerCAmelCase   ,       )
									__lowercase=    decoder_outputs[1].view(1   ,       model.config.ngram   ,       1_4   ,       -1      )
									__lowercase=    model.lm_head(lowerCAmelCase      )
									__lowercase=    predicting_streams_logits[:, 0]
									self.assertTrue(torch.allclose(next_first_stream_logits[:, :3, :3]   ,       lowerCAmelCase   ,       atol=1E-4      )      )


							@slow
							def     _A (self      ):
									__lowercase=    XLMProphetNetForConditionalGeneration.from_pretrained(
									    'microsoft/xprophetnet-large-wiki100-cased-xglue-ntg'      )
									model.to(lowerCAmelCase      )

									__lowercase=    torch.tensor([[1_7, 9_6_2_0_8, 1_0_3_4_7_1, 2]]      ).to(lowerCAmelCase      )
									__lowercase=    torch.tensor(
									    [[2, 2_5_0, 9_9_5_3, 3_4, 6_9_4_8_9, 1_6_2_0, 3_2, 1_1_8_4_2_4, 6_2_4, 2_1_0, 1_0_5, 2_9_1_3, 1_0_3_2, 3_5_1]]      ).to(lowerCAmelCase      )
									__lowercase=    model(
									    input_ids=lowerCAmelCase   ,       attention_mask=lowerCAmelCase   ,       encoder_outputs=lowerCAmelCase   ,       decoder_input_ids=lowerCAmelCase      )
									__lowercase=    output[0]
									__lowercase=    torch.Size((1, 1_4, 2_5_0_0_1_2)      )
									self.assertEqual(output_predited_logis.shape   ,       lowerCAmelCase      )
									# compare the actual values for a slice.
									__lowercase=    torch.tensor(
									    [[[-9.22_53, -9.71_73, -6.35_29], [-7.67_01, -9.01_45, -1.93_82], [-8.01_95, -7.00_04, -0.15_23]]]      ).to(lowerCAmelCase      )

									self.assertTrue(torch.allclose(output_predited_logis[:, :3, :3]   ,       lowerCAmelCase   ,       atol=1E-4      )      )







							@slow
							def     _A (self      ):
									__lowercase=    XLMProphetNetForConditionalGeneration.from_pretrained(
									    'microsoft/xprophetnet-large-wiki100-cased-xglue-ntg'      )
									model.to(lowerCAmelCase      )
									__lowercase=    5_1_2

									__lowercase=    XLMProphetNetTokenizer.from_pretrained('microsoft/xprophetnet-large-wiki100-cased-xglue-ntg'      )

									__lowercase=    (
									    'Microsoft Corporation intends to officially end free support for the Windows 7 operating system after'
									    ' January 14, 2020, according to the official portal of the organization. From that day, users of this'
									    ' system will not be able to receive security updates, which could make their computers vulnerable to'
									    ' cyber attacks.'
									)
									__lowercase=    (
									    'орпорация Microsoft намерена официально прекратить бесплатную поддержку операционной системы Windows 7'
									    ' после 14 января 2020 года, сообщается на официальном портале организации . С указанного дня пользователи'
									    ' этой системы не смогут получать обновления безопасности, из-за чего их компьютеры могут стать уязвимыми'
									    ' к кибератакам.'
									)
									__lowercase=    (
									    '根据该组织的官方门户网站，微软公司打算在2020年1月14日之后正式终止对Windows 7操作系统的免费支持。从那时起，该系统的用户将无法接收安全更新，这可能会使他们的计算机容易受到网络攻击。'
									)

									__lowercase=    tokenizer(
									    [EN_SENTENCE, RU_SENTENCE, ZH_SENTENCE]   ,       padding=lowerCAmelCase   ,       max_length=2_5_5   ,       return_tensors='pt'      ).input_ids
									__lowercase=    input_ids.to(lowerCAmelCase      )

									__lowercase=    model.generate(
									    lowerCAmelCase   ,       num_beams=1_0   ,       length_penalty=1.0   ,       no_repeat_ngram_size=3   ,       early_stopping=lowerCAmelCase      )
									__lowercase=    [tokenizer.decode(lowerCAmelCase   ,       skip_special_tokens=lowerCAmelCase      ) for g in summary_ids]
									__lowercase=    'Microsoft to end Windows 7 free support after January 14, 2020'
									__lowercase=    'Microsoft намерена прекратить бесплатную поддержку Windows 7 после 14 января 2020 года'
									__lowercase=    '微软打算终止对Windows 7操作系统的免费支持'
									self.assertListEqual(
									    [EXPECTED_TITLE_EN, EXPECTED_TITLE_RU, EXPECTED_TITLE_ZH]   ,       lowerCAmelCase   ,       )

									__lowercase=    model.generate(
									    lowerCAmelCase   ,       num_beams=1   ,       length_penalty=1.0   ,       no_repeat_ngram_size=3   ,       early_stopping=lowerCAmelCase      )
									__lowercase=    [
									    tokenizer.convert_ids_to_tokens(lowerCAmelCase   ,       skip_special_tokens=lowerCAmelCase      ) for g in summary_ids_beama
									]
									__lowercase=    '▁Microsoft ▁to ▁end ▁free ▁support ▁for ▁Windows ▁7'.split(' '      )
									__lowercase=    '▁Microsoft ▁намерен а ▁прекрати ть ▁бес плат ную ▁поддержку ▁Windows ▁7 ▁после ▁14 ▁января ▁2020 ▁года'.split(
									    ' '      )
									__lowercase=    '微软 公司 打算 终止 对 Windows ▁7 操作 系统的 免费 支持'.split(' '      )
									self.assertListEqual(
									    [EXPECTED_TITLE_EN_BEAM1_TOK, EXPECTED_TITLE_RU_BEAM1_TOK, EXPECTED_TITLE_ZH_BEAM1_TOK]   ,       lowerCAmelCase   ,       )






