Path: blob/main/tests/schedulers/test_scheduler_ddim.py
1448 views
import torch12from diffusers import DDIMScheduler34from .test_schedulers import SchedulerCommonTest567class DDIMSchedulerTest(SchedulerCommonTest):8scheduler_classes = (DDIMScheduler,)9forward_default_kwargs = (("eta", 0.0), ("num_inference_steps", 50))1011def get_scheduler_config(self, **kwargs):12config = {13"num_train_timesteps": 1000,14"beta_start": 0.0001,15"beta_end": 0.02,16"beta_schedule": "linear",17"clip_sample": True,18}1920config.update(**kwargs)21return config2223def full_loop(self, **config):24scheduler_class = self.scheduler_classes[0]25scheduler_config = self.get_scheduler_config(**config)26scheduler = scheduler_class(**scheduler_config)2728num_inference_steps, eta = 10, 0.02930model = self.dummy_model()31sample = self.dummy_sample_deter3233scheduler.set_timesteps(num_inference_steps)3435for t in scheduler.timesteps:36residual = model(sample, t)37sample = scheduler.step(residual, t, sample, eta).prev_sample3839return sample4041def test_timesteps(self):42for timesteps in [100, 500, 1000]:43self.check_over_configs(num_train_timesteps=timesteps)4445def test_steps_offset(self):46for steps_offset in [0, 1]:47self.check_over_configs(steps_offset=steps_offset)4849scheduler_class = self.scheduler_classes[0]50scheduler_config = self.get_scheduler_config(steps_offset=1)51scheduler = scheduler_class(**scheduler_config)52scheduler.set_timesteps(5)53assert torch.equal(scheduler.timesteps, torch.LongTensor([801, 601, 401, 201, 1]))5455def test_betas(self):56for beta_start, beta_end in zip([0.0001, 0.001, 0.01, 0.1], [0.002, 0.02, 0.2, 2]):57self.check_over_configs(beta_start=beta_start, beta_end=beta_end)5859def test_schedules(self):60for schedule in ["linear", "squaredcos_cap_v2"]:61self.check_over_configs(beta_schedule=schedule)6263def test_prediction_type(self):64for prediction_type in ["epsilon", "v_prediction"]:65self.check_over_configs(prediction_type=prediction_type)6667def test_clip_sample(self):68for clip_sample in [True, False]:69self.check_over_configs(clip_sample=clip_sample)7071def test_thresholding(self):72self.check_over_configs(thresholding=False)73for threshold in [0.5, 1.0, 2.0]:74for prediction_type in ["epsilon", "v_prediction"]:75self.check_over_configs(76thresholding=True,77prediction_type=prediction_type,78sample_max_value=threshold,79)8081def test_time_indices(self):82for t in [1, 10, 49]:83self.check_over_forward(time_step=t)8485def test_inference_steps(self):86for t, num_inference_steps in zip([1, 10, 50], [10, 50, 500]):87self.check_over_forward(time_step=t, num_inference_steps=num_inference_steps)8889def test_eta(self):90for t, eta in zip([1, 10, 49], [0.0, 0.5, 1.0]):91self.check_over_forward(time_step=t, eta=eta)9293def test_variance(self):94scheduler_class = self.scheduler_classes[0]95scheduler_config = self.get_scheduler_config()96scheduler = scheduler_class(**scheduler_config)9798assert torch.sum(torch.abs(scheduler._get_variance(0, 0) - 0.0)) < 1e-599assert torch.sum(torch.abs(scheduler._get_variance(420, 400) - 0.14771)) < 1e-5100assert torch.sum(torch.abs(scheduler._get_variance(980, 960) - 0.32460)) < 1e-5101assert torch.sum(torch.abs(scheduler._get_variance(0, 0) - 0.0)) < 1e-5102assert torch.sum(torch.abs(scheduler._get_variance(487, 486) - 0.00979)) < 1e-5103assert torch.sum(torch.abs(scheduler._get_variance(999, 998) - 0.02)) < 1e-5104105def test_full_loop_no_noise(self):106sample = self.full_loop()107108result_sum = torch.sum(torch.abs(sample))109result_mean = torch.mean(torch.abs(sample))110111assert abs(result_sum.item() - 172.0067) < 1e-2112assert abs(result_mean.item() - 0.223967) < 1e-3113114def test_full_loop_with_v_prediction(self):115sample = self.full_loop(prediction_type="v_prediction")116117result_sum = torch.sum(torch.abs(sample))118result_mean = torch.mean(torch.abs(sample))119120assert abs(result_sum.item() - 52.5302) < 1e-2121assert abs(result_mean.item() - 0.0684) < 1e-3122123def test_full_loop_with_set_alpha_to_one(self):124# We specify different beta, so that the first alpha is 0.99125sample = self.full_loop(set_alpha_to_one=True, beta_start=0.01)126result_sum = torch.sum(torch.abs(sample))127result_mean = torch.mean(torch.abs(sample))128129assert abs(result_sum.item() - 149.8295) < 1e-2130assert abs(result_mean.item() - 0.1951) < 1e-3131132def test_full_loop_with_no_set_alpha_to_one(self):133# We specify different beta, so that the first alpha is 0.99134sample = self.full_loop(set_alpha_to_one=False, beta_start=0.01)135result_sum = torch.sum(torch.abs(sample))136result_mean = torch.mean(torch.abs(sample))137138assert abs(result_sum.item() - 149.0784) < 1e-2139assert abs(result_mean.item() - 0.1941) < 1e-3140141142