
import torch

from accelerate import Accelerator, DistributedType







class 							lowercase						:




							def __enter__(							self):
												if self.enabled:
																	lowercase		      =		self.model.no_sync()
																	self.model_sync_obj.__enter__()

												return self




							def __exit__(							self  ,A__  ,A__  ,A__):
												if self.enabled:
																	# Average all models on exit
																	self._sync_and_avg_model_params()
																	self.model_sync_obj.__exit__(A__  ,A__  ,A__)




							def __init__(							self  ,A__  ,A__  ,A__  ,A__ = True):
												if accelerator.distributed_type not in [
												    DistributedType.NO,
												    DistributedType.MULTI_CPU,
												    DistributedType.MULTI_GPU,
												]:
																	raise NotImplementedError('''LocalSGD is supported only for CPUs and GPUs (no DeepSpeed or MegatronLM)''')
												lowercase		      =		enabled and accelerator.distributed_type != DistributedType.NO
												lowercase		      =		0
												if self.enabled:
																	lowercase		      =		accelerator
																	lowercase		      =		model
																	lowercase		      =		local_sgd_steps




							def 					A__ (							self):
												self.num_steps += 1
												if not self.enabled:
																	return

												if self.num_steps % self.local_sgd_steps == 0:
																	self._sync_and_avg_model_params()





							def 					A__ (							self):
												self.accelerator.wait_for_everyone()
												with self.accelerator.autocast():
																	for param in self.model.parameters():
																						lowercase		      =		self.accelerator.reduce(param.data  ,reduction='''mean''')






import unittest

import torch

from diffusers import DDIMScheduler, TextToVideoZeroPipeline
from diffusers.utils import load_pt, require_torch_gpu, slow

from ..test_pipelines_common import assert_mean_pixel_difference







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




							def 					A__ (							self):
												lowercase		      =		'''runwayml/stable-diffusion-v1-5'''
												lowercase		      =		TextToVideoZeroPipeline.from_pretrained(A__  ,torch_dtype=torch.floataa).to('''cuda''')
												lowercase		      =		DDIMScheduler.from_config(pipe.scheduler.config)
												lowercase		      =		torch.Generator(device='''cuda''').manual_seed(0)

												lowercase		      =		'''A bear is playing a guitar on Times Square'''
												lowercase		      =		pipe(prompt=A__  ,generator=A__).images

												lowercase		      =		load_pt(
												    '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/text-to-video/A bear is playing a guitar on Times Square.pt''')

												assert_mean_pixel_difference(A__  ,A__)




