



'''simple docstring'''

import gc
import random
import unittest

import torch

from diffusers import (
    IFImgaImgPipeline,
    IFImgaImgSuperResolutionPipeline,
    IFInpaintingPipeline,
    IFInpaintingSuperResolutionPipeline,
    IFPipeline,
    IFSuperResolutionPipeline,
)
from diffusers.models.attention_processor import AttnAddedKVProcessor
from diffusers.utils.import_utils import is_xformers_available
from diffusers.utils.testing_utils import floats_tensor, load_numpy, require_torch_gpu, skip_mps, slow, torch_device

from ..pipeline_params import TEXT_TO_IMAGE_BATCH_PARAMS, TEXT_TO_IMAGE_PARAMS
from ..test_pipelines_common import PipelineTesterMixin, assert_mean_pixel_difference
from . import IFPipelineTesterMixin






@skip_mps
class 						a_		(     snake_case    ,   snake_case    ,   unittest.TestCase    ):
							UpperCAmelCase			:		Optional[int]        =				IFPipeline
							UpperCAmelCase			:		Dict        =				TEXT_TO_IMAGE_PARAMS - {"""width""", """height""", """latents"""}
							UpperCAmelCase			:		Optional[int]        =				TEXT_TO_IMAGE_BATCH_PARAMS
							UpperCAmelCase			:		Optional[int]        =				PipelineTesterMixin.required_optional_params - {"""latents"""}


							def    UpperCamelCase     (				self   :						int			)			->					List[str]:
										return self._get_dummy_components()


							def    UpperCamelCase     (				self   :						Optional[Any]      ,						a_   :						Optional[int]      ,						a_   :						Any=0			)			->					Optional[Any]:
										if str(a_			).startswith('mps'			):
													snake_case:    Dict      							=torch.manual_seed(a_			)
										else:
													snake_case:    List[Any]      							=torch.Generator(device=a_			).manual_seed(a_			)

										snake_case:    Optional[Any]      							={
										    'prompt': 'A painting of a squirrel eating a burger',
										    'generator': generator,
										    'num_inference_steps': 2,
										    'output_type': 'numpy',
										}

										return inputs


							def    UpperCamelCase     (				self   :						List[Any]			)			->					List[str]:
										self._test_save_load_optional_components()


							@unittest.skipIf(torch_device != 'cuda'      ,						reason='float16 requires CUDA'			)
							def    UpperCamelCase     (				self   :						str			)			->					Union[str, Any]:
										# Due to non-determinism in save load of the hf-internal-testing/tiny-random-t5 text encoder
										super().test_save_load_floataa(expected_max_diff=1E-1			)


							def    UpperCamelCase     (				self   :						Union[str, Any]			)			->					Dict:
										self._test_attention_slicing_forward_pass(expected_max_diff=1E-2			)


							def    UpperCamelCase     (				self   :						Any			)			->					List[Any]:
										self._test_save_load_local()


							def    UpperCamelCase     (				self   :						Any			)			->					int:
										self._test_inference_batch_single_identical(
										    expected_max_diff=1E-2      ,						)




							@unittest.skipIf(
							    torch_device != 'cuda' or not is_xformers_available()      ,						reason='XFormers attention is only available with CUDA and `xformers` installed'      ,						)
							def    UpperCamelCase     (				self   :						Tuple			)			->					Tuple:
										self._test_xformers_attention_forwardGenerator_pass(expected_max_diff=1E-3			)






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


							def    UpperCamelCase     (				self   :						List[Any]			)			->					List[Any]:
										# clean up the VRAM after each test
										super().tearDown()
										gc.collect()
										torch.cuda.empty_cache()


							def    UpperCamelCase     (				self   :						int			)			->					Optional[Any]:
										# if

										snake_case:    Union[str, Any]      							=IFPipeline.from_pretrained('DeepFloyd/IF-I-XL-v1.0'      ,						variant='fp16'      ,						torch_dtype=torch.floataa			)

										snake_case:    Dict      							=IFSuperResolutionPipeline.from_pretrained(
										    'DeepFloyd/IF-II-L-v1.0'      ,						variant='fp16'      ,						torch_dtype=torch.floataa      ,						text_encoder=a_      ,						tokenizer=a_			)

										# pre compute text embeddings and remove T5 to save memory

										pipe_a.text_encoder.to('cuda'			)

										snake_case							,  snake_case:    str      							=pipe_a.encode_prompt('anime turtle'      ,						device='cuda'			)

										del pipe_a.tokenizer
										del pipe_a.text_encoder
										gc.collect()

										snake_case:    int      							=None
										snake_case:    Union[str, Any]      							=None

										pipe_a.enable_model_cpu_offload()
										pipe_a.enable_model_cpu_offload()

										pipe_a.unet.set_attn_processor(AttnAddedKVProcessor()			)
										pipe_a.unet.set_attn_processor(AttnAddedKVProcessor()			)

										self._test_if(a_      ,						a_      ,						a_      ,						a_			)

										pipe_a.remove_all_hooks()
										pipe_a.remove_all_hooks()

										# img2img

										snake_case:    Optional[int]      							=IFImgaImgPipeline(**pipe_a.components			)
										snake_case:    Union[str, Any]      							=IFImgaImgSuperResolutionPipeline(**pipe_a.components			)

										pipe_a.enable_model_cpu_offload()
										pipe_a.enable_model_cpu_offload()

										pipe_a.unet.set_attn_processor(AttnAddedKVProcessor()			)
										pipe_a.unet.set_attn_processor(AttnAddedKVProcessor()			)

										self._test_if_imgaimg(a_      ,						a_      ,						a_      ,						a_			)

										pipe_a.remove_all_hooks()
										pipe_a.remove_all_hooks()

										# inpainting

										snake_case:    Optional[int]      							=IFInpaintingPipeline(**pipe_a.components			)
										snake_case:    Tuple      							=IFInpaintingSuperResolutionPipeline(**pipe_a.components			)

										pipe_a.enable_model_cpu_offload()
										pipe_a.enable_model_cpu_offload()

										pipe_a.unet.set_attn_processor(AttnAddedKVProcessor()			)
										pipe_a.unet.set_attn_processor(AttnAddedKVProcessor()			)

										self._test_if_inpainting(a_      ,						a_      ,						a_      ,						a_			)


							def    UpperCamelCase     (				self   :						str      ,						a_   :						Optional[Any]      ,						a_   :						Union[str, Any]      ,						a_   :						int      ,						a_   :						Union[str, Any]			)			->					Union[str, Any]:
										# pipeline 1

										_start_torch_memory_measurement()

										snake_case:    Union[str, Any]      							=torch.Generator(device='cpu'			).manual_seed(0			)
										snake_case:    int      							=pipe_a(
										    prompt_embeds=a_      ,						negative_prompt_embeds=a_      ,						num_inference_steps=2      ,						generator=a_      ,						output_type='np'      ,						)

										snake_case:    Optional[Any]      							=output.images[0]

										assert image.shape == (6_4, 6_4, 3)

										snake_case:    Union[str, Any]      							=torch.cuda.max_memory_allocated()
										assert mem_bytes < 1_3 * 1_0**9

										snake_case:    List[Any]      							=load_numpy(
										    'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/if/test_if.npy'			)
										assert_mean_pixel_difference(a_      ,						a_			)

										# pipeline 2

										_start_torch_memory_measurement()

										snake_case:    Dict      							=torch.Generator(device='cpu'			).manual_seed(0			)

										snake_case:    Any      							=floats_tensor((1, 3, 6_4, 6_4)      ,						rng=random.Random(0			)			).to(a_			)

										snake_case:    List[Any]      							=pipe_a(
										    prompt_embeds=a_      ,						negative_prompt_embeds=a_      ,						image=a_      ,						generator=a_      ,						num_inference_steps=2      ,						output_type='np'      ,						)

										snake_case:    int      							=output.images[0]

										assert image.shape == (2_5_6, 2_5_6, 3)

										snake_case:    Dict      							=torch.cuda.max_memory_allocated()
										assert mem_bytes < 4 * 1_0**9

										snake_case:    Dict      							=load_numpy(
										    'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/if/test_if_superresolution_stage_II.npy'			)
										assert_mean_pixel_difference(a_      ,						a_			)


							def    UpperCamelCase     (				self   :						int      ,						a_   :						Optional[Any]      ,						a_   :						Union[str, Any]      ,						a_   :						Optional[int]      ,						a_   :						Tuple			)			->					List[str]:
										# pipeline 1

										_start_torch_memory_measurement()

										snake_case:    Union[str, Any]      							=floats_tensor((1, 3, 6_4, 6_4)      ,						rng=random.Random(0			)			).to(a_			)

										snake_case:    Any      							=torch.Generator(device='cpu'			).manual_seed(0			)

										snake_case:    List[str]      							=pipe_a(
										    prompt_embeds=a_      ,						negative_prompt_embeds=a_      ,						image=a_      ,						num_inference_steps=2      ,						generator=a_      ,						output_type='np'      ,						)

										snake_case:    Optional[int]      							=output.images[0]

										assert image.shape == (6_4, 6_4, 3)

										snake_case:    Union[str, Any]      							=torch.cuda.max_memory_allocated()
										assert mem_bytes < 1_0 * 1_0**9

										snake_case:    Union[str, Any]      							=load_numpy(
										    'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/if/test_if_img2img.npy'			)
										assert_mean_pixel_difference(a_      ,						a_			)

										# pipeline 2

										_start_torch_memory_measurement()

										snake_case:    List[str]      							=torch.Generator(device='cpu'			).manual_seed(0			)

										snake_case:    str      							=floats_tensor((1, 3, 2_5_6, 2_5_6)      ,						rng=random.Random(0			)			).to(a_			)
										snake_case:    Optional[Any]      							=floats_tensor((1, 3, 6_4, 6_4)      ,						rng=random.Random(0			)			).to(a_			)

										snake_case:    Union[str, Any]      							=pipe_a(
										    prompt_embeds=a_      ,						negative_prompt_embeds=a_      ,						image=a_      ,						original_image=a_      ,						generator=a_      ,						num_inference_steps=2      ,						output_type='np'      ,						)

										snake_case:    Optional[int]      							=output.images[0]

										assert image.shape == (2_5_6, 2_5_6, 3)

										snake_case:    Any      							=torch.cuda.max_memory_allocated()
										assert mem_bytes < 4 * 1_0**9

										snake_case:    Optional[int]      							=load_numpy(
										    'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/if/test_if_img2img_superresolution_stage_II.npy'			)
										assert_mean_pixel_difference(a_      ,						a_			)




							def    UpperCamelCase     (				self   :						Dict      ,						a_   :						Dict      ,						a_   :						Optional[Any]      ,						a_   :						Tuple      ,						a_   :						str			)			->					Dict:
										# pipeline 1

										_start_torch_memory_measurement()

										snake_case:    Dict      							=floats_tensor((1, 3, 6_4, 6_4)      ,						rng=random.Random(0			)			).to(a_			)
										snake_case:    Dict      							=floats_tensor((1, 3, 6_4, 6_4)      ,						rng=random.Random(1			)			).to(a_			)

										snake_case:    List[str]      							=torch.Generator(device='cpu'			).manual_seed(0			)
										snake_case:    Any      							=pipe_a(
										    prompt_embeds=a_      ,						negative_prompt_embeds=a_      ,						image=a_      ,						mask_image=a_      ,						num_inference_steps=2      ,						generator=a_      ,						output_type='np'      ,						)

										snake_case:    Any      							=output.images[0]

										assert image.shape == (6_4, 6_4, 3)

										snake_case:    Optional[int]      							=torch.cuda.max_memory_allocated()
										assert mem_bytes < 1_0 * 1_0**9

										snake_case:    Union[str, Any]      							=load_numpy(
										    'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/if/test_if_inpainting.npy'			)
										assert_mean_pixel_difference(a_      ,						a_			)

										# pipeline 2

										_start_torch_memory_measurement()

										snake_case:    int      							=torch.Generator(device='cpu'			).manual_seed(0			)

										snake_case:    Any      							=floats_tensor((1, 3, 6_4, 6_4)      ,						rng=random.Random(0			)			).to(a_			)
										snake_case:    int      							=floats_tensor((1, 3, 2_5_6, 2_5_6)      ,						rng=random.Random(0			)			).to(a_			)
										snake_case:    Optional[int]      							=floats_tensor((1, 3, 2_5_6, 2_5_6)      ,						rng=random.Random(1			)			).to(a_			)

										snake_case:    Optional[int]      							=pipe_a(
										    prompt_embeds=a_      ,						negative_prompt_embeds=a_      ,						image=a_      ,						mask_image=a_      ,						original_image=a_      ,						generator=a_      ,						num_inference_steps=2      ,						output_type='np'      ,						)

										snake_case:    List[str]      							=output.images[0]

										assert image.shape == (2_5_6, 2_5_6, 3)

										snake_case:    Optional[Any]      							=torch.cuda.max_memory_allocated()
										assert mem_bytes < 4 * 1_0**9

										snake_case:    List[str]      							=load_numpy(
										    'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/if/test_if_inpainting_superresolution_stage_II.npy'			)
										assert_mean_pixel_difference(a_      ,						a_			)







def a_     (    )				->					int:





			"""simple docstring"""







			torch.cuda.empty_cache()
			torch.cuda.reset_max_memory_allocated()
			torch.cuda.reset_peak_memory_stats()









'''simple docstring'''

import argparse
import json
import os
import re

import torch

from transformers import BloomConfig, BloomModel
from transformers.file_utils import CONFIG_NAME, WEIGHTS_NAME
from transformers.utils import logging


logging.set_verbosity_info()

a							   =				[
    'word_embeddings_layernorm.weight',
    'word_embeddings_layernorm.bias',
    'input_layernorm.weight',
    'input_layernorm.bias',
    'post_attention_layernorm.weight',
    'post_attention_layernorm.bias',
    'self_attention.dense.bias',
    'mlp.dense_4h_to_h.bias',
    'ln_f.weight',
    'ln_f.bias',
]

a							   =				[
    'mlp.dense_4h_to_h.weight',
    'self_attention.dense.weight',
]







def a_     (    __UpperCAmelCase				,							__UpperCAmelCase					)				->					Any:





			"""simple docstring"""







			snake_case:    Any      							={
			    'word_embeddings.weight': 'word_embeddings.weight',
			    'word_embeddings.norm.weight': 'word_embeddings_layernorm.weight',
			    'word_embeddings.norm.bias': 'word_embeddings_layernorm.bias',
			    'weight': 'ln_f.weight',
			    'bias': 'ln_f.bias',
			}

			if key in layer_rename_map:
						return layer_rename_map[key]

			# Handle transformer blocks
			snake_case:    Dict      							=int(re.match(R'.*layer_(\d*).*'				,							__UpperCAmelCase					)[1]					)
			layer_number -= 3
			return f'''h.{layer_number}.''' + key







def a_     (    __UpperCAmelCase					)				->					Union[str, Any]:





			"""simple docstring"""







			if dtype == torch.bool:
						return 1 / 8
			snake_case:    Optional[Any]      							=re.search(R'[^\d](\d+)$'				,							str(__UpperCAmelCase					)					)
			if bit_search is None:
						raise ValueError(f'''`dtype` is not a valid dtype: {dtype}.'''					)
			snake_case:    str      							=int(bit_search.groups()[0]					)
			return bit_size // 8







def a_     (    __UpperCAmelCase				,							__UpperCAmelCase				,							__UpperCAmelCase				,							__UpperCAmelCase				,							__UpperCAmelCase					)				->					Tuple:





			"""simple docstring"""







			if bloom_config_file == "":
						snake_case:    Tuple      							=BloomConfig()
			else:
						snake_case:    List[Any]      							=BloomConfig.from_json_file(__UpperCAmelCase					)

			if shard_model:
						snake_case:    Any      							=os.listdir(__UpperCAmelCase					)
						snake_case:    Any      							=sorted(filter(lambda __UpperCAmelCase					: s.startswith('layer'					) and "model_00" in s				,							__UpperCAmelCase					)					)

						snake_case:    int      							={'weight_map': {}, 'metadata': {}}
						snake_case:    Dict      							=0

						snake_case:    List[str]      							=None

						snake_case:    Any      							=BloomConfig()

						for j, file in enumerate(__UpperCAmelCase					):
									print('Processing file: {}'.format(__UpperCAmelCase					)					)
									snake_case:    Any      							=None

									for i in range(__UpperCAmelCase					):
												# load all TP files
												snake_case:    Optional[int]      							=file.replace('model_00'				,							f'''model_0{i}'''					)
												snake_case:    List[str]      							=torch.load(os.path.join(__UpperCAmelCase				,							__UpperCAmelCase					)				,							map_location='cpu'					)

												# Rename keys in the transformers names
												snake_case:    int      							=list(temp.keys()					)
												for key in keys:
															snake_case:    List[Any]      							=temp.pop(__UpperCAmelCase					)

												if tensors is None:
															snake_case:    Tuple      							=temp
												else:
															for key in tensors.keys():
																		if any(key.endswith(__UpperCAmelCase					) for end in WEIGHTS_TO_AVERAGE_ENDSWITH					):
																					# We average (sum and then divide) some weights accross TP ranks (see https://github.com/bigscience-workshop/Megatron-DeepSpeed/blob/olruwase/sync_layer_norms/megatron/training.py#L425)
																					tensors[key] += temp[key]
																		else:
																					# Some weights are RowParallelLinear in Megatron-Deepspeed, others are ColumnParallel
																					snake_case:    Optional[int]      							=1 if any(text in key for text in WEIGHTS_WITH_ROW_PARALLELISM_CONTAIN					) else 0
																					# We concatenate these weights accross TP ranks
																					snake_case:    str      							=torch.cat([tensors[key], temp[key]]				,							dim=__UpperCAmelCase					)

            # Divide by the number of TP the weights we want to average
									for key in tensors.keys():
												if any(key.endswith(__UpperCAmelCase					) for end in WEIGHTS_TO_AVERAGE_ENDSWITH					):
															snake_case:    Dict      							=tensors[key] / pretraining_tp
									torch.save(
									    __UpperCAmelCase				,							os.path.join(
									        __UpperCAmelCase				,							'pytorch_model_{}-of-{}.bin'.format(str(j + 1					).zfill(5					)				,							str(len(__UpperCAmelCase					)					).zfill(5					)					)				,							)				,							)

									for key in tensors.keys():
												snake_case:    List[str]      							=tensors[key]
												total_size += value.numel() * get_dtype_size(value.dtype					)
												if key not in index_dict["weight_map"]:
															snake_case:    List[Any]      							='pytorch_model_{}-of-{}.bin'.format(
															    str(j + 1					).zfill(5					)				,							str(len(__UpperCAmelCase					)					).zfill(5					)					)

						snake_case:    Tuple      							=BloomConfig()
						snake_case:    Union[str, Any]      							=pytorch_dump_folder_path + '/' + CONFIG_NAME
						snake_case:    Any      							=total_size
						with open(__UpperCAmelCase				,							'w'				,							encoding='utf-8'					) as f:
									f.write(config.to_json_string()					)
						with open(os.path.join(__UpperCAmelCase				,							WEIGHTS_NAME + '.index.json'					)				,							'w'				,							encoding='utf-8'					) as f:
									snake_case:    Tuple      							=json.dumps(__UpperCAmelCase				,							indent=2				,							sort_keys=__UpperCAmelCase					) + '\n'
									f.write(__UpperCAmelCase					)
			else:
						snake_case:    Optional[Any]      							=BloomModel(__UpperCAmelCase					)

						snake_case:    Any      							=os.listdir(__UpperCAmelCase					)
						snake_case:    Optional[int]      							=sorted(filter(lambda __UpperCAmelCase					: s.startswith('layer'					) and "model_00" in s				,							__UpperCAmelCase					)					)

						snake_case:    str      							=None
						for i, file in enumerate(__UpperCAmelCase					):
									snake_case:    List[str]      							=None
									for i in range(__UpperCAmelCase					):
												# load all TP files
												snake_case:    int      							=file.replace('model_00'				,							f'''model_0{i}'''					)
												snake_case:    Optional[Any]      							=torch.load(os.path.join(__UpperCAmelCase				,							__UpperCAmelCase					)				,							map_location='cpu'					)

												# Rename keys in the transformers names
												snake_case:    List[str]      							=list(temp.keys()					)
												for key in keys:
															snake_case:    int      							=temp.pop(__UpperCAmelCase					)

												if tensors is None:
															snake_case:    Any      							=temp
												else:
															for key in tensors.keys():
																		# We average (sum and then divide) some weights accross TP ranks (see https://github.com/bigscience-workshop/Megatron-DeepSpeed/blob/olruwase/sync_layer_norms/megatron/training.py#L425)
																		if any(key.endswith(__UpperCAmelCase					) for end in WEIGHTS_TO_AVERAGE_ENDSWITH					):
																					tensors[key] += temp[key]
																		else:
																					# Some weights are RowParallelLinear in Megatron-Deepspeed, others are ColumnParallel
																					snake_case:    List[Any]      							=1 if any(text in key for text in WEIGHTS_WITH_ROW_PARALLELISM_CONTAIN					) else 0
																					# We concatenate these weights accross TP ranks
																					snake_case:    Tuple      							=torch.cat([tensors[key], temp[key]]				,							dim=__UpperCAmelCase					)

            # Divide by the number of TP the weights we want to average
									for key in tensors.keys():
												if any(key.endswith(__UpperCAmelCase					) for end in WEIGHTS_TO_AVERAGE_ENDSWITH					):
															snake_case:    int      							=tensors[key] / pretraining_tp

									snake_case:    Optional[Any]      							=model.load_state_dict(__UpperCAmelCase				,							strict=__UpperCAmelCase					)
									assert not other_keys.unexpected_keys, f'''The keys {other_keys.unexpected_keys} are unexpected'''
									if missing_keys is None:
												snake_case:    Optional[Any]      							=set(other_keys.missing_keys					)
									else:
												snake_case:    Any      							=missing_keys.intersection(set(other_keys.missing_keys					)					)

						assert not missing_keys, f'''The keys {missing_keys} are missing'''

						# Save pytorch-model
						os.makedirs(__UpperCAmelCase				,							exist_ok=__UpperCAmelCase					)
						snake_case:    Optional[int]      							=pytorch_dump_folder_path + '/' + WEIGHTS_NAME
						snake_case:    Any      							=pytorch_dump_folder_path + '/' + CONFIG_NAME
						print(f'''Save PyTorch model to {pytorch_weights_dump_path} with dtype {config.torch_dtype}'''					)
						if config.torch_dtype is not None:
									snake_case:    Optional[Any]      							=model.to(config.torch_dtype					)
						torch.save(model.state_dict()				,							__UpperCAmelCase					)
						print(f'''Save configuration file to {pytorch_config_dump_path}'''					)
						with open(__UpperCAmelCase				,							'w'				,							encoding='utf-8'					) as f:
									f.write(config.to_json_string()					)


if __name__ == "__main__":
	a							   =				argparse.ArgumentParser()
	# Required parameters
	parser.add_argument(
	    '--bloom_checkpoint_path',
	    default=None,
	    type=str,
	    required=True,
	    help='Path to the Megatron-LM checkpoint path.',
	)
	parser.add_argument(
	    '--pytorch_dump_folder_path', default=None, type=str, required=True, help='Path to the output PyTorch model.'
	)
	parser.add_argument(
	    '--bloom_config_file',
	    default='',
	    type=str,
	    help=(
	        'An optional config json file corresponding to the pre-trained model. \n'
	        'This specifies the model architecture.'
	    ),
	)
	parser.add_argument(
	    '--shard_model',
	    action='store_true',
	    help='An optional setting to shard the output model \nThis enables sharding the converted checkpoint',
	)
	parser.add_argument(
	    '--pretraining_tp',
	    default=4,
	    type=int,
	    help='Pretraining TP rank that has been used when training the model in Megatron-LM \n',
	)
	a							   =				parser.parse_args()
	convert_bloom_checkpoint_to_pytorch(
	    args.bloom_checkpoint_path,
	    args.bloom_config_file,
	    args.pytorch_dump_folder_path,
	    args.shard_model,
	    args.pretraining_tp,
	)




