




import os
import unittest

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


if is_torch_available():
     import torch

     from transformers import GPTaLMHeadModel




@require_torch
@require_sentencepiece
@require_tokenizers
class  __lowerCAmelCase							(				unittest.TestCase):






       @slow
       @unittest.skip("Model is not available."					)
       def        SCREAMING_SNAKE_CASE     ( self:       List[Any]					):
         lowercase     :Dict   						=    "nvidia/megatron-gpt2-345m/"
         if "MYDIR" in os.environ:
           lowercase     :List[str]   						=    os.path.join(os.environ["MYDIR"]							,       _lowerCAmelCase					)
         lowercase     :Optional[int]   						=    GPTaLMHeadModel.from_pretrained(_lowerCAmelCase					)
         model.to(_lowerCAmelCase					)
         model.half()

         lowercase     :Tuple   						=    torch.tensor(
             [[1_01, 71_10, 10_05, 10_56, 20_23, 1_13_33, 1_74_13, 10_29, 1_02]]							,       device=_lowerCAmelCase							,       dtype=torch.long							,       )

         with torch.no_grad():
           lowercase     :List[str]   						=    model(_lowerCAmelCase					).logits

         lowercase     :List[Any]   						=    torch.Size((1, 9, 5_02_57)					)
         self.assertEqual(output.shape							,       _lowerCAmelCase					)

         lowercase     :Union[str, Any]   						=    torch.tensor(
             [
                 4.94_14,
                 -0.29_20,
                 -1.21_48,
                 -4.02_73,
                 -0.51_61,
                 -5.21_09,
                 -1.24_12,
                 -1.83_01,
                 -1.77_34,
                 -4.71_48,
                 -0.23_17,
                 -1.08_11,
                 -2.17_77,
                 0.41_41,
                 -3.79_69,
                 -4.05_86,
                 -2.53_32,
                 -3.38_09,
                 4.38_67,
             ]							,       device=_lowerCAmelCase							,       dtype=torch.half							,       )

         for i in range(19					):
           lowercase						,     lowercase     :List[Any]   						=    8 * i // 17, 27_92 * i  # along the diagonal
           lowercase						,     lowercase     :Union[str, Any]   						=    output[0, r, c], expected_diag[i]
           lowercase     :int   						=    F"row={r} col={c} computed={computed} expected={expected}"
           self.assertAlmostEqual(_lowerCAmelCase							,       _lowerCAmelCase							,       delta=1e-4							,       msg=_lowerCAmelCase					)









import tempfile
import unittest

import torch

from diffusers import UNetaDConditionModel
from diffusers.training_utils import EMAModel
from diffusers.utils.testing_utils import enable_full_determinism, skip_mps, torch_device


enable_full_determinism()




class  __lowerCAmelCase							(				unittest.TestCase):
       _a			       =    '''hf-internal-testing/tiny-stable-diffusion-pipe'''
       _a			       =    1
       _a			       =    77
       _a			       =    32
       _a			       =    4
       _a			       =    _a			       =    64
       _a			       =    torch.manual_seed(0)






       def        SCREAMING_SNAKE_CASE     ( self:       Union[str, Any]							,       _lowerCAmelCase:       int=0.99_99					):
         lowercase     :Optional[int]   						=    UNetaDConditionModel.from_pretrained(self.model_id							,       subfolder="unet"					)
         lowercase     :Union[str, Any]   						=    unet.to(_lowerCAmelCase					)
         lowercase     :Any   						=    EMAModel(unet.parameters()							,       decay=_lowerCAmelCase							,       model_cls=_lowerCAmelCase							,       model_config=unet.config					)
         return unet, ema_unet






       def        SCREAMING_SNAKE_CASE     ( self:       List[str]					):
         lowercase     :Optional[Any]   						=    torch.randn(
             self.batch_size							,       self.num_in_channels							,       self.latent_height							,       self.latent_width							,       generator=self.generator					).to(_lowerCAmelCase					)
         lowercase     :Dict   						=    torch.randint(0							,       10_00							,       size=(self.batch_size,)							,       generator=self.generator					).to(_lowerCAmelCase					)
         lowercase     :List[Any]   						=    torch.randn(
             self.batch_size							,       self.prompt_length							,       self.text_encoder_hidden_dim							,       generator=self.generator					).to(_lowerCAmelCase					)
         return noisy_latents, timesteps, encoder_hidden_states






       def        SCREAMING_SNAKE_CASE     ( self:       Optional[int]							,       _lowerCAmelCase:       Optional[Any]					):
         lowercase     :Any   						=    {}
         for k, param in unet.state_dict().items():
           lowercase     :Optional[int]   						=    torch.randn_like(_lowerCAmelCase					) + (param * torch.randn_like(_lowerCAmelCase					))
           updated_state_dict.update({k: updated_param}					)
         unet.load_state_dict(_lowerCAmelCase					)
         return unet






       def        SCREAMING_SNAKE_CASE     ( self:       int					):
         lowercase						,     lowercase     :List[str]   						=    self.get_models()
         # Take the first (hypothetical) EMA step.
         ema_unet.step(unet.parameters()					)
         assert ema_unet.optimization_step == 1

         # Take two more.
         for _ in range(2					):
           ema_unet.step(unet.parameters()					)
         assert ema_unet.optimization_step == 3






       def        SCREAMING_SNAKE_CASE     ( self:       Any					):
         lowercase						,     lowercase     :str   						=    self.get_models()
         # Since the `unet` is not being updated (i.e., backprop'd)
         # there won't be any difference between the `params` of `unet`
         # and `ema_unet` even if we call `ema_unet.step(unet.parameters())`.
         ema_unet.step(unet.parameters()					)
         lowercase     :Tuple   						=    list(unet.parameters()					)
         for s_param, param in zip(ema_unet.shadow_params							,       _lowerCAmelCase					):
           assert torch.allclose(_lowerCAmelCase							,       _lowerCAmelCase					)

         # The above holds true even if we call `ema.step()` multiple times since
         # `unet` params are still not being updated.
         for _ in range(4					):
           ema_unet.step(unet.parameters()					)
         for s_param, param in zip(ema_unet.shadow_params							,       _lowerCAmelCase					):
           assert torch.allclose(_lowerCAmelCase							,       _lowerCAmelCase					)






       def        SCREAMING_SNAKE_CASE     ( self:       Dict					):
         lowercase						,     lowercase     :Optional[int]   						=    self.get_models()
         # Here we simulate the parameter updates for `unet`. Since there might
         # be some parameters which are initialized to zero we take extra care to
         # initialize their values to something non-zero before the multiplication.
         lowercase     :List[str]   						=    self.simulate_backprop(_lowerCAmelCase					)

         # Take the EMA step.
         ema_unet.step(unet_pseudo_updated_step_one.parameters()					)

         # Now the EMA'd parameters won't be equal to the original model parameters.
         lowercase     :str   						=    list(unet_pseudo_updated_step_one.parameters()					)
         for s_param, param in zip(ema_unet.shadow_params							,       _lowerCAmelCase					):
           assert ~torch.allclose(_lowerCAmelCase							,       _lowerCAmelCase					)

         # Ensure this is the case when we take multiple EMA steps.
         for _ in range(4					):
           ema_unet.step(unet.parameters()					)
         for s_param, param in zip(ema_unet.shadow_params							,       _lowerCAmelCase					):
           assert ~torch.allclose(_lowerCAmelCase							,       _lowerCAmelCase					)






       def        SCREAMING_SNAKE_CASE     ( self:       Optional[int]					):
         # If we call EMA step after a backpropagation consecutively for two times,
         # the shadow params from those two steps should be different.
         lowercase						,     lowercase     :Optional[Any]   						=    self.get_models()

         # First backprop + EMA
         lowercase     :Union[str, Any]   						=    self.simulate_backprop(_lowerCAmelCase					)
         ema_unet.step(unet_step_one.parameters()					)
         lowercase     :int   						=    ema_unet.shadow_params

         # Second backprop + EMA
         lowercase     :Optional[int]   						=    self.simulate_backprop(_lowerCAmelCase					)
         ema_unet.step(unet_step_two.parameters()					)
         lowercase     :Optional[int]   						=    ema_unet.shadow_params

         for step_one, step_two in zip(_lowerCAmelCase							,       _lowerCAmelCase					):
           assert ~torch.allclose(_lowerCAmelCase							,       _lowerCAmelCase					)






       def        SCREAMING_SNAKE_CASE     ( self:       Union[str, Any]					):
         # If there's no decay even if there are backprops, EMA steps
         # won't take any effect i.e., the shadow params would remain the
         # same.
         lowercase						,     lowercase     :Any   						=    self.get_models(decay=0.0					)
         lowercase     :List[Any]   						=    self.simulate_backprop(_lowerCAmelCase					)
         ema_unet.step(unet_step_one.parameters()					)
         lowercase     :List[str]   						=    ema_unet.shadow_params

         lowercase     :str   						=    self.simulate_backprop(_lowerCAmelCase					)
         ema_unet.step(unet_step_two.parameters()					)
         lowercase     :List[str]   						=    ema_unet.shadow_params

         for step_one, step_two in zip(_lowerCAmelCase							,       _lowerCAmelCase					):
           assert torch.allclose(_lowerCAmelCase							,       _lowerCAmelCase					)






       @skip_mps
       def        SCREAMING_SNAKE_CASE     ( self:       List[Any]					):
         lowercase						,     lowercase     :Optional[Any]   						=    self.get_models()
         lowercase						,     lowercase						,     lowercase     :str   						=    self.get_dummy_inputs()

         with tempfile.TemporaryDirectory() as tmpdir:
           ema_unet.save_pretrained(_lowerCAmelCase					)
           lowercase     :Optional[int]   						=    UNetaDConditionModel.from_pretrained(_lowerCAmelCase							,       model_cls=_lowerCAmelCase					)
           lowercase     :Tuple   						=    loaded_unet.to(unet.device					)

         # Since no EMA step has been performed the outputs should match.
         lowercase     :Dict   						=    unet(_lowerCAmelCase							,       _lowerCAmelCase							,       _lowerCAmelCase					).sample
         lowercase     :Any   						=    loaded_unet(_lowerCAmelCase							,       _lowerCAmelCase							,       _lowerCAmelCase					).sample

         assert torch.allclose(_lowerCAmelCase							,       _lowerCAmelCase							,       atol=1e-4					)



