
'''simple docstring'''





import gc
import unittest

import numpy as np
import torch
from transformers import CLIPTextConfig, CLIPTextModel, CLIPTokenizer

from diffusers import (
    AutoencoderKL,
    DDIMScheduler,
    StableDiffusionAttendAndExcitePipeline,
    UNetaDConditionModel,
)
from diffusers.utils import load_numpy, skip_mps, slow
from diffusers.utils.testing_utils import require_torch_gpu

from ..pipeline_params import TEXT_TO_IMAGE_BATCH_PARAMS, TEXT_TO_IMAGE_IMAGE_PARAMS, TEXT_TO_IMAGE_PARAMS
from ..test_pipelines_common import PipelineKarrasSchedulerTesterMixin, PipelineLatentTesterMixin, PipelineTesterMixin


UpperCAmelCase    					=   False

@skip_mps
class 						a   (				__magic_name__				,__magic_name__				,__magic_name__				,unittest.TestCase    ):
				_snake_case		    = StableDiffusionAttendAndExcitePipeline
				_snake_case		    = False
				_snake_case		    = TEXT_TO_IMAGE_PARAMS
				_snake_case		    = TEXT_TO_IMAGE_BATCH_PARAMS.union({'''token_indices'''}    )
				_snake_case		    = TEXT_TO_IMAGE_IMAGE_PARAMS
				_snake_case		    = TEXT_TO_IMAGE_IMAGE_PARAMS




				@classmethod
				def 	__snake_case							(							cls	:				Tuple      ):
										super().setUpClass()
										torch.use_deterministic_algorithms(SCREAMING_SNAKE_CASE_      )




				@classmethod
				def 	__snake_case							(							cls	:				Any      ):
										super().tearDownClass()
										torch.use_deterministic_algorithms(SCREAMING_SNAKE_CASE_      )




				def 	__snake_case							(							self	:				Tuple      ):
										torch.manual_seed(0      )
										snake_case       :     Tuple =    UNetaDConditionModel(
										    block_out_channels=(32, 64),    layers_per_block=1,    sample_size=32,    in_channels=4,    out_channels=4,    down_block_types=('''DownBlock2D''', '''CrossAttnDownBlock2D'''),    up_block_types=('''CrossAttnUpBlock2D''', '''UpBlock2D'''),    cross_attention_dim=32,    attention_head_dim=(2, 4),    use_linear_projection=SCREAMING_SNAKE_CASE_,    )
										snake_case       :     Dict =    DDIMScheduler(
										    beta_start=0.00085,    beta_end=0.012,    beta_schedule='''scaled_linear''',    clip_sample=SCREAMING_SNAKE_CASE_,    set_alpha_to_one=SCREAMING_SNAKE_CASE_,    )
										torch.manual_seed(0      )
										snake_case       :     str =    AutoencoderKL(
										    block_out_channels=[32, 64],    in_channels=3,    out_channels=3,    down_block_types=['''DownEncoderBlock2D''', '''DownEncoderBlock2D'''],    up_block_types=['''UpDecoderBlock2D''', '''UpDecoderBlock2D'''],    latent_channels=4,    sample_size=1_28,    )
										torch.manual_seed(0      )
										snake_case       :     Any =    CLIPTextConfig(
										    bos_token_id=0,    eos_token_id=2,    hidden_size=32,    intermediate_size=37,    layer_norm_eps=1e-05,    num_attention_heads=4,    num_hidden_layers=5,    pad_token_id=1,    vocab_size=10_00,    hidden_act='''gelu''',    projection_dim=5_12,    )
										snake_case       :     Tuple =    CLIPTextModel(SCREAMING_SNAKE_CASE_      )
										snake_case       :     Tuple =    CLIPTokenizer.from_pretrained('''hf-internal-testing/tiny-random-clip'''      )

										snake_case       :     Dict =    {
										    '''unet''': unet,
										    '''scheduler''': scheduler,
										    '''vae''': vae,
										    '''text_encoder''': text_encoder,
										    '''tokenizer''': tokenizer,
										    '''safety_checker''': None,
										    '''feature_extractor''': None,
										}

										return components




				def 	__snake_case							(							self	:				Any,    SCREAMING_SNAKE_CASE_	:				int,    SCREAMING_SNAKE_CASE_	:				List[Any]=0      ):
										if str(SCREAMING_SNAKE_CASE_      ).startswith('''mps'''      ):
																snake_case       :     Tuple =    torch.manual_seed(SCREAMING_SNAKE_CASE_      )
										else:
																snake_case       :     Optional[Any] =    torch.Generator(device=SCREAMING_SNAKE_CASE_      ).manual_seed(SCREAMING_SNAKE_CASE_      )
										snake_case       :     Tuple =    {
										    '''prompt''': '''a cat and a frog''',
										    '''token_indices''': [2, 5],
										    '''generator''': generator,
										    '''num_inference_steps''': 1,
										    '''guidance_scale''': 6.0,
										    '''output_type''': '''numpy''',
										    '''max_iter_to_alter''': 2,
										    '''thresholds''': {0: 0.7},
										}
										return inputs




				def 	__snake_case							(							self	:				List[str]      ):
										snake_case       :     str =    '''cpu'''

										snake_case       :     List[Any] =    self.get_dummy_components()
										snake_case       :     Tuple =    self.pipeline_class(**SCREAMING_SNAKE_CASE_      )
										pipe.to(SCREAMING_SNAKE_CASE_      )
										pipe.set_progress_bar_config(disable=SCREAMING_SNAKE_CASE_      )

										snake_case       :     Tuple =    self.get_dummy_inputs(SCREAMING_SNAKE_CASE_      )
										snake_case       :     Optional[int] =    pipe(**SCREAMING_SNAKE_CASE_      ).images
										snake_case       :     List[str] =    image[0, -3:, -3:, -1]

										self.assertEqual(image.shape,    (1, 64, 64, 3)      )
										snake_case       :     Dict =    np.array(
										    [0.63905364, 0.62897307, 0.48599017, 0.5133624, 0.5550048, 0.45769516, 0.50326973, 0.5023139, 0.45384496]      )
										snake_case       :     str =    np.abs(image_slice.flatten() - expected_slice      ).max()
										self.assertLessEqual(SCREAMING_SNAKE_CASE_,    1e-3      )




				def 	__snake_case							(							self	:				Union[str, Any]      ):
										super().test_cpu_offload_forward_pass(expected_max_diff=5e-4      )




				def 	__snake_case							(							self	:				Tuple      ):
										# NOTE: Larger batch sizes cause this test to timeout, only test on smaller batches
										self._test_inference_batch_consistent(batch_sizes=[1, 2]      )




				def 	__snake_case							(							self	:				Union[str, Any]      ):
										self._test_inference_batch_single_identical(batch_size=2,    expected_max_diff=7e-4      )




				def 	__snake_case							(							self	:				str      ):
										super().test_dict_tuple_outputs_equivalent(expected_max_difference=3e-3      )




				def 	__snake_case							(							self	:				int      ):
										super().test_pt_np_pil_outputs_equivalent(expected_max_diff=5e-4      )




				def 	__snake_case							(							self	:				Union[str, Any]      ):
										super().test_save_load_local(expected_max_difference=5e-4      )




				def 	__snake_case							(							self	:				Optional[int]      ):
										super().test_save_load_optional_components(expected_max_difference=4e-4      )




@require_torch_gpu
@slow
class 						a   (				unittest.TestCase    ):




				@classmethod
				def 	__snake_case							(							cls	:				str      ):
										super().setUpClass()
										torch.use_deterministic_algorithms(SCREAMING_SNAKE_CASE_      )




				@classmethod
				def 	__snake_case							(							cls	:				Optional[Any]      ):
										super().tearDownClass()
										torch.use_deterministic_algorithms(SCREAMING_SNAKE_CASE_      )




				def 	__snake_case							(							self	:				Tuple      ):
										super().tearDown()
										gc.collect()
										torch.cuda.empty_cache()




				def 	__snake_case							(							self	:				Any      ):
										snake_case       :     List[str] =    torch.manual_seed(51      )

										snake_case       :     Tuple =    StableDiffusionAttendAndExcitePipeline.from_pretrained(
										    '''CompVis/stable-diffusion-v1-4''',    safety_checker=SCREAMING_SNAKE_CASE_,    torch_dtype=torch.floataa      )
										pipe.to('''cuda'''      )

										snake_case       :     Tuple =    '''a painting of an elephant with glasses'''
										snake_case       :     Tuple =    [5, 7]

										snake_case       :     Optional[int] =    pipe(
										    prompt=SCREAMING_SNAKE_CASE_,    token_indices=SCREAMING_SNAKE_CASE_,    guidance_scale=7.5,    generator=SCREAMING_SNAKE_CASE_,    num_inference_steps=5,    max_iter_to_alter=5,    output_type='''numpy''',    ).images[0]

										snake_case       :     Union[str, Any] =    load_numpy(
										    '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/attend-and-excite/elephant_glasses.npy'''      )
										assert np.abs((expected_image - image).max()      ) < 5e-1



'''simple docstring'''





import argparse
import os

import gluonnlp as nlp
import mxnet as mx
import numpy as np
import torch
from gluonnlp.base import get_home_dir
from gluonnlp.model.bert import BERTEncoder
from gluonnlp.model.utils import _load_vocab
from gluonnlp.vocab import Vocab
from packaging import version
from torch import nn

from transformers import BertConfig, BertForMaskedLM, BertModel, RobertaTokenizer
from transformers.models.bert.modeling_bert import (
    BertIntermediate,
    BertLayer,
    BertOutput,
    BertSelfAttention,
    BertSelfOutput,
)
from transformers.utils import logging


if version.parse(nlp.__version__) != version.parse("0.8.3"):
						raise Exception("requires gluonnlp == 0.8.3")

if version.parse(mx.__version__) != version.parse("1.5.0"):
						raise Exception("requires mxnet == 1.5.0")

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

UpperCAmelCase    					=   "The Nymphenburg Palace is a beautiful palace in Munich!"

def      A (       A_							:					str    ,							A_							:					str       ):
						snake_case       :     str =    {
						    '''attention_cell''': '''multi_head''',
						    '''num_layers''': 4,
						    '''units''': 1024,
						    '''hidden_size''': 768,
						    '''max_length''': 512,
						    '''num_heads''': 8,
						    '''scaled''': True,
						    '''dropout''': 0.1,
						    '''use_residual''': True,
						    '''embed_size''': 1024,
						    '''embed_dropout''': 0.1,
						    '''word_embed''': None,
						    '''layer_norm_eps''': 1e-5,
						    '''token_type_vocab_size''': 2,
						}

						snake_case       :     int =    bort_4_8_768_1024_hparams

						# Let's construct the original Bort model here
						# Taken from official BERT implementation, see:
						# https://github.com/alexa/bort/blob/master/bort/bort.py
						snake_case       :     int =    BERTEncoder(
						    attention_cell=predefined_args['''attention_cell''']    ,							num_layers=predefined_args['''num_layers''']    ,							units=predefined_args['''units''']    ,							hidden_size=predefined_args['''hidden_size''']    ,							max_length=predefined_args['''max_length''']    ,							num_heads=predefined_args['''num_heads''']    ,							scaled=predefined_args['''scaled''']    ,							dropout=predefined_args['''dropout''']    ,							output_attention=A_    ,							output_all_encodings=A_    ,							use_residual=predefined_args['''use_residual''']    ,							activation=predefined_args.get('''activation'''    ,							'''gelu'''       )    ,							layer_norm_eps=predefined_args.get('''layer_norm_eps'''    ,							A_       )    ,							)

						# Vocab information needs to be fetched first
						# It's the same as RoBERTa, so RobertaTokenizer can be used later
						snake_case       :     List[Any] =    '''openwebtext_ccnews_stories_books_cased'''

						# Specify download folder to Gluonnlp's vocab
						snake_case       :     Optional[Any] =    os.path.join(get_home_dir()    ,							'''models'''       )
						snake_case       :     Dict =    _load_vocab(A_    ,							A_    ,							A_    ,							cls=A_       )

						snake_case       :     Tuple =    nlp.model.BERTModel(
						    A_    ,							len(A_       )    ,							units=predefined_args['''units''']    ,							embed_size=predefined_args['''embed_size''']    ,							embed_dropout=predefined_args['''embed_dropout''']    ,							word_embed=predefined_args['''word_embed''']    ,							use_pooler=A_    ,							use_token_type_embed=A_    ,							token_type_vocab_size=predefined_args['''token_type_vocab_size''']    ,							use_classifier=A_    ,							use_decoder=A_    ,							)

						original_bort.load_parameters(A_    ,							cast_dtype=A_    ,							ignore_extra=A_       )
						snake_case       :     Union[str, Any] =    original_bort._collect_params_with_prefix()

						# Build our config 🤗
						snake_case       :     Optional[int] =    {
						    '''architectures''': ['''BertForMaskedLM'''],
						    '''attention_probs_dropout_prob''': predefined_args['''dropout'''],
						    '''hidden_act''': '''gelu''',
						    '''hidden_dropout_prob''': predefined_args['''dropout'''],
						    '''hidden_size''': predefined_args['''embed_size'''],
						    '''initializer_range''': 0.02,
						    '''intermediate_size''': predefined_args['''hidden_size'''],
						    '''layer_norm_eps''': predefined_args['''layer_norm_eps'''],
						    '''max_position_embeddings''': predefined_args['''max_length'''],
						    '''model_type''': '''bort''',
						    '''num_attention_heads''': predefined_args['''num_heads'''],
						    '''num_hidden_layers''': predefined_args['''num_layers'''],
						    '''pad_token_id''': 1,  # 2 = BERT, 1 = RoBERTa
						    '''type_vocab_size''': 1,  # 2 = BERT, 1 = RoBERTa
						    '''vocab_size''': len(A_       ),
						}

						snake_case       :     Optional[int] =    BertConfig.from_dict(A_       )
						snake_case       :     int =    BertForMaskedLM(A_       )
						hf_bort_model.eval()

						# Parameter mapping table (Gluonnlp to Transformers)
						# * denotes layer index
						#
						# | Gluon Parameter                                                | Transformers Parameter
						# | -------------------------------------------------------------- | ----------------------
						# | `encoder.layer_norm.beta`                                      | `bert.embeddings.LayerNorm.bias`
						# | `encoder.layer_norm.gamma`                                     | `bert.embeddings.LayerNorm.weight`
						# | `encoder.position_weight`                                      | `bert.embeddings.position_embeddings.weight`
						# | `word_embed.0.weight`                                          | `bert.embeddings.word_embeddings.weight`
						# | `encoder.transformer_cells.*.attention_cell.proj_key.bias`     | `bert.encoder.layer.*.attention.self.key.bias`
						# | `encoder.transformer_cells.*.attention_cell.proj_key.weight`   | `bert.encoder.layer.*.attention.self.key.weight`
						# | `encoder.transformer_cells.*.attention_cell.proj_query.bias`   | `bert.encoder.layer.*.attention.self.query.bias`
						# | `encoder.transformer_cells.*.attention_cell.proj_query.weight` | `bert.encoder.layer.*.attention.self.query.weight`
						# | `encoder.transformer_cells.*.attention_cell.proj_value.bias`   | `bert.encoder.layer.*.attention.self.value.bias`
						# | `encoder.transformer_cells.*.attention_cell.proj_value.weight` | `bert.encoder.layer.*.attention.self.value.weight`
						# | `encoder.transformer_cells.*.ffn.ffn_2.bias`                   | `bert.encoder.layer.*.attention.output.dense.bias`
						# | `encoder.transformer_cells.*.ffn.ffn_2.weight`                 | `bert.encoder.layer.*.attention.output.dense.weight`
						# | `encoder.transformer_cells.*.layer_norm.beta`                  | `bert.encoder.layer.*.attention.output.LayerNorm.bias`
						# | `encoder.transformer_cells.*.layer_norm.gamma`                 | `bert.encoder.layer.*.attention.output.LayerNorm.weight`
						# | `encoder.transformer_cells.*.ffn.ffn_1.bias`                   | `bert.encoder.layer.*.intermediate.dense.bias`
						# | `encoder.transformer_cells.*.ffn.ffn_1.weight`                 | `bert.encoder.layer.*.intermediate.dense.weight`
						# | `encoder.transformer_cells.*.ffn.layer_norm.beta`              | `bert.encoder.layer.*.output.LayerNorm.bias`
						# | `encoder.transformer_cells.*.ffn.layer_norm.gamma`             | `bert.encoder.layer.*.output.LayerNorm.weight`
						# | `encoder.transformer_cells.*.proj.bias`                        | `bert.encoder.layer.*.output.dense.bias`
						# | `encoder.transformer_cells.*.proj.weight`                      | `bert.encoder.layer.*.output.dense.weight`

						# Helper function to convert MXNET Arrays to PyTorch
						def to_torch(A_							:					List[str]       ) -> nn.Parameter:
												return nn.Parameter(torch.FloatTensor(mx_array.data().asnumpy()       )       )

						# Check param shapes and map new HF param back
						def check_and_map_params(A_							:					Tuple    ,							A_							:					Dict       ):
												snake_case       :     Tuple =    hf_param.shape

												snake_case       :     List[Any] =    to_torch(params[gluon_param]       )
												snake_case       :     int =    gluon_param.shape

												assert (
												    shape_hf == shape_gluon
												), F"""The gluon parameter {gluon_param} has shape {shape_gluon}, but expects shape {shape_hf} for Transformers"""

												return gluon_param

						snake_case       :     List[str] =    check_and_map_params(
						    hf_bort_model.bert.embeddings.word_embeddings.weight    ,							'''word_embed.0.weight'''       )
						snake_case       :     Optional[Any] =    check_and_map_params(
						    hf_bort_model.bert.embeddings.position_embeddings.weight    ,							'''encoder.position_weight'''       )
						snake_case       :     Dict =    check_and_map_params(
						    hf_bort_model.bert.embeddings.LayerNorm.bias    ,							'''encoder.layer_norm.beta'''       )
						snake_case       :     Tuple =    check_and_map_params(
						    hf_bort_model.bert.embeddings.LayerNorm.weight    ,							'''encoder.layer_norm.gamma'''       )

						# Inspired by RoBERTa conversion script, we just zero them out (Bort does not use them)
						snake_case       :     str =    torch.zeros_like(
						    hf_bort_model.bert.embeddings.token_type_embeddings.weight.data       )

						for i in range(hf_bort_config.num_hidden_layers       ):
												snake_case       :     BertLayer =    hf_bort_model.bert.encoder.layer[i]

												# self attention
												snake_case       :     BertSelfAttention =    layer.attention.self

												snake_case       :     Optional[int] =    check_and_map_params(
												    self_attn.key.bias.data    ,							F"""encoder.transformer_cells.{i}.attention_cell.proj_key.bias"""       )

												snake_case       :     Any =    check_and_map_params(
												    self_attn.key.weight.data    ,							F"""encoder.transformer_cells.{i}.attention_cell.proj_key.weight"""       )
												snake_case       :     Tuple =    check_and_map_params(
												    self_attn.query.bias.data    ,							F"""encoder.transformer_cells.{i}.attention_cell.proj_query.bias"""       )
												snake_case       :     Dict =    check_and_map_params(
												    self_attn.query.weight.data    ,							F"""encoder.transformer_cells.{i}.attention_cell.proj_query.weight"""       )
												snake_case       :     int =    check_and_map_params(
												    self_attn.value.bias.data    ,							F"""encoder.transformer_cells.{i}.attention_cell.proj_value.bias"""       )
												snake_case       :     int =    check_and_map_params(
												    self_attn.value.weight.data    ,							F"""encoder.transformer_cells.{i}.attention_cell.proj_value.weight"""       )

												# self attention output
												snake_case       :     BertSelfOutput =    layer.attention.output

												snake_case       :     Optional[Any] =    check_and_map_params(
												    self_output.dense.bias    ,							F"""encoder.transformer_cells.{i}.proj.bias"""       )
												snake_case       :     Tuple =    check_and_map_params(
												    self_output.dense.weight    ,							F"""encoder.transformer_cells.{i}.proj.weight"""       )
												snake_case       :     int =    check_and_map_params(
												    self_output.LayerNorm.bias    ,							F"""encoder.transformer_cells.{i}.layer_norm.beta"""       )
												snake_case       :     Optional[int] =    check_and_map_params(
												    self_output.LayerNorm.weight    ,							F"""encoder.transformer_cells.{i}.layer_norm.gamma"""       )

												# intermediate
												snake_case       :     BertIntermediate =    layer.intermediate

												snake_case       :     Optional[Any] =    check_and_map_params(
												    intermediate.dense.bias    ,							F"""encoder.transformer_cells.{i}.ffn.ffn_1.bias"""       )
												snake_case       :     Optional[int] =    check_and_map_params(
												    intermediate.dense.weight    ,							F"""encoder.transformer_cells.{i}.ffn.ffn_1.weight"""       )

												# output
												snake_case       :     BertOutput =    layer.output

												snake_case       :     List[Any] =    check_and_map_params(
												    bert_output.dense.bias    ,							F"""encoder.transformer_cells.{i}.ffn.ffn_2.bias"""       )
												snake_case       :     int =    check_and_map_params(
												    bert_output.dense.weight    ,							F"""encoder.transformer_cells.{i}.ffn.ffn_2.weight"""       )
												snake_case       :     List[str] =    check_and_map_params(
												    bert_output.LayerNorm.bias    ,							F"""encoder.transformer_cells.{i}.ffn.layer_norm.beta"""       )
												snake_case       :     List[str] =    check_and_map_params(
												    bert_output.LayerNorm.weight    ,							F"""encoder.transformer_cells.{i}.ffn.layer_norm.gamma"""       )

						# Save space and energy 🎄
						hf_bort_model.half()

						# Compare output of both models
						snake_case       :     Dict =    RobertaTokenizer.from_pretrained('''roberta-base'''       )

						snake_case       :     Any =    tokenizer.encode_plus(A_       )['''input_ids''']

						# Get gluon output
						snake_case       :     Dict =    mx.nd.array([input_ids]       )
						snake_case       :     Optional[int] =    original_bort(inputs=A_    ,							token_types=[]       )

						# Get Transformer output (save and reload model again)
						hf_bort_model.save_pretrained(A_       )
						snake_case       :     Optional[int] =    BertModel.from_pretrained(A_       )
						hf_bort_model.eval()

						snake_case       :     Any =    tokenizer.encode_plus(A_    ,							return_tensors='''pt'''       )
						snake_case       :     Any =    hf_bort_model(**A_       )[0]

						snake_case       :     Optional[Any] =    output_gluon[0].asnumpy()
						snake_case       :     Union[str, Any] =    output_hf[0].detach().numpy()

						snake_case       :     Tuple =    np.max(np.abs(hf_layer - gluon_layer       )       ).item()
						snake_case       :     Tuple =    np.allclose(A_    ,							A_    ,							atol=1e-3       )

						if success:
												print('''✔️ Both model do output the same tensors'''       )
						else:
												print('''❌ Both model do **NOT** output the same tensors'''       )
												print('''Absolute difference is:'''    ,							A_       )


if __name__ == "__main__":
						UpperCAmelCase    					=   argparse.ArgumentParser()
						# Required parameters
						parser.add_argument(
						    "--bort_checkpoint_path", default=None, type=str, required=True, help="Path the official Bort params file."
						)
						parser.add_argument(
						    "--pytorch_dump_folder_path", default=None, type=str, required=True, help="Path to the output PyTorch model."
						)
						UpperCAmelCase    					=   parser.parse_args()
						convert_bort_checkpoint_to_pytorch(args.bort_checkpoint_path, args.pytorch_dump_folder_path)

