From cbc10e258b96dafa64523feb942f9cb972e8b724 Mon Sep 17 00:00:00 2001 From: Pham Hong Vinh Date: Tue, 12 May 2026 10:37:35 +0000 Subject: [PATCH 1/4] Fix redundant Z-Image terminal timestep --- .../modular_pipelines/z_image/before_denoise.py | 11 +++++++++-- src/diffusers/pipelines/z_image/pipeline_z_image.py | 7 ++++++- .../pipelines/z_image/pipeline_z_image_controlnet.py | 8 +++++++- .../z_image/pipeline_z_image_controlnet_inpaint.py | 8 +++++++- .../pipelines/z_image/pipeline_z_image_img2img.py | 8 +++++++- .../pipelines/z_image/pipeline_z_image_inpaint.py | 8 +++++++- .../pipelines/z_image/pipeline_z_image_omni.py | 8 +++++++- 7 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/diffusers/modular_pipelines/z_image/before_denoise.py b/src/diffusers/modular_pipelines/z_image/before_denoise.py index 8558f2c67f65..820de47d6335 100644 --- a/src/diffusers/modular_pipelines/z_image/before_denoise.py +++ b/src/diffusers/modular_pipelines/z_image/before_denoise.py @@ -185,6 +185,11 @@ def retrieve_timesteps( return timesteps, num_inference_steps +# Copied from diffusers.pipelines.z_image.pipeline_z_image.get_default_z_image_sigmas +def get_default_z_image_sigmas(num_inference_steps: int) -> list[float]: + return torch.linspace(1.0, 0.0, num_inference_steps + 1)[:-1].tolist() + + class ZImageTextInputStep(ModularPipelineBlocks): model_name = "z-image" @@ -535,13 +540,15 @@ def __call__(self, components: ZImageModularPipeline, state: PipelineState) -> P base_shift=components.scheduler.config.get("base_shift", 0.5), max_shift=components.scheduler.config.get("max_shift", 1.15), ) - components.scheduler.sigma_min = 0.0 + sigmas = block_state.sigmas + if sigmas is None: + sigmas = get_default_z_image_sigmas(block_state.num_inference_steps) block_state.timesteps, block_state.num_inference_steps = retrieve_timesteps( components.scheduler, block_state.num_inference_steps, device, - sigmas=block_state.sigmas, + sigmas=sigmas, mu=mu, ) diff --git a/src/diffusers/pipelines/z_image/pipeline_z_image.py b/src/diffusers/pipelines/z_image/pipeline_z_image.py index 46403a0719cd..67df30425acb 100644 --- a/src/diffusers/pipelines/z_image/pipeline_z_image.py +++ b/src/diffusers/pipelines/z_image/pipeline_z_image.py @@ -134,6 +134,10 @@ def retrieve_timesteps( return timesteps, num_inference_steps +def get_default_z_image_sigmas(num_inference_steps: int) -> list[float]: + return torch.linspace(1.0, 0.0, num_inference_steps + 1)[:-1].tolist() + + class ZImagePipeline(DiffusionPipeline, ZImageLoraLoaderMixin, FromSingleFileMixin): model_cpu_offload_seq = "text_encoder->transformer->vae" _optional_components = [] @@ -474,7 +478,8 @@ def __call__( self.scheduler.config.get("base_shift", 0.5), self.scheduler.config.get("max_shift", 1.15), ) - self.scheduler.sigma_min = 0.0 + if sigmas is None: + sigmas = get_default_z_image_sigmas(num_inference_steps) scheduler_kwargs = {"mu": mu} timesteps, num_inference_steps = retrieve_timesteps( self.scheduler, diff --git a/src/diffusers/pipelines/z_image/pipeline_z_image_controlnet.py b/src/diffusers/pipelines/z_image/pipeline_z_image_controlnet.py index 1e49737bb5b0..38ef711dd09f 100644 --- a/src/diffusers/pipelines/z_image/pipeline_z_image_controlnet.py +++ b/src/diffusers/pipelines/z_image/pipeline_z_image_controlnet.py @@ -185,6 +185,11 @@ def retrieve_timesteps( return timesteps, num_inference_steps +# Copied from diffusers.pipelines.z_image.pipeline_z_image.get_default_z_image_sigmas +def get_default_z_image_sigmas(num_inference_steps: int) -> list[float]: + return torch.linspace(1.0, 0.0, num_inference_steps + 1)[:-1].tolist() + + class ZImageControlNetPipeline(DiffusionPipeline, ZImageLoraLoaderMixin, FromSingleFileMixin): model_cpu_offload_seq = "text_encoder->transformer->vae" _optional_components = [] @@ -593,7 +598,8 @@ def __call__( self.scheduler.config.get("base_shift", 0.5), self.scheduler.config.get("max_shift", 1.15), ) - self.scheduler.sigma_min = 0.0 + if sigmas is None: + sigmas = get_default_z_image_sigmas(num_inference_steps) scheduler_kwargs = {"mu": mu} timesteps, num_inference_steps = retrieve_timesteps( self.scheduler, diff --git a/src/diffusers/pipelines/z_image/pipeline_z_image_controlnet_inpaint.py b/src/diffusers/pipelines/z_image/pipeline_z_image_controlnet_inpaint.py index 09f9b2395458..c2613bede08b 100644 --- a/src/diffusers/pipelines/z_image/pipeline_z_image_controlnet_inpaint.py +++ b/src/diffusers/pipelines/z_image/pipeline_z_image_controlnet_inpaint.py @@ -185,6 +185,11 @@ def retrieve_timesteps( return timesteps, num_inference_steps +# Copied from diffusers.pipelines.z_image.pipeline_z_image.get_default_z_image_sigmas +def get_default_z_image_sigmas(num_inference_steps: int) -> list[float]: + return torch.linspace(1.0, 0.0, num_inference_steps + 1)[:-1].tolist() + + class ZImageControlNetInpaintPipeline(DiffusionPipeline, ZImageLoraLoaderMixin, FromSingleFileMixin): model_cpu_offload_seq = "text_encoder->transformer->vae" _optional_components = [] @@ -615,7 +620,8 @@ def __call__( self.scheduler.config.get("base_shift", 0.5), self.scheduler.config.get("max_shift", 1.15), ) - self.scheduler.sigma_min = 0.0 + if sigmas is None: + sigmas = get_default_z_image_sigmas(num_inference_steps) scheduler_kwargs = {"mu": mu} timesteps, num_inference_steps = retrieve_timesteps( self.scheduler, diff --git a/src/diffusers/pipelines/z_image/pipeline_z_image_img2img.py b/src/diffusers/pipelines/z_image/pipeline_z_image_img2img.py index ee57f51dd957..4ef0e60677bc 100644 --- a/src/diffusers/pipelines/z_image/pipeline_z_image_img2img.py +++ b/src/diffusers/pipelines/z_image/pipeline_z_image_img2img.py @@ -146,6 +146,11 @@ def retrieve_timesteps( return timesteps, num_inference_steps +# Copied from diffusers.pipelines.z_image.pipeline_z_image.get_default_z_image_sigmas +def get_default_z_image_sigmas(num_inference_steps: int) -> list[float]: + return torch.linspace(1.0, 0.0, num_inference_steps + 1)[:-1].tolist() + + class ZImageImg2ImgPipeline(DiffusionPipeline, ZImageLoraLoaderMixin, FromSingleFileMixin): r""" The ZImage pipeline for image-to-image generation. @@ -563,7 +568,8 @@ def __call__( self.scheduler.config.get("base_shift", 0.5), self.scheduler.config.get("max_shift", 1.15), ) - self.scheduler.sigma_min = 0.0 + if sigmas is None: + sigmas = get_default_z_image_sigmas(num_inference_steps) scheduler_kwargs = {"mu": mu} timesteps, num_inference_steps = retrieve_timesteps( self.scheduler, diff --git a/src/diffusers/pipelines/z_image/pipeline_z_image_inpaint.py b/src/diffusers/pipelines/z_image/pipeline_z_image_inpaint.py index e740a48e65ec..4374dd98d217 100644 --- a/src/diffusers/pipelines/z_image/pipeline_z_image_inpaint.py +++ b/src/diffusers/pipelines/z_image/pipeline_z_image_inpaint.py @@ -162,6 +162,11 @@ def retrieve_timesteps( return timesteps, num_inference_steps +# Copied from diffusers.pipelines.z_image.pipeline_z_image.get_default_z_image_sigmas +def get_default_z_image_sigmas(num_inference_steps: int) -> list[float]: + return torch.linspace(1.0, 0.0, num_inference_steps + 1)[:-1].tolist() + + class ZImageInpaintPipeline(DiffusionPipeline, ZImageLoraLoaderMixin, FromSingleFileMixin): r""" The ZImage pipeline for inpainting. @@ -750,7 +755,8 @@ def __call__( self.scheduler.config.get("base_shift", 0.5), self.scheduler.config.get("max_shift", 1.15), ) - self.scheduler.sigma_min = 0.0 + if sigmas is None: + sigmas = get_default_z_image_sigmas(num_inference_steps) scheduler_kwargs = {"mu": mu} timesteps, num_inference_steps = retrieve_timesteps( self.scheduler, diff --git a/src/diffusers/pipelines/z_image/pipeline_z_image_omni.py b/src/diffusers/pipelines/z_image/pipeline_z_image_omni.py index 9199e176a1f6..e5c11cf01e11 100644 --- a/src/diffusers/pipelines/z_image/pipeline_z_image_omni.py +++ b/src/diffusers/pipelines/z_image/pipeline_z_image_omni.py @@ -135,6 +135,11 @@ def retrieve_timesteps( return timesteps, num_inference_steps +# Copied from diffusers.pipelines.z_image.pipeline_z_image.get_default_z_image_sigmas +def get_default_z_image_sigmas(num_inference_steps: int) -> list[float]: + return torch.linspace(1.0, 0.0, num_inference_steps + 1)[:-1].tolist() + + class ZImageOmniPipeline(DiffusionPipeline, ZImageLoraLoaderMixin, FromSingleFileMixin): model_cpu_offload_seq = "text_encoder->transformer->vae" _optional_components = [] @@ -604,7 +609,8 @@ def __call__( self.scheduler.config.get("base_shift", 0.5), self.scheduler.config.get("max_shift", 1.15), ) - self.scheduler.sigma_min = 0.0 + if sigmas is None: + sigmas = get_default_z_image_sigmas(num_inference_steps) scheduler_kwargs = {"mu": mu} timesteps, num_inference_steps = retrieve_timesteps( self.scheduler, From 2c618ec4b8aa1f318a751f3109a345a1ad893263 Mon Sep 17 00:00:00 2001 From: "Vinh H. Pham" Date: Thu, 28 May 2026 15:37:39 +0700 Subject: [PATCH 2/4] Update src/diffusers/modular_pipelines/z_image/before_denoise.py Co-authored-by: dg845 <58458699+dg845@users.noreply.github.com> --- src/diffusers/modular_pipelines/z_image/before_denoise.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/diffusers/modular_pipelines/z_image/before_denoise.py b/src/diffusers/modular_pipelines/z_image/before_denoise.py index 820de47d6335..46f697c18ed0 100644 --- a/src/diffusers/modular_pipelines/z_image/before_denoise.py +++ b/src/diffusers/modular_pipelines/z_image/before_denoise.py @@ -187,7 +187,7 @@ def retrieve_timesteps( # Copied from diffusers.pipelines.z_image.pipeline_z_image.get_default_z_image_sigmas def get_default_z_image_sigmas(num_inference_steps: int) -> list[float]: - return torch.linspace(1.0, 0.0, num_inference_steps + 1)[:-1].tolist() + return torch.linspace(1.0, 1 / num_inference_steps, num_inference_steps).tolist() class ZImageTextInputStep(ModularPipelineBlocks): From d4ce94fceab5db2951087dd8e800ac8a1c8b4939 Mon Sep 17 00:00:00 2001 From: Pham Hong Vinh Date: Thu, 28 May 2026 08:44:53 +0000 Subject: [PATCH 3/4] unify sigmas calculation --- src/diffusers/pipelines/z_image/pipeline_z_image.py | 2 +- src/diffusers/pipelines/z_image/pipeline_z_image_controlnet.py | 2 +- .../pipelines/z_image/pipeline_z_image_controlnet_inpaint.py | 2 +- src/diffusers/pipelines/z_image/pipeline_z_image_img2img.py | 2 +- src/diffusers/pipelines/z_image/pipeline_z_image_inpaint.py | 2 +- src/diffusers/pipelines/z_image/pipeline_z_image_omni.py | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/diffusers/pipelines/z_image/pipeline_z_image.py b/src/diffusers/pipelines/z_image/pipeline_z_image.py index 67df30425acb..8e3aa2b5b110 100644 --- a/src/diffusers/pipelines/z_image/pipeline_z_image.py +++ b/src/diffusers/pipelines/z_image/pipeline_z_image.py @@ -135,7 +135,7 @@ def retrieve_timesteps( def get_default_z_image_sigmas(num_inference_steps: int) -> list[float]: - return torch.linspace(1.0, 0.0, num_inference_steps + 1)[:-1].tolist() + return torch.linspace(1.0, 1 / num_inference_steps, num_inference_steps).tolist() class ZImagePipeline(DiffusionPipeline, ZImageLoraLoaderMixin, FromSingleFileMixin): diff --git a/src/diffusers/pipelines/z_image/pipeline_z_image_controlnet.py b/src/diffusers/pipelines/z_image/pipeline_z_image_controlnet.py index f0e16e6360cd..9ba68a82df76 100644 --- a/src/diffusers/pipelines/z_image/pipeline_z_image_controlnet.py +++ b/src/diffusers/pipelines/z_image/pipeline_z_image_controlnet.py @@ -187,7 +187,7 @@ def retrieve_timesteps( # Copied from diffusers.pipelines.z_image.pipeline_z_image.get_default_z_image_sigmas def get_default_z_image_sigmas(num_inference_steps: int) -> list[float]: - return torch.linspace(1.0, 0.0, num_inference_steps + 1)[:-1].tolist() + return torch.linspace(1.0, 1 / num_inference_steps, num_inference_steps).tolist() class ZImageControlNetPipeline(DiffusionPipeline, ZImageLoraLoaderMixin, FromSingleFileMixin): diff --git a/src/diffusers/pipelines/z_image/pipeline_z_image_controlnet_inpaint.py b/src/diffusers/pipelines/z_image/pipeline_z_image_controlnet_inpaint.py index 9d480ab43b19..178e74dea4fa 100644 --- a/src/diffusers/pipelines/z_image/pipeline_z_image_controlnet_inpaint.py +++ b/src/diffusers/pipelines/z_image/pipeline_z_image_controlnet_inpaint.py @@ -187,7 +187,7 @@ def retrieve_timesteps( # Copied from diffusers.pipelines.z_image.pipeline_z_image.get_default_z_image_sigmas def get_default_z_image_sigmas(num_inference_steps: int) -> list[float]: - return torch.linspace(1.0, 0.0, num_inference_steps + 1)[:-1].tolist() + return torch.linspace(1.0, 1 / num_inference_steps, num_inference_steps).tolist() class ZImageControlNetInpaintPipeline(DiffusionPipeline, ZImageLoraLoaderMixin, FromSingleFileMixin): diff --git a/src/diffusers/pipelines/z_image/pipeline_z_image_img2img.py b/src/diffusers/pipelines/z_image/pipeline_z_image_img2img.py index 4ef0e60677bc..f927f45add97 100644 --- a/src/diffusers/pipelines/z_image/pipeline_z_image_img2img.py +++ b/src/diffusers/pipelines/z_image/pipeline_z_image_img2img.py @@ -148,7 +148,7 @@ def retrieve_timesteps( # Copied from diffusers.pipelines.z_image.pipeline_z_image.get_default_z_image_sigmas def get_default_z_image_sigmas(num_inference_steps: int) -> list[float]: - return torch.linspace(1.0, 0.0, num_inference_steps + 1)[:-1].tolist() + return torch.linspace(1.0, 1 / num_inference_steps, num_inference_steps).tolist() class ZImageImg2ImgPipeline(DiffusionPipeline, ZImageLoraLoaderMixin, FromSingleFileMixin): diff --git a/src/diffusers/pipelines/z_image/pipeline_z_image_inpaint.py b/src/diffusers/pipelines/z_image/pipeline_z_image_inpaint.py index 4374dd98d217..a41f2a11e8a1 100644 --- a/src/diffusers/pipelines/z_image/pipeline_z_image_inpaint.py +++ b/src/diffusers/pipelines/z_image/pipeline_z_image_inpaint.py @@ -164,7 +164,7 @@ def retrieve_timesteps( # Copied from diffusers.pipelines.z_image.pipeline_z_image.get_default_z_image_sigmas def get_default_z_image_sigmas(num_inference_steps: int) -> list[float]: - return torch.linspace(1.0, 0.0, num_inference_steps + 1)[:-1].tolist() + return torch.linspace(1.0, 1 / num_inference_steps, num_inference_steps).tolist() class ZImageInpaintPipeline(DiffusionPipeline, ZImageLoraLoaderMixin, FromSingleFileMixin): diff --git a/src/diffusers/pipelines/z_image/pipeline_z_image_omni.py b/src/diffusers/pipelines/z_image/pipeline_z_image_omni.py index e5c11cf01e11..19b85ac7d134 100644 --- a/src/diffusers/pipelines/z_image/pipeline_z_image_omni.py +++ b/src/diffusers/pipelines/z_image/pipeline_z_image_omni.py @@ -137,7 +137,7 @@ def retrieve_timesteps( # Copied from diffusers.pipelines.z_image.pipeline_z_image.get_default_z_image_sigmas def get_default_z_image_sigmas(num_inference_steps: int) -> list[float]: - return torch.linspace(1.0, 0.0, num_inference_steps + 1)[:-1].tolist() + return torch.linspace(1.0, 1 / num_inference_steps, num_inference_steps).tolist() class ZImageOmniPipeline(DiffusionPipeline, ZImageLoraLoaderMixin, FromSingleFileMixin): From 4501f7ae425fcc627366045b56c379f406aca7e1 Mon Sep 17 00:00:00 2001 From: Pham Hong Vinh Date: Thu, 28 May 2026 09:05:18 +0000 Subject: [PATCH 4/4] update z-image turbo examples --- docs/source/en/api/pipelines/z_image.md | 4 ++-- src/diffusers/modular_pipelines/z_image/before_denoise.py | 2 +- .../modular_pipelines/z_image/modular_blocks_z_image.py | 4 ++-- src/diffusers/pipelines/z_image/pipeline_z_image.py | 2 +- .../pipelines/z_image/pipeline_z_image_controlnet.py | 2 +- src/diffusers/pipelines/z_image/pipeline_z_image_img2img.py | 2 +- src/diffusers/pipelines/z_image/pipeline_z_image_inpaint.py | 2 +- src/diffusers/pipelines/z_image/pipeline_z_image_omni.py | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/source/en/api/pipelines/z_image.md b/docs/source/en/api/pipelines/z_image.md index cf4c1aefb81f..85d926406368 100644 --- a/docs/source/en/api/pipelines/z_image.md +++ b/docs/source/en/api/pipelines/z_image.md @@ -46,7 +46,7 @@ image = pipe( prompt, image=init_image, strength=0.6, - num_inference_steps=9, + num_inference_steps=8, guidance_scale=0.0, generator=torch.Generator("cuda").manual_seed(42), ).images[0] @@ -81,7 +81,7 @@ image = pipe( image=init_image, mask_image=mask_image, strength=1.0, - num_inference_steps=9, + num_inference_steps=8, guidance_scale=0.0, generator=torch.Generator("cuda").manual_seed(42), ).images[0] diff --git a/src/diffusers/modular_pipelines/z_image/before_denoise.py b/src/diffusers/modular_pipelines/z_image/before_denoise.py index 46f697c18ed0..9b6c1976a1bf 100644 --- a/src/diffusers/modular_pipelines/z_image/before_denoise.py +++ b/src/diffusers/modular_pipelines/z_image/before_denoise.py @@ -513,7 +513,7 @@ def description(self) -> str: def inputs(self) -> list[InputParam]: return [ InputParam("latents", required=True), - InputParam("num_inference_steps", default=9), + InputParam("num_inference_steps", default=8), InputParam("sigmas"), ] diff --git a/src/diffusers/modular_pipelines/z_image/modular_blocks_z_image.py b/src/diffusers/modular_pipelines/z_image/modular_blocks_z_image.py index 23e20d55fb1e..1440128a3c55 100644 --- a/src/diffusers/modular_pipelines/z_image/modular_blocks_z_image.py +++ b/src/diffusers/modular_pipelines/z_image/modular_blocks_z_image.py @@ -66,7 +66,7 @@ class ZImageCoreDenoiseStep(SequentialPipelineBlocks): TODO: Add description. generator (`None`, *optional*): TODO: Add description. - num_inference_steps (`None`, *optional*, defaults to 9): + num_inference_steps (`None`, *optional*, defaults to 8): TODO: Add description. sigmas (`None`, *optional*): TODO: Add description. @@ -122,7 +122,7 @@ class ZImageImage2ImageCoreDenoiseStep(SequentialPipelineBlocks): TODO: Add description. generator (`None`, *optional*): TODO: Add description. - num_inference_steps (`None`, *optional*, defaults to 9): + num_inference_steps (`None`, *optional*, defaults to 8): TODO: Add description. sigmas (`None`, *optional*): TODO: Add description. diff --git a/src/diffusers/pipelines/z_image/pipeline_z_image.py b/src/diffusers/pipelines/z_image/pipeline_z_image.py index 8e3aa2b5b110..3e2055c6257f 100644 --- a/src/diffusers/pipelines/z_image/pipeline_z_image.py +++ b/src/diffusers/pipelines/z_image/pipeline_z_image.py @@ -51,7 +51,7 @@ ... prompt, ... height=1024, ... width=1024, - ... num_inference_steps=9, + ... num_inference_steps=8, ... guidance_scale=0.0, ... generator=torch.Generator("cuda").manual_seed(42), ... ).images[0] diff --git a/src/diffusers/pipelines/z_image/pipeline_z_image_controlnet.py b/src/diffusers/pipelines/z_image/pipeline_z_image_controlnet.py index 9ba68a82df76..81373ffb56ff 100644 --- a/src/diffusers/pipelines/z_image/pipeline_z_image_controlnet.py +++ b/src/diffusers/pipelines/z_image/pipeline_z_image_controlnet.py @@ -88,7 +88,7 @@ ... controlnet_conditioning_scale=0.75, ... height=1728, ... width=992, - ... num_inference_steps=9, + ... num_inference_steps=8, ... guidance_scale=0.0, ... generator=torch.Generator("cuda").manual_seed(43), ... ).images[0] diff --git a/src/diffusers/pipelines/z_image/pipeline_z_image_img2img.py b/src/diffusers/pipelines/z_image/pipeline_z_image_img2img.py index f927f45add97..b5c7740bb0c1 100644 --- a/src/diffusers/pipelines/z_image/pipeline_z_image_img2img.py +++ b/src/diffusers/pipelines/z_image/pipeline_z_image_img2img.py @@ -49,7 +49,7 @@ ... prompt, ... image=init_image, ... strength=0.6, - ... num_inference_steps=9, + ... num_inference_steps=8, ... guidance_scale=0.0, ... generator=torch.Generator("cuda").manual_seed(42), ... ).images[0] diff --git a/src/diffusers/pipelines/z_image/pipeline_z_image_inpaint.py b/src/diffusers/pipelines/z_image/pipeline_z_image_inpaint.py index a41f2a11e8a1..132c22c0cff3 100644 --- a/src/diffusers/pipelines/z_image/pipeline_z_image_inpaint.py +++ b/src/diffusers/pipelines/z_image/pipeline_z_image_inpaint.py @@ -65,7 +65,7 @@ ... image=init_image, ... mask_image=mask_image, ... strength=1.0, - ... num_inference_steps=9, + ... num_inference_steps=8, ... guidance_scale=0.0, ... generator=torch.Generator("cuda").manual_seed(42), ... ).images[0] diff --git a/src/diffusers/pipelines/z_image/pipeline_z_image_omni.py b/src/diffusers/pipelines/z_image/pipeline_z_image_omni.py index 19b85ac7d134..50776ceaf34d 100644 --- a/src/diffusers/pipelines/z_image/pipeline_z_image_omni.py +++ b/src/diffusers/pipelines/z_image/pipeline_z_image_omni.py @@ -52,7 +52,7 @@ ... prompt, ... height=1024, ... width=1024, - ... num_inference_steps=9, + ... num_inference_steps=8, ... guidance_scale=0.0, ... generator=torch.Generator("cuda").manual_seed(42), ... ).images[0]