Skip to content

Commit 7684518

Browse files
Merge branch 'main' of https://github.com/huggingface/diffusers into main
2 parents 520bb08 + 9ec5084 commit 7684518

File tree

10 files changed

+1391
-31
lines changed

10 files changed

+1391
-31
lines changed

docs/source/api/pipelines/stable_diffusion.mdx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,10 @@ If you want to use all possible use cases in a single `DiffusionPipeline` you ca
9595
- __call__
9696
- enable_attention_slicing
9797
- disable_attention_slicing
98+
99+
100+
## StableDiffusionUpscalePipeline
101+
[[autodoc]] StableDiffusionUpscalePipeline
102+
- __call__
103+
- enable_attention_slicing
104+
- disable_attention_slicing

src/diffusers/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
StableDiffusionInpaintPipelineLegacy,
7676
StableDiffusionPipeline,
7777
StableDiffusionPipelineSafe,
78+
StableDiffusionUpscalePipeline,
7879
VersatileDiffusionDualGuidedPipeline,
7980
VersatileDiffusionImageVariationPipeline,
8081
VersatileDiffusionPipeline,

src/diffusers/pipeline_utils.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -554,7 +554,9 @@ def load_module(name, value):
554554
init_dict = {k: v for k, v in init_dict.items() if load_module(k, v)}
555555

556556
if len(unused_kwargs) > 0:
557-
logger.warning(f"Keyword arguments {unused_kwargs} not recognized.")
557+
logger.warning(
558+
f"Keyword arguments {unused_kwargs} are not expected by {pipeline_class.__name__} and will be ignored."
559+
)
558560

559561
# import it here to avoid circular import
560562
from diffusers import pipelines
@@ -680,8 +682,8 @@ def load_module(name, value):
680682
@staticmethod
681683
def _get_signature_keys(obj):
682684
parameters = inspect.signature(obj.__init__).parameters
683-
required_parameters = {k: v for k, v in parameters.items() if v.default is not True}
684-
optional_parameters = set({k for k, v in parameters.items() if v.default is True})
685+
required_parameters = {k: v for k, v in parameters.items() if v.default == inspect._empty}
686+
optional_parameters = set({k for k, v in parameters.items() if v.default != inspect._empty})
685687
expected_modules = set(required_parameters.keys()) - set(["self"])
686688
return expected_modules, optional_parameters
687689

src/diffusers/pipelines/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
StableDiffusionInpaintPipeline,
2525
StableDiffusionInpaintPipelineLegacy,
2626
StableDiffusionPipeline,
27+
StableDiffusionUpscalePipeline,
2728
)
2829
from .stable_diffusion_safe import StableDiffusionPipelineSafe
2930
from .versatile_diffusion import (

src/diffusers/pipelines/stable_diffusion/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class StableDiffusionPipelineOutput(BaseOutput):
4040
from .pipeline_stable_diffusion_img2img import StableDiffusionImg2ImgPipeline
4141
from .pipeline_stable_diffusion_inpaint import StableDiffusionInpaintPipeline
4242
from .pipeline_stable_diffusion_inpaint_legacy import StableDiffusionInpaintPipelineLegacy
43+
from .pipeline_stable_diffusion_upscale import StableDiffusionUpscalePipeline
4344
from .safety_checker import StableDiffusionSafetyChecker
4445

4546
if is_transformers_available() and is_torch_available() and is_transformers_version(">=", "4.25.0.dev0"):

src/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_upscale.py

Lines changed: 551 additions & 0 deletions
Large diffs are not rendered by default.

src/diffusers/utils/dummy_torch_and_transformers_objects.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,21 @@ def from_pretrained(cls, *args, **kwargs):
154154
requires_backends(cls, ["torch", "transformers"])
155155

156156

157+
class StableDiffusionUpscalePipeline(metaclass=DummyObject):
158+
_backends = ["torch", "transformers"]
159+
160+
def __init__(self, *args, **kwargs):
161+
requires_backends(self, ["torch", "transformers"])
162+
163+
@classmethod
164+
def from_config(cls, *args, **kwargs):
165+
requires_backends(cls, ["torch", "transformers"])
166+
167+
@classmethod
168+
def from_pretrained(cls, *args, **kwargs):
169+
requires_backends(cls, ["torch", "transformers"])
170+
171+
157172
class VersatileDiffusionDualGuidedPipeline(metaclass=DummyObject):
158173
_backends = ["torch", "transformers"]
159174

tests/pipelines/stable_diffusion_2/test_stable_diffusion.py

Lines changed: 21 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
)
3535
from diffusers.utils import load_numpy, slow, torch_device
3636
from diffusers.utils.testing_utils import CaptureLogger, require_torch_gpu
37-
from transformers import CLIPFeatureExtractor, CLIPTextConfig, CLIPTextModel, CLIPTokenizer
37+
from transformers import CLIPTextConfig, CLIPTextModel, CLIPTokenizer
3838

3939
from ...test_pipelines_common import PipelineTesterMixin
4040

@@ -100,21 +100,6 @@ def dummy_text_encoder(self):
100100
)
101101
return CLIPTextModel(config)
102102

103-
@property
104-
def dummy_extractor(self):
105-
def extract(*args, **kwargs):
106-
class Out:
107-
def __init__(self):
108-
self.pixel_values = torch.ones([0])
109-
110-
def to(self, device):
111-
self.pixel_values.to(device)
112-
return self
113-
114-
return Out()
115-
116-
return extract
117-
118103
def test_save_pretrained_from_pretrained(self):
119104
device = "cpu" # ensure determinism for the device-dependent torch.Generator
120105
unet = self.dummy_cond_unet
@@ -129,7 +114,6 @@ def test_save_pretrained_from_pretrained(self):
129114
vae = self.dummy_vae
130115
bert = self.dummy_text_encoder
131116
tokenizer = CLIPTokenizer.from_pretrained("hf-internal-testing/tiny-random-clip")
132-
feature_extractor = CLIPFeatureExtractor.from_pretrained("hf-internal-testing/tiny-random-clip")
133117

134118
# make sure here that pndm scheduler skips prk
135119
sd_pipe = StableDiffusionPipeline(
@@ -139,7 +123,8 @@ def test_save_pretrained_from_pretrained(self):
139123
text_encoder=bert,
140124
tokenizer=tokenizer,
141125
safety_checker=None,
142-
feature_extractor=feature_extractor,
126+
feature_extractor=None,
127+
requires_safety_checker=False,
143128
)
144129
sd_pipe = sd_pipe.to(device)
145130
sd_pipe.set_progress_bar_config(disable=None)
@@ -185,7 +170,8 @@ def test_stable_diffusion_ddim(self):
185170
text_encoder=bert,
186171
tokenizer=tokenizer,
187172
safety_checker=None,
188-
feature_extractor=self.dummy_extractor,
173+
feature_extractor=None,
174+
requires_safety_checker=False,
189175
)
190176
sd_pipe = sd_pipe.to(device)
191177
sd_pipe.set_progress_bar_config(disable=None)
@@ -231,7 +217,8 @@ def test_stable_diffusion_pndm(self):
231217
text_encoder=bert,
232218
tokenizer=tokenizer,
233219
safety_checker=None,
234-
feature_extractor=self.dummy_extractor,
220+
feature_extractor=None,
221+
requires_safety_checker=False,
235222
)
236223
sd_pipe = sd_pipe.to(device)
237224
sd_pipe.set_progress_bar_config(disable=None)
@@ -276,7 +263,8 @@ def test_stable_diffusion_k_lms(self):
276263
text_encoder=bert,
277264
tokenizer=tokenizer,
278265
safety_checker=None,
279-
feature_extractor=self.dummy_extractor,
266+
feature_extractor=None,
267+
requires_safety_checker=False,
280268
)
281269
sd_pipe = sd_pipe.to(device)
282270
sd_pipe.set_progress_bar_config(disable=None)
@@ -321,7 +309,8 @@ def test_stable_diffusion_k_euler_ancestral(self):
321309
text_encoder=bert,
322310
tokenizer=tokenizer,
323311
safety_checker=None,
324-
feature_extractor=self.dummy_extractor,
312+
feature_extractor=None,
313+
requires_safety_checker=False,
325314
)
326315
sd_pipe = sd_pipe.to(device)
327316
sd_pipe.set_progress_bar_config(disable=None)
@@ -366,7 +355,8 @@ def test_stable_diffusion_k_euler(self):
366355
text_encoder=bert,
367356
tokenizer=tokenizer,
368357
safety_checker=None,
369-
feature_extractor=self.dummy_extractor,
358+
feature_extractor=None,
359+
requires_safety_checker=False,
370360
)
371361
sd_pipe = sd_pipe.to(device)
372362
sd_pipe.set_progress_bar_config(disable=None)
@@ -411,7 +401,8 @@ def test_stable_diffusion_attention_chunk(self):
411401
text_encoder=bert,
412402
tokenizer=tokenizer,
413403
safety_checker=None,
414-
feature_extractor=self.dummy_extractor,
404+
feature_extractor=None,
405+
requires_safety_checker=False,
415406
)
416407
sd_pipe = sd_pipe.to(device)
417408
sd_pipe.set_progress_bar_config(disable=None)
@@ -449,7 +440,8 @@ def test_stable_diffusion_fp16(self):
449440
text_encoder=bert,
450441
tokenizer=tokenizer,
451442
safety_checker=None,
452-
feature_extractor=self.dummy_extractor,
443+
feature_extractor=None,
444+
requires_safety_checker=False,
453445
)
454446
sd_pipe = sd_pipe.to(torch_device)
455447
sd_pipe.set_progress_bar_config(disable=None)
@@ -475,7 +467,8 @@ def test_stable_diffusion_long_prompt(self):
475467
text_encoder=bert,
476468
tokenizer=tokenizer,
477469
safety_checker=None,
478-
feature_extractor=self.dummy_extractor,
470+
feature_extractor=None,
471+
requires_safety_checker=False,
479472
)
480473
sd_pipe = sd_pipe.to(torch_device)
481474
sd_pipe.set_progress_bar_config(disable=None)
@@ -572,7 +565,7 @@ def test_stable_diffusion_k_lms(self):
572565
expected_slice = np.array([0.0548, 0.0626, 0.0612, 0.0611, 0.0706, 0.0586, 0.0843, 0.0333, 0.1197])
573566
assert np.abs(image_slice.flatten() - expected_slice).max() < 1e-2
574567

575-
def test_stable_diffusion_memory_chunking(self):
568+
def test_stable_diffusion_attention_slicing(self):
576569
torch.cuda.reset_peak_memory_stats()
577570
model_id = "stabilityai/stable-diffusion-2-base"
578571
pipe = StableDiffusionPipeline.from_pretrained(model_id, revision="fp16", torch_dtype=torch.float16)
@@ -651,7 +644,7 @@ def test_stable_diffusion_text2img_pipeline_default(self):
651644
prompt = "astronaut riding a horse"
652645

653646
generator = torch.Generator(device=torch_device).manual_seed(0)
654-
output = pipe(prompt=prompt, strength=0.75, guidance_scale=7.5, generator=generator, output_type="np")
647+
output = pipe(prompt=prompt, guidance_scale=7.5, generator=generator, output_type="np")
655648
image = output.images[0]
656649

657650
assert image.shape == (512, 512, 3)

0 commit comments

Comments
 (0)