Skip to content

Commit 32ecbe3

Browse files
rootonchairdg845
andauthored
Fix redundant Z-Image terminal timestep (#13730)
* Fix redundant Z-Image terminal timestep * Update src/diffusers/modular_pipelines/z_image/before_denoise.py Co-authored-by: dg845 <58458699+dg845@users.noreply.github.com> * unify sigmas calculation * update z-image turbo examples --------- Co-authored-by: dg845 <58458699+dg845@users.noreply.github.com>
1 parent e3fc602 commit 32ecbe3

9 files changed

Lines changed: 60 additions & 18 deletions

File tree

docs/source/en/api/pipelines/z_image.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ image = pipe(
4646
prompt,
4747
image=init_image,
4848
strength=0.6,
49-
num_inference_steps=9,
49+
num_inference_steps=8,
5050
guidance_scale=0.0,
5151
generator=torch.Generator("cuda").manual_seed(42),
5252
).images[0]
@@ -81,7 +81,7 @@ image = pipe(
8181
image=init_image,
8282
mask_image=mask_image,
8383
strength=1.0,
84-
num_inference_steps=9,
84+
num_inference_steps=8,
8585
guidance_scale=0.0,
8686
generator=torch.Generator("cuda").manual_seed(42),
8787
).images[0]

src/diffusers/modular_pipelines/z_image/before_denoise.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,11 @@ def retrieve_timesteps(
185185
return timesteps, num_inference_steps
186186

187187

188+
# Copied from diffusers.pipelines.z_image.pipeline_z_image.get_default_z_image_sigmas
189+
def get_default_z_image_sigmas(num_inference_steps: int) -> list[float]:
190+
return torch.linspace(1.0, 1 / num_inference_steps, num_inference_steps).tolist()
191+
192+
188193
class ZImageTextInputStep(ModularPipelineBlocks):
189194
model_name = "z-image"
190195

@@ -508,7 +513,7 @@ def description(self) -> str:
508513
def inputs(self) -> list[InputParam]:
509514
return [
510515
InputParam("latents", required=True),
511-
InputParam("num_inference_steps", default=9),
516+
InputParam("num_inference_steps", default=8),
512517
InputParam("sigmas"),
513518
]
514519

@@ -535,13 +540,15 @@ def __call__(self, components: ZImageModularPipeline, state: PipelineState) -> P
535540
base_shift=components.scheduler.config.get("base_shift", 0.5),
536541
max_shift=components.scheduler.config.get("max_shift", 1.15),
537542
)
538-
components.scheduler.sigma_min = 0.0
543+
sigmas = block_state.sigmas
544+
if sigmas is None:
545+
sigmas = get_default_z_image_sigmas(block_state.num_inference_steps)
539546

540547
block_state.timesteps, block_state.num_inference_steps = retrieve_timesteps(
541548
components.scheduler,
542549
block_state.num_inference_steps,
543550
device,
544-
sigmas=block_state.sigmas,
551+
sigmas=sigmas,
545552
mu=mu,
546553
)
547554

src/diffusers/modular_pipelines/z_image/modular_blocks_z_image.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class ZImageCoreDenoiseStep(SequentialPipelineBlocks):
6666
TODO: Add description.
6767
generator (`None`, *optional*):
6868
TODO: Add description.
69-
num_inference_steps (`None`, *optional*, defaults to 9):
69+
num_inference_steps (`None`, *optional*, defaults to 8):
7070
TODO: Add description.
7171
sigmas (`None`, *optional*):
7272
TODO: Add description.
@@ -122,7 +122,7 @@ class ZImageImage2ImageCoreDenoiseStep(SequentialPipelineBlocks):
122122
TODO: Add description.
123123
generator (`None`, *optional*):
124124
TODO: Add description.
125-
num_inference_steps (`None`, *optional*, defaults to 9):
125+
num_inference_steps (`None`, *optional*, defaults to 8):
126126
TODO: Add description.
127127
sigmas (`None`, *optional*):
128128
TODO: Add description.

src/diffusers/pipelines/z_image/pipeline_z_image.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
... prompt,
5252
... height=1024,
5353
... width=1024,
54-
... num_inference_steps=9,
54+
... num_inference_steps=8,
5555
... guidance_scale=0.0,
5656
... generator=torch.Generator("cuda").manual_seed(42),
5757
... ).images[0]
@@ -134,6 +134,10 @@ def retrieve_timesteps(
134134
return timesteps, num_inference_steps
135135

136136

137+
def get_default_z_image_sigmas(num_inference_steps: int) -> list[float]:
138+
return torch.linspace(1.0, 1 / num_inference_steps, num_inference_steps).tolist()
139+
140+
137141
class ZImagePipeline(DiffusionPipeline, ZImageLoraLoaderMixin, FromSingleFileMixin):
138142
model_cpu_offload_seq = "text_encoder->transformer->vae"
139143
_optional_components = []
@@ -474,7 +478,8 @@ def __call__(
474478
self.scheduler.config.get("base_shift", 0.5),
475479
self.scheduler.config.get("max_shift", 1.15),
476480
)
477-
self.scheduler.sigma_min = 0.0
481+
if sigmas is None:
482+
sigmas = get_default_z_image_sigmas(num_inference_steps)
478483
scheduler_kwargs = {"mu": mu}
479484
timesteps, num_inference_steps = retrieve_timesteps(
480485
self.scheduler,

src/diffusers/pipelines/z_image/pipeline_z_image_controlnet.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@
8888
... controlnet_conditioning_scale=0.75,
8989
... height=1728,
9090
... width=992,
91-
... num_inference_steps=9,
91+
... num_inference_steps=8,
9292
... guidance_scale=0.0,
9393
... generator=torch.Generator("cuda").manual_seed(43),
9494
... ).images[0]
@@ -185,6 +185,11 @@ def retrieve_timesteps(
185185
return timesteps, num_inference_steps
186186

187187

188+
# Copied from diffusers.pipelines.z_image.pipeline_z_image.get_default_z_image_sigmas
189+
def get_default_z_image_sigmas(num_inference_steps: int) -> list[float]:
190+
return torch.linspace(1.0, 1 / num_inference_steps, num_inference_steps).tolist()
191+
192+
188193
class ZImageControlNetPipeline(DiffusionPipeline, ZImageLoraLoaderMixin, FromSingleFileMixin):
189194
model_cpu_offload_seq = "text_encoder->transformer->vae"
190195
_optional_components = []
@@ -601,7 +606,8 @@ def __call__(
601606
self.scheduler.config.get("base_shift", 0.5),
602607
self.scheduler.config.get("max_shift", 1.15),
603608
)
604-
self.scheduler.sigma_min = 0.0
609+
if sigmas is None:
610+
sigmas = get_default_z_image_sigmas(num_inference_steps)
605611
scheduler_kwargs = {"mu": mu}
606612
timesteps, num_inference_steps = retrieve_timesteps(
607613
self.scheduler,

src/diffusers/pipelines/z_image/pipeline_z_image_controlnet_inpaint.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,11 @@ def retrieve_timesteps(
185185
return timesteps, num_inference_steps
186186

187187

188+
# Copied from diffusers.pipelines.z_image.pipeline_z_image.get_default_z_image_sigmas
189+
def get_default_z_image_sigmas(num_inference_steps: int) -> list[float]:
190+
return torch.linspace(1.0, 1 / num_inference_steps, num_inference_steps).tolist()
191+
192+
188193
class ZImageControlNetInpaintPipeline(DiffusionPipeline, ZImageLoraLoaderMixin, FromSingleFileMixin):
189194
model_cpu_offload_seq = "text_encoder->transformer->vae"
190195
_optional_components = []
@@ -628,7 +633,8 @@ def __call__(
628633
self.scheduler.config.get("base_shift", 0.5),
629634
self.scheduler.config.get("max_shift", 1.15),
630635
)
631-
self.scheduler.sigma_min = 0.0
636+
if sigmas is None:
637+
sigmas = get_default_z_image_sigmas(num_inference_steps)
632638
scheduler_kwargs = {"mu": mu}
633639
timesteps, num_inference_steps = retrieve_timesteps(
634640
self.scheduler,

src/diffusers/pipelines/z_image/pipeline_z_image_img2img.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
... prompt,
5050
... image=init_image,
5151
... strength=0.6,
52-
... num_inference_steps=9,
52+
... num_inference_steps=8,
5353
... guidance_scale=0.0,
5454
... generator=torch.Generator("cuda").manual_seed(42),
5555
... ).images[0]
@@ -146,6 +146,11 @@ def retrieve_timesteps(
146146
return timesteps, num_inference_steps
147147

148148

149+
# Copied from diffusers.pipelines.z_image.pipeline_z_image.get_default_z_image_sigmas
150+
def get_default_z_image_sigmas(num_inference_steps: int) -> list[float]:
151+
return torch.linspace(1.0, 1 / num_inference_steps, num_inference_steps).tolist()
152+
153+
149154
class ZImageImg2ImgPipeline(DiffusionPipeline, ZImageLoraLoaderMixin, FromSingleFileMixin):
150155
r"""
151156
The ZImage pipeline for image-to-image generation.
@@ -563,7 +568,8 @@ def __call__(
563568
self.scheduler.config.get("base_shift", 0.5),
564569
self.scheduler.config.get("max_shift", 1.15),
565570
)
566-
self.scheduler.sigma_min = 0.0
571+
if sigmas is None:
572+
sigmas = get_default_z_image_sigmas(num_inference_steps)
567573
scheduler_kwargs = {"mu": mu}
568574
timesteps, num_inference_steps = retrieve_timesteps(
569575
self.scheduler,

src/diffusers/pipelines/z_image/pipeline_z_image_inpaint.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
... image=init_image,
6666
... mask_image=mask_image,
6767
... strength=1.0,
68-
... num_inference_steps=9,
68+
... num_inference_steps=8,
6969
... guidance_scale=0.0,
7070
... generator=torch.Generator("cuda").manual_seed(42),
7171
... ).images[0]
@@ -162,6 +162,11 @@ def retrieve_timesteps(
162162
return timesteps, num_inference_steps
163163

164164

165+
# Copied from diffusers.pipelines.z_image.pipeline_z_image.get_default_z_image_sigmas
166+
def get_default_z_image_sigmas(num_inference_steps: int) -> list[float]:
167+
return torch.linspace(1.0, 1 / num_inference_steps, num_inference_steps).tolist()
168+
169+
165170
class ZImageInpaintPipeline(DiffusionPipeline, ZImageLoraLoaderMixin, FromSingleFileMixin):
166171
r"""
167172
The ZImage pipeline for inpainting.
@@ -750,7 +755,8 @@ def __call__(
750755
self.scheduler.config.get("base_shift", 0.5),
751756
self.scheduler.config.get("max_shift", 1.15),
752757
)
753-
self.scheduler.sigma_min = 0.0
758+
if sigmas is None:
759+
sigmas = get_default_z_image_sigmas(num_inference_steps)
754760
scheduler_kwargs = {"mu": mu}
755761
timesteps, num_inference_steps = retrieve_timesteps(
756762
self.scheduler,

src/diffusers/pipelines/z_image/pipeline_z_image_omni.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
... prompt,
5353
... height=1024,
5454
... width=1024,
55-
... num_inference_steps=9,
55+
... num_inference_steps=8,
5656
... guidance_scale=0.0,
5757
... generator=torch.Generator("cuda").manual_seed(42),
5858
... ).images[0]
@@ -135,6 +135,11 @@ def retrieve_timesteps(
135135
return timesteps, num_inference_steps
136136

137137

138+
# Copied from diffusers.pipelines.z_image.pipeline_z_image.get_default_z_image_sigmas
139+
def get_default_z_image_sigmas(num_inference_steps: int) -> list[float]:
140+
return torch.linspace(1.0, 1 / num_inference_steps, num_inference_steps).tolist()
141+
142+
138143
class ZImageOmniPipeline(DiffusionPipeline, ZImageLoraLoaderMixin, FromSingleFileMixin):
139144
model_cpu_offload_seq = "text_encoder->transformer->vae"
140145
_optional_components = []
@@ -604,7 +609,8 @@ def __call__(
604609
self.scheduler.config.get("base_shift", 0.5),
605610
self.scheduler.config.get("max_shift", 1.15),
606611
)
607-
self.scheduler.sigma_min = 0.0
612+
if sigmas is None:
613+
sigmas = get_default_z_image_sigmas(num_inference_steps)
608614
scheduler_kwargs = {"mu": mu}
609615
timesteps, num_inference_steps = retrieve_timesteps(
610616
self.scheduler,

0 commit comments

Comments
 (0)