





import importlib.util
import json
import os
import warnings
from dataclasses import dataclass, field

import torch

from ..training_args import TrainingArguments
from ..utils import cached_property, is_sagemaker_dp_enabled, logging


_snake_case  :   Dict						   =  logging.get_logger(__name__)

def   a_   (			):
   __lowerCAmelCase							     =     os.getenv('SM_HP_MP_PARAMETERS',     '{}'     )
   try:
      # Parse it and check the field "partitions" is included, it is required for model parallel.
      __lowerCAmelCase							     =     json.loads(_A     )
      if "partitions" not in smp_options:
         return False
   except json.JSONDecodeError:
      return False

   # Get the sagemaker specific framework parameters from mpi_options variable.
   __lowerCAmelCase							     =     os.getenv('SM_FRAMEWORK_PARAMS',     '{}'     )
   try:
      # Parse it and check the field "sagemaker_distributed_dataparallel_enabled".
      __lowerCAmelCase							     =     json.loads(_A     )
      if not mpi_options.get('sagemaker_mpi_enabled',     _A     ):
         return False
   except json.JSONDecodeError:
      return False
   # Lastly, check if the `smdistributed` module is present.
   return importlib.util.find_spec('smdistributed'     ) is not None


if is_sagemaker_model_parallel_available():
 import smdistributed.modelparallel.torch as smp

 smp.init()




@dataclass
class     _UpperCAmelCase   (   SCREAMING_SNAKE_CASE_   ):

  """simple docstring"""


  a_      =			field(
      default=""""""		,   metadata={"""help""": """Used by the SageMaker launcher to send mp-specific args. Ignored in SageMakerTrainer"""}		,   )






  def     lowercase		(    self			:		List[str]					)							->						Dict:
     super().__post_init__()
     warnings.warn(
         '`SageMakerTrainingArguments` is deprecated and will be removed in v5 of Transformers. You can use '
         '`TrainingArguments` instead.' ,  snake_case__ ,  )






  @cached_property
  def     lowercase		(    self			:		str					)							->						int:
     logger.info('PyTorch: setting up devices'					)
     if torch.distributed.is_available() and torch.distributed.is_initialized() and self.local_rank == -1:
        logger.warning(
            'torch.distributed process group is initialized, but local_rank == -1. '
            'In order to use Torch DDP, launch your script with `python -m torch.distributed.launch'					)
     if self.no_cuda:
        __lowerCAmelCase							     =     torch.device('cpu'					)
        __lowerCAmelCase							     =     0
     elif is_sagemaker_model_parallel_available():
        __lowerCAmelCase							     =     smp.local_rank()
        __lowerCAmelCase							     =     torch.device('cuda' ,  snake_case__					)
        __lowerCAmelCase							     =     1
     elif is_sagemaker_dp_enabled():
        import smdistributed.dataparallel.torch.torch_smddp  # noqa: F401

        torch.distributed.init_process_group(backend='smddp' ,  timeout=self.ddp_timeout_delta					)
        __lowerCAmelCase							     =     int(os.getenv('SMDATAPARALLEL_LOCAL_RANK'					)					)
        __lowerCAmelCase							     =     torch.device('cuda' ,  self.local_rank					)
        __lowerCAmelCase							     =     1
     elif self.local_rank == -1:
        # if n_gpu is > 1 we'll use nn.DataParallel.
        # If you only want to use a specific subset of GPUs use `CUDA_VISIBLE_DEVICES=0`
        # Explicitly set CUDA to the first (index 0) CUDA device, otherwise `set_device` will
        # trigger an error that a device index is missing. Index 0 takes into account the
        # GPUs available in the environment, so `CUDA_VISIBLE_DEVICES=1,2` with `cuda:0`
        # will use the first GPU in that env, i.e. GPU#1
        __lowerCAmelCase							     =     torch.device('cuda:0' if torch.cuda.is_available() else 'cpu'					)
        # Sometimes the line in the postinit has not been run before we end up here, so just checking we're not at
        # the default value.
        __lowerCAmelCase							     =     torch.cuda.device_count()
     else:
        # Here, we'll use torch.distributed.
        # Initializes the distributed backend which will take care of synchronizing nodes/GPUs
        if not torch.distributed.is_initialized():
           torch.distributed.init_process_group(backend='nccl' ,  timeout=self.ddp_timeout_delta					)
        __lowerCAmelCase							     =     torch.device('cuda' ,  self.local_rank					)
        __lowerCAmelCase							     =     1

     if device.type == "cuda":
        torch.cuda.set_device(snake_case__					)

     return device






  @property
  def     lowercase		(    self			:		List[Any]					)							->						Optional[int]:

     if is_sagemaker_model_parallel_available():
        return smp.dp_size()

     return super().world_size






  @property
  def     lowercase		(    self			:		List[Any]					)							->						List[str]:
     return not is_sagemaker_model_parallel_available()






  @property
  def     lowercase		(    self			:		Dict					)							->						Optional[Any]:
     return False








import gc
import unittest

import numpy as np
import torch

from diffusers import DanceDiffusionPipeline, IPNDMScheduler, UNetaDModel
from diffusers.utils import slow, torch_device
from diffusers.utils.testing_utils import enable_full_determinism, require_torch_gpu, skip_mps

from ..pipeline_params import UNCONDITIONAL_AUDIO_GENERATION_BATCH_PARAMS, UNCONDITIONAL_AUDIO_GENERATION_PARAMS
from ..test_pipelines_common import PipelineTesterMixin


enable_full_determinism()



class     _UpperCAmelCase   (   _UpperCamelCase		,   unittest.TestCase   ):

  """simple docstring"""


  a_      =			DanceDiffusionPipeline
  a_      =			UNCONDITIONAL_AUDIO_GENERATION_PARAMS
  a_      =			PipelineTesterMixin.required_optional_params - {
      """callback""",
      """latents""",
      """callback_steps""",
      """output_type""",
      """num_images_per_prompt""",
  }
  a_      =			UNCONDITIONAL_AUDIO_GENERATION_BATCH_PARAMS
  a_      =			False
  a_      =			False






  def     lowercase		(    self			:		List[Any]					)							->						Dict:
     torch.manual_seed(0					)
     __lowerCAmelCase							     =     UNetaDModel(
         block_out_channels=(3_2, 3_2, 6_4) ,  extra_in_channels=1_6 ,  sample_size=5_1_2 ,  sample_rate=1_6_0_0_0 ,  in_channels=2 ,  out_channels=2 ,  flip_sin_to_cos=lowerCAmelCase_ ,  use_timestep_embedding=lowerCAmelCase_ ,  time_embedding_type='fourier' ,  mid_block_type='UNetMidBlock1D' ,  down_block_types=('DownBlock1DNoSkip', 'DownBlock1D', 'AttnDownBlock1D') ,  up_block_types=('AttnUpBlock1D', 'UpBlock1D', 'UpBlock1DNoSkip') ,  )
     __lowerCAmelCase							     =     IPNDMScheduler()

     __lowerCAmelCase							     =     {
         'unet': unet,
         'scheduler': scheduler,
     }
     return components






  def     lowercase		(    self			:		Tuple ,  lowerCAmelCase_			:		Tuple ,  lowerCAmelCase_			:		List[str]=0					)							->						Any:
     if str(lowerCAmelCase_					).startswith('mps'					):
        __lowerCAmelCase							     =     torch.manual_seed(lowerCAmelCase_					)
     else:
        __lowerCAmelCase							     =     torch.Generator(device=lowerCAmelCase_					).manual_seed(lowerCAmelCase_					)
     __lowerCAmelCase							     =     {
         'batch_size': 1,
         'generator': generator,
         'num_inference_steps': 4,
     }
     return inputs






  def     lowercase		(    self			:		Union[str, Any]					)							->						int:
     __lowerCAmelCase							     =     'cpu'  # ensure determinism for the device-dependent torch.Generator
     __lowerCAmelCase							     =     self.get_dummy_components()
     __lowerCAmelCase							     =     DanceDiffusionPipeline(**lowerCAmelCase_					)
     __lowerCAmelCase							     =     pipe.to(lowerCAmelCase_					)
     pipe.set_progress_bar_config(disable=lowerCAmelCase_					)

     __lowerCAmelCase							     =     self.get_dummy_inputs(lowerCAmelCase_					)
     __lowerCAmelCase							     =     pipe(**lowerCAmelCase_					)
     __lowerCAmelCase							     =     output.audios

     __lowerCAmelCase							     =     audio[0, -3:, -3:]

     assert audio.shape == (1, 2, components["unet"].sample_size)
     __lowerCAmelCase							     =     np.array([-0.72_65, 1.00_00, -0.83_88, 0.11_75, 0.94_98, -1.00_00]					)
     assert np.abs(audio_slice.flatten() - expected_slice					).max() < 1e-2






  @skip_mps
  def     lowercase		(    self			:		Union[str, Any]					)							->						Tuple:
     return super().test_save_load_local()






  @skip_mps
  def     lowercase		(    self			:		List[str]					)							->						Dict:
     return super().test_dict_tuple_outputs_equivalent(expected_max_difference=3e-3					)






  @skip_mps
  def     lowercase		(    self			:		str					)							->						List[str]:
     return super().test_save_load_optional_components()






  @skip_mps
  def     lowercase		(    self			:		List[Any]					)							->						List[str]:
     return super().test_attention_slicing_forward_pass()






  def     lowercase		(    self			:		str					)							->						int:
     super().test_inference_batch_single_identical(expected_max_diff=3e-3					)





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

  """simple docstring"""


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






  def     lowercase		(    self			:		List[str]					)							->						List[str]:
     __lowerCAmelCase							     =     torch_device

     __lowerCAmelCase							     =     DanceDiffusionPipeline.from_pretrained('harmonai/maestro-150k'					)
     __lowerCAmelCase							     =     pipe.to(lowerCAmelCase_					)
     pipe.set_progress_bar_config(disable=lowerCAmelCase_					)

     __lowerCAmelCase							     =     torch.manual_seed(0					)
     __lowerCAmelCase							     =     pipe(generator=lowerCAmelCase_ ,  num_inference_steps=1_0_0 ,  audio_length_in_s=4.0_96					)
     __lowerCAmelCase							     =     output.audios

     __lowerCAmelCase							     =     audio[0, -3:, -3:]

     assert audio.shape == (1, 2, pipe.unet.sample_size)
     __lowerCAmelCase							     =     np.array([-0.01_92, -0.02_31, -0.03_18, -0.00_59, 0.00_02, -0.00_20]					)

     assert np.abs(audio_slice.flatten() - expected_slice					).max() < 1e-2






  def     lowercase		(    self			:		Tuple					)							->						Dict:
     __lowerCAmelCase							     =     torch_device

     __lowerCAmelCase							     =     DanceDiffusionPipeline.from_pretrained('harmonai/maestro-150k' ,  torch_dtype=torch.floataa					)
     __lowerCAmelCase							     =     pipe.to(lowerCAmelCase_					)
     pipe.set_progress_bar_config(disable=lowerCAmelCase_					)

     __lowerCAmelCase							     =     torch.manual_seed(0					)
     __lowerCAmelCase							     =     pipe(generator=lowerCAmelCase_ ,  num_inference_steps=1_0_0 ,  audio_length_in_s=4.0_96					)
     __lowerCAmelCase							     =     output.audios

     __lowerCAmelCase							     =     audio[0, -3:, -3:]

     assert audio.shape == (1, 2, pipe.unet.sample_size)
     __lowerCAmelCase							     =     np.array([-0.03_67, -0.04_88, -0.07_71, -0.05_25, -0.04_44, -0.03_41]					)

     assert np.abs(audio_slice.flatten() - expected_slice					).max() < 1e-2

