From eb382fa3b0870c49648a5327c07c2a322a47bfa9 Mon Sep 17 00:00:00 2001 From: David Mo Date: Thu, 15 Jan 2026 14:31:00 +0800 Subject: [PATCH 01/23] z-image support npu --- .../transformers/transformer_z_image.py | 62 ++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/src/diffusers/models/transformers/transformer_z_image.py b/src/diffusers/models/transformers/transformer_z_image.py index 5983c34ab640..5afa6bb5b49f 100644 --- a/src/diffusers/models/transformers/transformer_z_image.py +++ b/src/diffusers/models/transformers/transformer_z_image.py @@ -28,6 +28,7 @@ from ...utils.torch_utils import maybe_allow_in_graph from ..attention_dispatch import dispatch_attention_fn from ..modeling_outputs import Transformer2DModelOutput +from ...utils import is_torch_npu_available ADALN_EMBED_DIM = 256 @@ -311,6 +312,62 @@ def forward(self, x, c=None, noise_mask=None, c_noisy=None, c_clean=None): return x +class RopeEmbedderNPU: + def __init__( + self, + theta: float = 256.0, + axes_dims: List[int] = (16, 56, 56), + axes_lens: List[int] = (64, 128, 128), + ): + self.theta = theta + self.axes_dims = axes_dims + self.axes_lens = axes_lens + assert len(axes_dims) == len(axes_lens), "axes_dims and axes_lens must have the same length" + self.freqs_cis = None + self.freqs_real = None + self.freqs_imag = None + + @staticmethod + def precompute_freqs_cis(dim: List[int], end: List[int], theta: float = 256.0): + with torch.device("cpu"): + freqs_real_list = [] + freqs_imag_list = [] + for i, (d, e) in enumerate(zip(dim, end)): + freqs = 1.0 / (theta ** (torch.arange(0, d, 2, dtype=torch.float64, device="cpu") / d)) + timestep = torch.arange(e, device=freqs.device, dtype=torch.float64) + freqs = torch.outer(timestep, freqs).float() + freqs_real = torch.cos(freqs) + freqs_imag = torch.sin(freqs) + freqs_real_list.append(freqs_real.to(torch.float32)) + freqs_imag_list.append(freqs_imag.to(torch.float32)) + + return freqs_real_list, freqs_imag_list + + def __call__(self, ids: torch.Tensor): + assert ids.ndim == 2 + assert ids.shape[-1] == len(self.axes_dims) + device = ids.device + + if self.freqs_real is None or self.freqs_imag is None: + freqs_real, freqs_imag = self.precompute_freqs_cis(self.axes_dims, self.axes_lens, theta=self.theta) + self.freqs_real = [fr.to(device) for fr in freqs_real] + self.freqs_imag = [fi.to(device) for fi in freqs_imag] + else: + # Ensure freqs_cis are on the same device as ids + if self.freqs_real[0].device != device: + self.freqs_real = [fr.to(device) for fr in freqs_real] + self.freqs_imag = [fi.to(device) for fi in freqs_imag] + + result = [] + for i in range(len(self.axes_dims)): + index = ids[:, i] + real_part = self.freqs_real[i][index] + imag_part = self.freqs_imag[i][index] + complex_part = torch.complex(real_part, imag_part) + result.append(complex_part) + return torch.cat(result, dim=-1) + + class RopeEmbedder: def __init__( self, @@ -478,7 +535,10 @@ def __init__( self.axes_dims = axes_dims self.axes_lens = axes_lens - self.rope_embedder = RopeEmbedder(theta=rope_theta, axes_dims=axes_dims, axes_lens=axes_lens) + if is_torch_npu_available: + self.rope_embedder = RopeEmbedderNPU(theta=rope_theta, axes_dims=axes_dims, axes_lens=axes_lens) + else: + self.rope_embedder = RopeEmbedder(theta=rope_theta, axes_dims=axes_dims, axes_lens=axes_lens) def unpatchify( self, From e4bbc6d343a55467b036cdc2e1bec3836c7dec6d Mon Sep 17 00:00:00 2001 From: Zhibin Mo <97496981+luren55@users.noreply.github.com> Date: Thu, 22 Jan 2026 15:44:22 +0800 Subject: [PATCH 02/23] Update attention_dispatch.py --- src/diffusers/models/attention_dispatch.py | 26 ++++++++++++---------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/diffusers/models/attention_dispatch.py b/src/diffusers/models/attention_dispatch.py index f4ec49703850..72573caa3117 100644 --- a/src/diffusers/models/attention_dispatch.py +++ b/src/diffusers/models/attention_dispatch.py @@ -2195,18 +2195,20 @@ def _native_attention( attn_mask = attn_mask.unsqueeze(1).unsqueeze(1) if _parallel_config is None: - query, key, value = (x.permute(0, 2, 1, 3) for x in (query, key, value)) - out = torch.nn.functional.scaled_dot_product_attention( - query=query, - key=key, - value=value, - attn_mask=attn_mask, - dropout_p=dropout_p, - is_causal=is_causal, - scale=scale, - enable_gqa=enable_gqa, - ) - out = out.permute(0, 2, 1, 3) + out = npu_fusion_attention( + query, + key, + value, + query.size(2), # num_heads + input_layout="BSND", + pse=None, + scale=1.0 / math.sqrt(query.shape[-1]) if scale is None else scale, + pre_tockens=65536, + next_tockens=65536, + keep_prob=1.0 - dropout_p, + sync=False, + inner_precise=0, + )[0] else: out = _templated_context_parallel_attention( query, From 677c0ffb12f868b04d1365508eda113b3e9e4737 Mon Sep 17 00:00:00 2001 From: Zhibin Mo <97496981+luren55@users.noreply.github.com> Date: Thu, 22 Jan 2026 23:29:47 +0800 Subject: [PATCH 03/23] attention_dispatch.py backup --- src/diffusers/models/attention_dispatch.py | 26 ++++++++++------------ 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/diffusers/models/attention_dispatch.py b/src/diffusers/models/attention_dispatch.py index 72573caa3117..f4ec49703850 100644 --- a/src/diffusers/models/attention_dispatch.py +++ b/src/diffusers/models/attention_dispatch.py @@ -2195,20 +2195,18 @@ def _native_attention( attn_mask = attn_mask.unsqueeze(1).unsqueeze(1) if _parallel_config is None: - out = npu_fusion_attention( - query, - key, - value, - query.size(2), # num_heads - input_layout="BSND", - pse=None, - scale=1.0 / math.sqrt(query.shape[-1]) if scale is None else scale, - pre_tockens=65536, - next_tockens=65536, - keep_prob=1.0 - dropout_p, - sync=False, - inner_precise=0, - )[0] + query, key, value = (x.permute(0, 2, 1, 3) for x in (query, key, value)) + out = torch.nn.functional.scaled_dot_product_attention( + query=query, + key=key, + value=value, + attn_mask=attn_mask, + dropout_p=dropout_p, + is_causal=is_causal, + scale=scale, + enable_gqa=enable_gqa, + ) + out = out.permute(0, 2, 1, 3) else: out = _templated_context_parallel_attention( query, From 1dc7cc5600141344d7e7042196b492b3291cfeb7 Mon Sep 17 00:00:00 2001 From: luren55 Date: Mon, 26 Jan 2026 13:51:57 +0800 Subject: [PATCH 04/23] merge RopeEmbedderNPU into RopeEmbedder --- .../transformers/transformer_z_image.py | 124 +++++++----------- 1 file changed, 50 insertions(+), 74 deletions(-) diff --git a/src/diffusers/models/transformers/transformer_z_image.py b/src/diffusers/models/transformers/transformer_z_image.py index 5afa6bb5b49f..a62a1638ad9a 100644 --- a/src/diffusers/models/transformers/transformer_z_image.py +++ b/src/diffusers/models/transformers/transformer_z_image.py @@ -312,7 +312,7 @@ def forward(self, x, c=None, noise_mask=None, c_noisy=None, c_clean=None): return x -class RopeEmbedderNPU: +class RopeEmbedder: def __init__( self, theta: float = 256.0, @@ -330,87 +330,66 @@ def __init__( @staticmethod def precompute_freqs_cis(dim: List[int], end: List[int], theta: float = 256.0): with torch.device("cpu"): - freqs_real_list = [] - freqs_imag_list = [] - for i, (d, e) in enumerate(zip(dim, end)): - freqs = 1.0 / (theta ** (torch.arange(0, d, 2, dtype=torch.float64, device="cpu") / d)) - timestep = torch.arange(e, device=freqs.device, dtype=torch.float64) - freqs = torch.outer(timestep, freqs).float() - freqs_real = torch.cos(freqs) - freqs_imag = torch.sin(freqs) - freqs_real_list.append(freqs_real.to(torch.float32)) - freqs_imag_list.append(freqs_imag.to(torch.float32)) - - return freqs_real_list, freqs_imag_list + if is_torch_npu_available: + freqs_real_list = [] + freqs_imag_list = [] + for i, (d, e) in enumerate(zip(dim, end)): + freqs = 1.0 / (theta ** (torch.arange(0, d, 2, dtype=torch.float64, device="cpu") / d)) + timestep = torch.arange(e, device=freqs.device, dtype=torch.float64) + freqs = torch.outer(timestep, freqs).float() + freqs_real = torch.cos(freqs) + freqs_imag = torch.sin(freqs) + freqs_real_list.append(freqs_real.to(torch.float32)) + freqs_imag_list.append(freqs_imag.to(torch.float32)) + + return freqs_real_list, freqs_imag_list + else: + freqs_cis = [] + for i, (d, e) in enumerate(zip(dim, end)): + freqs = 1.0 / (theta ** (torch.arange(0, d, 2, dtype=torch.float64, device="cpu") / d)) + timestep = torch.arange(e, device=freqs.device, dtype=torch.float64) + freqs = torch.outer(timestep, freqs).float() + freqs_cis_i = torch.polar(torch.ones_like(freqs), freqs).to(torch.complex64) # complex64 + freqs_cis.append(freqs_cis_i) + return freqs_cis def __call__(self, ids: torch.Tensor): assert ids.ndim == 2 assert ids.shape[-1] == len(self.axes_dims) device = ids.device - if self.freqs_real is None or self.freqs_imag is None: - freqs_real, freqs_imag = self.precompute_freqs_cis(self.axes_dims, self.axes_lens, theta=self.theta) - self.freqs_real = [fr.to(device) for fr in freqs_real] - self.freqs_imag = [fi.to(device) for fi in freqs_imag] - else: - # Ensure freqs_cis are on the same device as ids - if self.freqs_real[0].device != device: + if is_torch_npu_available: + if self.freqs_real is None or self.freqs_imag is None: + freqs_real, freqs_imag = self.precompute_freqs_cis(self.axes_dims, self.axes_lens, theta=self.theta) self.freqs_real = [fr.to(device) for fr in freqs_real] self.freqs_imag = [fi.to(device) for fi in freqs_imag] + else: + # Ensure freqs_cis are on the same device as ids + if self.freqs_real[0].device != device: + self.freqs_real = [fr.to(device) for fr in freqs_real] + self.freqs_imag = [fi.to(device) for fi in freqs_imag] - result = [] - for i in range(len(self.axes_dims)): - index = ids[:, i] - real_part = self.freqs_real[i][index] - imag_part = self.freqs_imag[i][index] - complex_part = torch.complex(real_part, imag_part) - result.append(complex_part) - return torch.cat(result, dim=-1) - - -class RopeEmbedder: - def __init__( - self, - theta: float = 256.0, - axes_dims: List[int] = (16, 56, 56), - axes_lens: List[int] = (64, 128, 128), - ): - self.theta = theta - self.axes_dims = axes_dims - self.axes_lens = axes_lens - assert len(axes_dims) == len(axes_lens), "axes_dims and axes_lens must have the same length" - self.freqs_cis = None - - @staticmethod - def precompute_freqs_cis(dim: List[int], end: List[int], theta: float = 256.0): - with torch.device("cpu"): - freqs_cis = [] - for i, (d, e) in enumerate(zip(dim, end)): - freqs = 1.0 / (theta ** (torch.arange(0, d, 2, dtype=torch.float64, device="cpu") / d)) - timestep = torch.arange(e, device=freqs.device, dtype=torch.float64) - freqs = torch.outer(timestep, freqs).float() - freqs_cis_i = torch.polar(torch.ones_like(freqs), freqs).to(torch.complex64) # complex64 - freqs_cis.append(freqs_cis_i) - - return freqs_cis - - def __call__(self, ids: torch.Tensor): - assert ids.ndim == 2 - assert ids.shape[-1] == len(self.axes_dims) - device = ids.device - - if self.freqs_cis is None: - self.freqs_cis = self.precompute_freqs_cis(self.axes_dims, self.axes_lens, theta=self.theta) - self.freqs_cis = [freqs_cis.to(device) for freqs_cis in self.freqs_cis] + result = [] + for i in range(len(self.axes_dims)): + index = ids[:, i] + real_part = self.freqs_real[i][index] + imag_part = self.freqs_imag[i][index] + complex_part = torch.complex(real_part, imag_part) + result.append(complex_part) else: - # Ensure freqs_cis are on the same device as ids - if self.freqs_cis[0].device != device: + if self.freqs_cis is None: + self.freqs_cis = self.precompute_freqs_cis(self.axes_dims, self.axes_lens, theta=self.theta) self.freqs_cis = [freqs_cis.to(device) for freqs_cis in self.freqs_cis] + else: + # Ensure freqs_cis are on the same device as ids + if self.freqs_cis[0].device != device: + self.freqs_cis = [freqs_cis.to(device) for freqs_cis in self.freqs_cis] - result = [] - for i in range(len(self.axes_dims)): - index = ids[:, i] - result.append(self.freqs_cis[i][index]) + result = [] + for i in range(len(self.axes_dims)): + index = ids[:, i] + result.append(self.freqs_cis[i][index]) + return torch.cat(result, dim=-1) @@ -535,10 +514,7 @@ def __init__( self.axes_dims = axes_dims self.axes_lens = axes_lens - if is_torch_npu_available: - self.rope_embedder = RopeEmbedderNPU(theta=rope_theta, axes_dims=axes_dims, axes_lens=axes_lens) - else: - self.rope_embedder = RopeEmbedder(theta=rope_theta, axes_dims=axes_dims, axes_lens=axes_lens) + self.rope_embedder = RopeEmbedder(theta=rope_theta, axes_dims=axes_dims, axes_lens=axes_lens) def unpatchify( self, From b7d13259bfd713d2de1a1ae8c5dcb598abc1c53d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 28 Jan 2026 04:00:47 +0000 Subject: [PATCH 05/23] Apply style fixes --- src/diffusers/models/transformers/transformer_z_image.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/diffusers/models/transformers/transformer_z_image.py b/src/diffusers/models/transformers/transformer_z_image.py index a62a1638ad9a..a3e50132eb38 100644 --- a/src/diffusers/models/transformers/transformer_z_image.py +++ b/src/diffusers/models/transformers/transformer_z_image.py @@ -25,10 +25,10 @@ from ...models.attention_processor import Attention from ...models.modeling_utils import ModelMixin from ...models.normalization import RMSNorm +from ...utils import is_torch_npu_available from ...utils.torch_utils import maybe_allow_in_graph from ..attention_dispatch import dispatch_attention_fn from ..modeling_outputs import Transformer2DModelOutput -from ...utils import is_torch_npu_available ADALN_EMBED_DIM = 256 @@ -342,8 +342,8 @@ def precompute_freqs_cis(dim: List[int], end: List[int], theta: float = 256.0): freqs_real_list.append(freqs_real.to(torch.float32)) freqs_imag_list.append(freqs_imag.to(torch.float32)) - return freqs_real_list, freqs_imag_list - else: + return freqs_real_list, freqs_imag_list + else: freqs_cis = [] for i, (d, e) in enumerate(zip(dim, end)): freqs = 1.0 / (theta ** (torch.arange(0, d, 2, dtype=torch.float64, device="cpu") / d)) @@ -389,7 +389,7 @@ def __call__(self, ids: torch.Tensor): for i in range(len(self.axes_dims)): index = ids[:, i] result.append(self.freqs_cis[i][index]) - + return torch.cat(result, dim=-1) From 95cfd71907c8fb43d6b06fe05f2db210cce222e0 Mon Sep 17 00:00:00 2001 From: CI Runner Date: Thu, 30 Apr 2026 00:05:40 +0800 Subject: [PATCH 06/23] chore: scaffold ci_runners directory structure --- .github/ci_runners/reference/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/ci_runners/reference/.gitkeep diff --git a/.github/ci_runners/reference/.gitkeep b/.github/ci_runners/reference/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 From fbd1b984dce48f18301f667b05ec2765853a9a2e Mon Sep 17 00:00:00 2001 From: CI Runner Date: Thu, 30 Apr 2026 00:07:04 +0800 Subject: [PATCH 07/23] feat: add runner_utils with timer, validation, precision comparison --- .github/ci_runners/runner_utils.py | 70 ++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 .github/ci_runners/runner_utils.py diff --git a/.github/ci_runners/runner_utils.py b/.github/ci_runners/runner_utils.py new file mode 100644 index 000000000000..01dab54fcb52 --- /dev/null +++ b/.github/ci_runners/runner_utils.py @@ -0,0 +1,70 @@ +import json +import time +from contextlib import contextmanager + +import torch +from PIL import Image +import numpy as np + +try: + from skimage.metrics import structural_similarity as ssim + HAS_SKIMAGE = True +except ImportError: + HAS_SKIMAGE = False + + +def detect_device() -> tuple[str, torch.dtype]: + try: + import torch_npu # noqa: F401 + if hasattr(torch, "npu") and torch.npu.is_available(): + return "npu", torch.bfloat16 + except Exception: + pass + if torch.cuda.is_available(): + return "cuda", torch.bfloat16 + return "cpu", torch.float32 + + +@contextmanager +def timer(): + start = time.perf_counter() + elapsed = 0.0 + try: + yield lambda: elapsed + finally: + elapsed = time.perf_counter() - start + + +def validate_image(image: Image.Image, expected_width: int, expected_height: int) -> dict: + w, h = image.size + dimensions_ok = (w == expected_width and h == expected_height) + + arr = np.array(image.convert("RGB"), dtype=np.float32) + non_black = bool(arr.max() > 5.0) + + return {"dimensions_ok": dimensions_ok, "non_black": non_black} + + +def compare_with_reference(image: Image.Image, ref_path: str) -> dict: + if not HAS_SKIMAGE: + return {"error": "skimage not installed, cannot compute PSNR/SSIM"} + try: + ref = Image.open(ref_path).convert("RGB") + except FileNotFoundError: + return {"error": f"reference image not found: {ref_path}"} + + img_arr = np.array(image, dtype=np.float64) + ref_arr = np.array(ref, dtype=np.float64) + + if img_arr.shape != ref_arr.shape: + return {"error": f"shape mismatch: {img_arr.shape} vs {ref_arr.shape}"} + + mse = np.mean((img_arr - ref_arr) ** 2) + if mse == 0: + psnr = float("inf") + else: + psnr = 20 * np.log10(255.0 / np.sqrt(mse)) + + ssim_val = ssim(ref_arr, img_arr, channel_axis=-1, data_range=255) + + return {"psnr": round(psnr, 2), "ssim": round(ssim_val, 4)} From 0879fde3adcebb76af12ababea59809de1ecf21b Mon Sep 17 00:00:00 2001 From: CI Runner Date: Thu, 30 Apr 2026 00:10:27 +0800 Subject: [PATCH 08/23] feat: add YAML configs for 8 pipeline classes and 12 model variants --- .github/ci_runners/configs/ltx2/config.yaml | 16 ++++++++++++++++ .../configs/ltx2/variants/ltx_2.3.yaml | 6 ++++++ .../ci_runners/configs/qwen_image/config.yaml | 14 ++++++++++++++ .../configs/qwen_image/variants/2512.yaml | 4 ++++ .../configs/qwen_image_edit/config.yaml | 14 ++++++++++++++ .../configs/qwen_image_edit/variants/2511.yaml | 4 ++++ .../configs/qwen_image_layered/config.yaml | 16 ++++++++++++++++ .../qwen_image_layered/variants/default.yaml | 4 ++++ .github/ci_runners/configs/wan_i2v/config.yaml | 15 +++++++++++++++ .../wan_i2v/variants/wan2.1_i2v_14b_480p.yaml | 4 ++++ .../wan_i2v/variants/wan2.2_i2v_a14b.yaml | 6 ++++++ .../ci_runners/configs/wan_pipeline/config.yaml | 15 +++++++++++++++ .../wan_pipeline/variants/wan2.1_t2v_14b.yaml | 4 ++++ .../wan_pipeline/variants/wan2.2_t2v_a14b.yaml | 7 +++++++ .../wan_pipeline/variants/wan2.2_ti2v_5b.yaml | 5 +++++ .github/ci_runners/configs/wan_vace/config.yaml | 15 +++++++++++++++ .../wan_vace/variants/flf2v_14b_720p.yaml | 6 ++++++ .../configs/wan_vace/variants/vace_14b.yaml | 6 ++++++ .github/ci_runners/configs/z_image/config.yaml | 16 ++++++++++++++++ .../configs/z_image/variants/default.yaml | 4 ++++ 20 files changed, 181 insertions(+) create mode 100644 .github/ci_runners/configs/ltx2/config.yaml create mode 100644 .github/ci_runners/configs/ltx2/variants/ltx_2.3.yaml create mode 100644 .github/ci_runners/configs/qwen_image/config.yaml create mode 100644 .github/ci_runners/configs/qwen_image/variants/2512.yaml create mode 100644 .github/ci_runners/configs/qwen_image_edit/config.yaml create mode 100644 .github/ci_runners/configs/qwen_image_edit/variants/2511.yaml create mode 100644 .github/ci_runners/configs/qwen_image_layered/config.yaml create mode 100644 .github/ci_runners/configs/qwen_image_layered/variants/default.yaml create mode 100644 .github/ci_runners/configs/wan_i2v/config.yaml create mode 100644 .github/ci_runners/configs/wan_i2v/variants/wan2.1_i2v_14b_480p.yaml create mode 100644 .github/ci_runners/configs/wan_i2v/variants/wan2.2_i2v_a14b.yaml create mode 100644 .github/ci_runners/configs/wan_pipeline/config.yaml create mode 100644 .github/ci_runners/configs/wan_pipeline/variants/wan2.1_t2v_14b.yaml create mode 100644 .github/ci_runners/configs/wan_pipeline/variants/wan2.2_t2v_a14b.yaml create mode 100644 .github/ci_runners/configs/wan_pipeline/variants/wan2.2_ti2v_5b.yaml create mode 100644 .github/ci_runners/configs/wan_vace/config.yaml create mode 100644 .github/ci_runners/configs/wan_vace/variants/flf2v_14b_720p.yaml create mode 100644 .github/ci_runners/configs/wan_vace/variants/vace_14b.yaml create mode 100644 .github/ci_runners/configs/z_image/config.yaml create mode 100644 .github/ci_runners/configs/z_image/variants/default.yaml diff --git a/.github/ci_runners/configs/ltx2/config.yaml b/.github/ci_runners/configs/ltx2/config.yaml new file mode 100644 index 000000000000..93e048acfdb4 --- /dev/null +++ b/.github/ci_runners/configs/ltx2/config.yaml @@ -0,0 +1,16 @@ +pipeline_class: LTX2Pipeline +module: diffusers.pipelines.ltx2.pipeline_ltx2 + +params_grid: + - name: "landscape_50steps_single" + width: 768 + height: 512 + num_inference_steps: 50 + guidance_scale: 4.0 + num_frames: 49 + stg_scale: 0.0 + parallel: "single" + +prompt: "A cat walking on a beach at sunset, cinematic quality." +negative_prompt: "blurry, low quality, distorted." +reference_config: "landscape_50steps_single" diff --git a/.github/ci_runners/configs/ltx2/variants/ltx_2.3.yaml b/.github/ci_runners/configs/ltx2/variants/ltx_2.3.yaml new file mode 100644 index 000000000000..30b66cefefae --- /dev/null +++ b/.github/ci_runners/configs/ltx2/variants/ltx_2.3.yaml @@ -0,0 +1,6 @@ +model_id: Lightricks/LTX-2.3 +weight_path: /home/weights/LTX-2.3 +backend: modelscope +extra_params: + use_cross_timestep: true + spatio_temporal_guidance_blocks: [28] diff --git a/.github/ci_runners/configs/qwen_image/config.yaml b/.github/ci_runners/configs/qwen_image/config.yaml new file mode 100644 index 000000000000..a28b87609354 --- /dev/null +++ b/.github/ci_runners/configs/qwen_image/config.yaml @@ -0,0 +1,14 @@ +pipeline_class: QwenImagePipeline +module: diffusers.pipelines.qwenimage.pipeline_qwenimage + +params_grid: + - name: "landscape_50steps_single" + width: 1344 + height: 768 + num_inference_steps: 50 + true_cfg_scale: 4.0 + parallel: "single" + +prompt: "A 20-year-old East Asian girl with delicate, charming features and large, bright brown eyes, cheerful expression, wavy long hair tied in twin ponytails, fair skin, light makeup, wearing a modern cute dress in bright soft colors, standing indoors at an anime convention, casual iPhone snapshot style." +negative_prompt: "低分辨率,低画质,肢体畸形,手指畸形,画面过饱和,蜡像感,人脸无细节,过度光滑,画面具有AI感。构图混乱。文字模糊,扭曲。" +reference_config: "landscape_50steps_single" diff --git a/.github/ci_runners/configs/qwen_image/variants/2512.yaml b/.github/ci_runners/configs/qwen_image/variants/2512.yaml new file mode 100644 index 000000000000..fa4095ce4793 --- /dev/null +++ b/.github/ci_runners/configs/qwen_image/variants/2512.yaml @@ -0,0 +1,4 @@ +model_id: Qwen/Qwen-Image-2512 +weight_path: /home/weights/Qwen-Image-2512 +backend: local +extra_params: {} diff --git a/.github/ci_runners/configs/qwen_image_edit/config.yaml b/.github/ci_runners/configs/qwen_image_edit/config.yaml new file mode 100644 index 000000000000..476cfba6e5a4 --- /dev/null +++ b/.github/ci_runners/configs/qwen_image_edit/config.yaml @@ -0,0 +1,14 @@ +pipeline_class: QwenImageEditPipeline +module: diffusers.pipelines.qwenimage.pipeline_qwenimage_edit + +params_grid: + - name: "square_50steps_single" + width: 1024 + height: 1024 + num_inference_steps: 50 + true_cfg_scale: 4.0 + parallel: "single" + +prompt: "Transform this image into a watercolor painting style." +negative_prompt: "blurry, low quality, distorted." +reference_config: "square_50steps_single" diff --git a/.github/ci_runners/configs/qwen_image_edit/variants/2511.yaml b/.github/ci_runners/configs/qwen_image_edit/variants/2511.yaml new file mode 100644 index 000000000000..a7cabb3c99ba --- /dev/null +++ b/.github/ci_runners/configs/qwen_image_edit/variants/2511.yaml @@ -0,0 +1,4 @@ +model_id: Qwen/Qwen-Image-Edit-2511 +weight_path: /home/weights/Qwen-Image-Edit-2511 +backend: local +extra_params: {} diff --git a/.github/ci_runners/configs/qwen_image_layered/config.yaml b/.github/ci_runners/configs/qwen_image_layered/config.yaml new file mode 100644 index 000000000000..2f94f5a03650 --- /dev/null +++ b/.github/ci_runners/configs/qwen_image_layered/config.yaml @@ -0,0 +1,16 @@ +pipeline_class: QwenImageLayeredPipeline +module: diffusers.pipelines.qwenimage.pipeline_qwenimage_layered + +params_grid: + - name: "default_50steps_single" + width: 1024 + height: 1024 + num_inference_steps: 50 + true_cfg_scale: 4.0 + layers: 4 + resolution: 640 + parallel: "single" + +prompt: "A cute cat sitting on a wooden table." +negative_prompt: "blurry, low quality, distorted." +reference_config: "default_50steps_single" diff --git a/.github/ci_runners/configs/qwen_image_layered/variants/default.yaml b/.github/ci_runners/configs/qwen_image_layered/variants/default.yaml new file mode 100644 index 000000000000..1ddce3f26c81 --- /dev/null +++ b/.github/ci_runners/configs/qwen_image_layered/variants/default.yaml @@ -0,0 +1,4 @@ +model_id: Qwen/Qwen-Image-Layered +weight_path: /home/weights/Qwen-Image-Layered +backend: local +extra_params: {} diff --git a/.github/ci_runners/configs/wan_i2v/config.yaml b/.github/ci_runners/configs/wan_i2v/config.yaml new file mode 100644 index 000000000000..42495ead138f --- /dev/null +++ b/.github/ci_runners/configs/wan_i2v/config.yaml @@ -0,0 +1,15 @@ +pipeline_class: WanImageToVideoPipeline +module: diffusers.pipelines.wan.pipeline_wan_i2v + +params_grid: + - name: "square_50steps_single" + width: 832 + height: 480 + num_inference_steps: 50 + guidance_scale: 5.0 + num_frames: 81 + parallel: "single" + +prompt: "A cat walking on a beach at sunset, cinematic quality." +negative_prompt: "blurry, low quality, distorted." +reference_config: "square_50steps_single" diff --git a/.github/ci_runners/configs/wan_i2v/variants/wan2.1_i2v_14b_480p.yaml b/.github/ci_runners/configs/wan_i2v/variants/wan2.1_i2v_14b_480p.yaml new file mode 100644 index 000000000000..b58002836a31 --- /dev/null +++ b/.github/ci_runners/configs/wan_i2v/variants/wan2.1_i2v_14b_480p.yaml @@ -0,0 +1,4 @@ +model_id: Wan-AI/Wan2.1-I2V-14B-480P-Diffusers +weight_path: /home/weights/Wan2.1-I2V-14B-480P-Diffusers +backend: modelscope +extra_params: {} diff --git a/.github/ci_runners/configs/wan_i2v/variants/wan2.2_i2v_a14b.yaml b/.github/ci_runners/configs/wan_i2v/variants/wan2.2_i2v_a14b.yaml new file mode 100644 index 000000000000..f351a5132f3b --- /dev/null +++ b/.github/ci_runners/configs/wan_i2v/variants/wan2.2_i2v_a14b.yaml @@ -0,0 +1,6 @@ +model_id: Wan-AI/Wan2.2-I2V-A14B-Diffusers +weight_path: /home/weights/Wan2.2-I2V-A14B-Diffusers +backend: modelscope +extra_params: + boundary_ratio: 0.875 + guidance_scale_2: 5.0 diff --git a/.github/ci_runners/configs/wan_pipeline/config.yaml b/.github/ci_runners/configs/wan_pipeline/config.yaml new file mode 100644 index 000000000000..e825cde7f425 --- /dev/null +++ b/.github/ci_runners/configs/wan_pipeline/config.yaml @@ -0,0 +1,15 @@ +pipeline_class: WanPipeline +module: diffusers.pipelines.wan.pipeline_wan + +params_grid: + - name: "square_50steps_single" + width: 832 + height: 480 + num_inference_steps: 50 + guidance_scale: 5.0 + num_frames: 81 + parallel: "single" + +prompt: "A cat walking on a beach at sunset, cinematic quality." +negative_prompt: "blurry, low quality, distorted." +reference_config: "square_50steps_single" diff --git a/.github/ci_runners/configs/wan_pipeline/variants/wan2.1_t2v_14b.yaml b/.github/ci_runners/configs/wan_pipeline/variants/wan2.1_t2v_14b.yaml new file mode 100644 index 000000000000..60bf33ad1319 --- /dev/null +++ b/.github/ci_runners/configs/wan_pipeline/variants/wan2.1_t2v_14b.yaml @@ -0,0 +1,4 @@ +model_id: Wan-AI/Wan2.1-T2V-14B-Diffusers +weight_path: /home/weights/Wan2.1-T2V-14B-Diffusers +backend: modelscope +extra_params: {} diff --git a/.github/ci_runners/configs/wan_pipeline/variants/wan2.2_t2v_a14b.yaml b/.github/ci_runners/configs/wan_pipeline/variants/wan2.2_t2v_a14b.yaml new file mode 100644 index 000000000000..a1f2afa19330 --- /dev/null +++ b/.github/ci_runners/configs/wan_pipeline/variants/wan2.2_t2v_a14b.yaml @@ -0,0 +1,7 @@ +model_id: Wan-AI/Wan2.2-T2V-A14B-Diffusers +weight_path: /home/weights/Wan2.2-T2V-A14B-Diffusers +backend: modelscope +extra_params: + boundary_ratio: 0.875 + guidance_scale_2: 5.0 + expand_timesteps: false diff --git a/.github/ci_runners/configs/wan_pipeline/variants/wan2.2_ti2v_5b.yaml b/.github/ci_runners/configs/wan_pipeline/variants/wan2.2_ti2v_5b.yaml new file mode 100644 index 000000000000..3b619dd02a5f --- /dev/null +++ b/.github/ci_runners/configs/wan_pipeline/variants/wan2.2_ti2v_5b.yaml @@ -0,0 +1,5 @@ +model_id: Wan-AI/Wan2.2-TI2V-5B-Diffusers +weight_path: /home/weights/Wan2.2-TI2V-5B-Diffusers +backend: modelscope +extra_params: + expand_timesteps: true diff --git a/.github/ci_runners/configs/wan_vace/config.yaml b/.github/ci_runners/configs/wan_vace/config.yaml new file mode 100644 index 000000000000..4fb45fb443ec --- /dev/null +++ b/.github/ci_runners/configs/wan_vace/config.yaml @@ -0,0 +1,15 @@ +pipeline_class: WanVACEPipeline +module: diffusers.pipelines.wan.pipeline_wan_vace + +params_grid: + - name: "square_50steps_single" + width: 832 + height: 480 + num_inference_steps: 50 + guidance_scale: 5.0 + num_frames: 81 + parallel: "single" + +prompt: "A cat walking on a beach at sunset, cinematic quality." +negative_prompt: "blurry, low quality, distorted." +reference_config: "square_50steps_single" diff --git a/.github/ci_runners/configs/wan_vace/variants/flf2v_14b_720p.yaml b/.github/ci_runners/configs/wan_vace/variants/flf2v_14b_720p.yaml new file mode 100644 index 000000000000..e1bd90b5a776 --- /dev/null +++ b/.github/ci_runners/configs/wan_vace/variants/flf2v_14b_720p.yaml @@ -0,0 +1,6 @@ +model_id: Wan-AI/Wan2.1-FLF2V-14B-720P-diffusers +weight_path: /home/weights/Wan2.1-FLF2V-14B-720P-diffusers +backend: modelscope +extra_params: + boundary_ratio: 0.875 + guidance_scale_2: 5.0 diff --git a/.github/ci_runners/configs/wan_vace/variants/vace_14b.yaml b/.github/ci_runners/configs/wan_vace/variants/vace_14b.yaml new file mode 100644 index 000000000000..766c06c7714a --- /dev/null +++ b/.github/ci_runners/configs/wan_vace/variants/vace_14b.yaml @@ -0,0 +1,6 @@ +model_id: Wan-AI/Wan2.1-VACE-14B-diffusers +weight_path: /home/weights/Wan2.1-VACE-14B-diffusers +backend: modelscope +extra_params: + boundary_ratio: 0.875 + guidance_scale_2: 5.0 diff --git a/.github/ci_runners/configs/z_image/config.yaml b/.github/ci_runners/configs/z_image/config.yaml new file mode 100644 index 000000000000..fb8a6fadae7a --- /dev/null +++ b/.github/ci_runners/configs/z_image/config.yaml @@ -0,0 +1,16 @@ +pipeline_class: ZImagePipeline +module: diffusers.pipelines.z_image.pipeline_z_image + +params_grid: + - name: "landscape_50steps_single" + width: 1024 + height: 1024 + num_inference_steps: 50 + guidance_scale: 5.0 + cfg_normalization: false + cfg_truncation: 1.0 + parallel: "single" + +prompt: "A serene mountain lake at sunrise, hyperrealistic, 8k quality." +negative_prompt: "" +reference_config: "landscape_50steps_single" diff --git a/.github/ci_runners/configs/z_image/variants/default.yaml b/.github/ci_runners/configs/z_image/variants/default.yaml new file mode 100644 index 000000000000..cdbb452a6930 --- /dev/null +++ b/.github/ci_runners/configs/z_image/variants/default.yaml @@ -0,0 +1,4 @@ +model_id: Tongyi-MAI/Z-Image +weight_path: /home/weights/Z-Image +backend: modelscope +extra_params: {} From 88ed60810fe842d0f806d48403be6e81655079cb Mon Sep 17 00:00:00 2001 From: CI Runner Date: Thu, 30 Apr 2026 00:14:11 +0800 Subject: [PATCH 09/23] feat: add run_pipeline.py main driver --- .github/ci_runners/run_pipeline.py | 327 +++++++++++++++++++++++++++++ 1 file changed, 327 insertions(+) create mode 100644 .github/ci_runners/run_pipeline.py diff --git a/.github/ci_runners/run_pipeline.py b/.github/ci_runners/run_pipeline.py new file mode 100644 index 000000000000..953965b574b7 --- /dev/null +++ b/.github/ci_runners/run_pipeline.py @@ -0,0 +1,327 @@ +import argparse +import importlib +import json +import os +import sys +import traceback +import yaml +from pathlib import Path +from datetime import datetime, timezone + +import torch +from diffusers import DiffusionPipeline + +from runner_utils import detect_device, timer, validate_image, compare_with_reference + + +def load_yaml(path: str) -> dict: + with open(path, "r") as f: + return yaml.safe_load(f) + + +def save_image(image, output_dir: str, filename: str) -> str: + os.makedirs(os.path.join(output_dir, "images"), exist_ok=True) + filepath = os.path.join(output_dir, "images", filename) + if hasattr(image, "save"): + image.save(filepath) + elif isinstance(image, list) and len(image) > 0 and hasattr(image[0], "save"): + image = image[0] + image.save(filepath) + else: + from PIL import Image + Image.fromarray(image).save(filepath) + return filepath + + +def load_pipeline(pipeline_class_name: str, module_path: str, weight_path: str, backend: str, device: str, torch_dtype: torch.dtype): + module = importlib.import_module(module_path) + pipeline_cls = getattr(module, pipeline_class_name) + + if backend == "local" and weight_path and os.path.isdir(weight_path): + pipe = pipeline_cls.from_pretrained( + weight_path, + torch_dtype=torch_dtype, + trust_remote_code=True, + ) + elif backend == "modelscope": + from modelscope import snapshot_download + local_path = snapshot_download(weight_path) + pipe = pipeline_cls.from_pretrained( + local_path, + torch_dtype=torch_dtype, + trust_remote_code=True, + ) + else: + pipe = pipeline_cls.from_pretrained( + weight_path, + torch_dtype=torch_dtype, + trust_remote_code=True, + ) + pipe = pipe.to(device) + return pipe + + +def apply_optimizations(pipe, parallel: str): + if parallel == "single": + if hasattr(pipe, "enable_attention_slicing"): + try: + pipe.enable_attention_slicing() + except Exception: + pass + if hasattr(pipe, "enable_vae_slicing"): + try: + pipe.enable_vae_slicing() + except Exception: + pass + + +def build_kwargs(params_grid_entry: dict, prompt: str, negative_prompt: str, device: str, extra_params: dict | None = None) -> dict: + grid_copy = dict(params_grid_entry) + parallel = grid_copy.pop("parallel", "single") + name = grid_copy.pop("name", "unnamed") + + kwargs = {k: v for k, v in grid_copy.items()} + kwargs["prompt"] = prompt + if negative_prompt: + kwargs["negative_prompt"] = negative_prompt + + if extra_params: + kwargs.update(extra_params) + + gen_device = "cuda" if device == "cuda" else "cpu" + kwargs["generator"] = torch.Generator(device=gen_device).manual_seed(42) + + return kwargs, parallel, name + + +def run_single_config(pipe, kwargs: dict, parallel: str, name: str, + pipeline: str, variant_name: str, device: str, dtype_str: str, + output_dir: str, ref_image_path: str | None = None) -> dict: + result = { + "pipeline": pipeline, + "variant": variant_name, + "config_name": name, + "parallel": parallel, + "device": device, + "dtype": dtype_str, + "params": {k: v for k, v in kwargs.items() + if k not in ("prompt", "negative_prompt", "generator")}, + "result": None, + "error": None, + "timestamp": datetime.now(timezone.utc).isoformat(), + } + + try: + with timer() as get_elapsed: + output = pipe(**kwargs) + + inference_time = round(get_elapsed(), 2) + image = output.images[0] + + filename = f"{pipeline}_{variant_name}_{name}.png" + out_path = save_image(image, output_dir, filename) + + width = kwargs.get("width", 0) + height = kwargs.get("height", 0) + validation = validate_image(image, width, height) + + precision = {} + if ref_image_path and os.path.isfile(ref_image_path): + precision = compare_with_reference(image, ref_image_path) + elif ref_image_path: + precision = {"error": f"reference not found: {ref_image_path}"} + + result["result"] = { + "status": "passed", + "inference_time_s": inference_time, + "output_file": os.path.relpath(out_path, output_dir), + "validation": validation, + "precision": precision, + } + except Exception as e: + result["result"] = {"status": "failed"} + result["error"] = "".join(traceback.format_exception(type(e), e, e.__traceback__)) + + return result + + +def generate_reference_only(config_dir: str, output_dir: str): + config = load_yaml(os.path.join(config_dir, "config.yaml")) + ref_config_name = config.get("reference_config") + if not ref_config_name: + print(f"[SKIP] {config_dir}: no reference_config defined") + return + + ref_entry = None + for entry in config["params_grid"]: + if entry.get("name") == ref_config_name: + ref_entry = entry + break + if not ref_entry: + print(f"[SKIP] {config_dir}: reference_config '{ref_config_name}' not found in params_grid") + return + + pipeline_name = os.path.basename(config_dir) + pipeline_class = config["pipeline_class"] + module_path = config["module"] + prompt = config.get("prompt", "") + + variants_dir = os.path.join(config_dir, "variants") + variant_files = sorted(Path(variants_dir).glob("*.yaml")) + + pipeline_label = os.path.basename(config_dir).replace("/", "_") + + if not variant_files: + print(f"[SKIP] {pipeline_name}: no variant files") + return + + variant_data = load_yaml(str(variant_files[0])) + device, torch_dtype = detect_device() + + print(f"[{pipeline_name}] loading model ({variant_files[0].stem})...") + pipe = load_pipeline( + pipeline_class, module_path, + variant_data.get("weight_path", variant_data["model_id"]), + variant_data.get("backend", "local"), + device, torch_dtype, + ) + apply_optimizations(pipe, ref_entry.get("parallel", "single")) + + kwargs, _, _ = build_kwargs(ref_entry, prompt, config.get("negative_prompt", ""), device, + variant_data.get("extra_params")) + output = pipe(**kwargs) + image = output.images[0] + + ci_runners_dir = os.path.dirname(os.path.dirname(config_dir)) + ref_dir = os.path.join(ci_runners_dir, "reference") + os.makedirs(ref_dir, exist_ok=True) + ref_path = os.path.join(ref_dir, f"{pipeline_label}_{ref_config_name}.png") + image.save(ref_path) + print(f"[{pipeline_name}] reference saved to {ref_path}") + + del pipe + if device in ("cuda", "npu"): + torch.cuda.empty_cache() if device == "cuda" else None + + +def scan_pipelines(configs_root: str) -> list[str]: + pipeline_dirs = [] + for entry in sorted(os.listdir(configs_root)): + full_path = os.path.join(configs_root, entry) + if os.path.isdir(full_path) and os.path.isfile(os.path.join(full_path, "config.yaml")): + pipeline_dirs.append(full_path) + return pipeline_dirs + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--configs", required=True, help="path to configs/ directory") + parser.add_argument("--output", required=True, help="output directory for results") + parser.add_argument("--generate-reference", action="store_true", + help="generate reference images instead of running full CI") + args = parser.parse_args() + + os.makedirs(args.output, exist_ok=True) + + if args.generate_reference: + for pipe_dir in scan_pipelines(args.configs): + generate_reference_only(pipe_dir, args.output) + return + + all_results = [] + device, torch_dtype = detect_device() + dtype_str = str(torch_dtype).split(".")[-1] + + for pipe_dir in scan_pipelines(args.configs): + config = load_yaml(os.path.join(pipe_dir, "config.yaml")) + pipeline_class = config["pipeline_class"] + module_path = config["module"] + prompt = config.get("prompt", "") + negative_prompt = config.get("negative_prompt", "") + ref_config_name = config.get("reference_config") + pipeline_label = os.path.basename(pipe_dir).replace("/", "_") + + variants_dir = os.path.join(pipe_dir, "variants") + variant_files = sorted(Path(variants_dir).glob("*.yaml")) + + if not variant_files: + print(f"[WARN] {pipeline_label}: no variant files found, skipping") + continue + + for vf in variant_files: + variant_data = load_yaml(str(vf)) + variant_name = vf.stem + + print(f"[{pipeline_class}] loading model: {variant_name}") + try: + pipe = load_pipeline( + pipeline_class, module_path, + variant_data.get("weight_path", variant_data["model_id"]), + variant_data.get("backend", "local"), + device, torch_dtype, + ) + except Exception as e: + result = { + "pipeline": pipeline_class, + "variant": variant_name, + "config_name": "model_load", + "parallel": "N/A", + "device": device, + "dtype": dtype_str, + "params": {}, + "result": {"status": "failed"}, + "error": "".join(traceback.format_exception(type(e), e, e.__traceback__)), + "timestamp": datetime.now(timezone.utc).isoformat(), + } + all_results.append(result) + continue + + for params_entry in config["params_grid"]: + kwargs, parallel, config_name = build_kwargs( + params_entry, prompt, negative_prompt, device, + variant_data.get("extra_params"), + ) + apply_optimizations(pipe, parallel) + + ref_image_path = None + if config_name == ref_config_name: + ci_runners_dir = os.path.dirname(os.path.dirname(pipe_dir)) + ref_image_path = os.path.join( + ci_runners_dir, "reference", + f"{pipeline_label}_{ref_config_name}.png" + ) + + print(f" [{config_name}] parallel={parallel} ...") + result = run_single_config( + pipe, kwargs, parallel, config_name, + pipeline_class, variant_name, device, dtype_str, + args.output, ref_image_path, + ) + all_results.append(result) + + status = result["result"].get("status", "unknown") + if status == "passed": + t = result["result"].get("inference_time_s", "?") + print(f" PASS ({t}s)") + else: + print(f" FAIL") + + del pipe + if device in ("cuda", "npu"): + torch.cuda.empty_cache() + + results_path = os.path.join(args.output, "all_results.json") + with open(results_path, "w") as f: + json.dump(all_results, f, indent=2, ensure_ascii=False) + + passed = sum(1 for r in all_results if r["result"] and r["result"].get("status") == "passed") + failed = sum(1 for r in all_results if r["result"] and r["result"].get("status") == "failed") + print(f"\nDone. {len(all_results)} runs: {passed} passed, {failed} failed.") + print(f"Results written to {results_path}") + + if failed > 0: + sys.exit(1) + + +if __name__ == "__main__": + main() From a87d4a563661fc122b6e12d0ef02cf039d095945 Mon Sep 17 00:00:00 2001 From: CI Runner Date: Thu, 30 Apr 2026 00:15:44 +0800 Subject: [PATCH 10/23] feat: add report.py for Markdown summary --- .github/ci_runners/report.py | 68 ++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 .github/ci_runners/report.py diff --git a/.github/ci_runners/report.py b/.github/ci_runners/report.py new file mode 100644 index 000000000000..7f2070032f8a --- /dev/null +++ b/.github/ci_runners/report.py @@ -0,0 +1,68 @@ +import argparse +import json +import os +from datetime import datetime, timezone + + +def generate_report(results_path: str) -> str: + with open(results_path, "r") as f: + results = json.load(f) + + passed = [r for r in results if r["result"] and r["result"].get("status") == "passed"] + failed = [r for r in results if r["result"] and r["result"].get("status") == "failed"] + + lines = [] + lines.append("# Diffusers Model CI Report") + lines.append(f"**Generated**: {datetime.now(timezone.utc).strftime('%Y-%m-%d %H:%M:%S UTC')}") + lines.append(f"**Total**: {len(results)} | **Passed**: {len(passed)} | **Failed**: {len(failed)}") + lines.append("") + + if passed: + lines.append("## Passed") + lines.append("| Pipeline | Variant | Config | Parallel | Time (s) | PSNR | SSIM |") + lines.append("|---|---|---|---|---|---|---|") + for r in passed: + prec = r["result"].get("precision", {}) + psnr = prec.get("psnr", "-") if isinstance(prec, dict) else "-" + ssim = prec.get("ssim", "-") if isinstance(prec, dict) else "-" + lines.append( + f"| {r['pipeline']} | {r['variant']} | {r['config_name']} | " + f"{r['parallel']} | {r['result'].get('inference_time_s', '-')} | " + f"{psnr} | {ssim} |" + ) + lines.append("") + + if failed: + lines.append("## Failed") + for r in failed: + lines.append(f"### {r['pipeline']} / {r['variant']} / {r['config_name']}") + lines.append(f"- **Parallel**: {r['parallel']}") + lines.append(f"- **Device**: {r['device']} / {r['dtype']}") + lines.append("```") + lines.append(r.get("error", "")[:2000]) + lines.append("```") + lines.append("") + else: + lines.append("## All tests passed!") + + return "\n".join(lines) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--output", required=True, help="output directory containing all_results.json") + args = parser.parse_args() + + results_path = os.path.join(args.output, "all_results.json") + report = generate_report(results_path) + + report_path = os.path.join(args.output, "report.md") + with open(report_path, "w") as f: + f.write(report) + + print(report) + print(f"\nReport written to {report_path}") + + +if __name__ == "__main__": + main() From 92493de1b7ec41717f59679a3fa1dc3a567fe2d2 Mon Sep 17 00:00:00 2001 From: CI Runner Date: Thu, 30 Apr 2026 00:17:43 +0800 Subject: [PATCH 11/23] feat: add issue_bot.py for automated GitHub Issue creation --- .github/ci_runners/issue_bot.py | 131 ++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 .github/ci_runners/issue_bot.py diff --git a/.github/ci_runners/issue_bot.py b/.github/ci_runners/issue_bot.py new file mode 100644 index 000000000000..24dcbe67fc4d --- /dev/null +++ b/.github/ci_runners/issue_bot.py @@ -0,0 +1,131 @@ +import argparse +import json +import os +import re +import urllib.request +import urllib.error + + +def find_existing_issues(repo: str, token: str, title_prefix: str) -> list[dict]: + url = f"https://api.github.com/repos/{repo}/issues?state=open&labels=ci-failure" + req = urllib.request.Request(url) + req.add_header("Authorization", f"Bearer {token}") + req.add_header("Accept", "application/vnd.github+json") + req.add_header("User-Agent", "diffusers-ci-bot") + + try: + with urllib.request.urlopen(req) as resp: + issues = json.loads(resp.read()) + return [i for i in issues if title_prefix in i.get("title", "")] + except Exception: + return [] + + +def create_issue(repo: str, token: str, title: str, body: str, label: str = "ci-failure") -> str: + url = f"https://api.github.com/repos/{repo}/issues" + data = json.dumps({"title": title, "body": body, "labels": [label]}).encode("utf-8") + + req = urllib.request.Request(url, data=data, method="POST") + req.add_header("Authorization", f"Bearer {token}") + req.add_header("Accept", "application/vnd.github+json") + req.add_header("User-Agent", "diffusers-ci-bot") + req.add_header("Content-Type", "application/json") + + with urllib.request.urlopen(req) as resp: + result = json.loads(resp.read()) + return result.get("html_url", "") + + +def classify_error(error_text: str) -> str: + if "out of memory" in error_text.lower() or "OOM" in error_text: + return ("**错误类型**: OOM (显存不足)\n\n" + "**建议**: 减小 `num_frames`、`width`/`height`,或启用 `enable_attention_slicing`") + if "connection" in error_text.lower() or "timeout" in error_text.lower(): + return ("**错误类型**: 网络/连接异常\n\n" + "**建议**: 检查 HuggingFace/ModelScope 网络连通性,或切换到本地权重") + if "key" in error_text.lower() or "AttributeError" in error_text: + return ("**错误类型**: API 不兼容\n\n" + "**建议**: 检查 diffusers 版本与模型是否匹配,检查参数名是否正确(true_cfg_scale vs guidance_scale)") + if "import" in error_text.lower() or "ModuleNotFoundError" in error_text.lower(): + return ("**错误类型**: 依赖缺失\n\n" + "**建议**: 检查 requirements,安装缺失的依赖包") + return ("**错误类型**: 未知\n\n" + "**建议**: 请查看上方错误日志进行人工排查") + + +def build_issue_title(pipeline: str, variant: str, date_str: str) -> str: + return f"[CI] {pipeline} / {variant} 运行失败 ({date_str})" + + +def build_issue_body(r: dict, run_url: str) -> str: + error_text = r.get("error", "无错误信息") + lines = [ + "## 失败信息", + f"- **Pipeline**: {r['pipeline']}", + f"- **Variant**: {r['variant']}", + f"- **配置**: {r['config_name']}", + f"- **设备**: {r['device']} / {r['dtype']}", + f"- **并行策略**: {r['parallel']}", + "", + "## 修复建议", + classify_error(error_text), + "", + "## 错误日志", + "```", + error_text[:5000], + "```", + "", + f"## 完整日志", + f"[Actions Run]({run_url})" if run_url else run_url, + ] + return "\n".join(lines) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--report", required=True, help="output directory containing all_results.json") + args = parser.parse_args() + + repo = os.environ.get("GITHUB_REPOSITORY", "luren55/diffusers") + token = os.environ.get("GITHUB_TOKEN", "") + run_url = "" + server_url = os.environ.get("GITHUB_SERVER_URL", "https://github.com") + run_id = os.environ.get("GITHUB_RUN_ID", "") + if server_url and repo and run_id: + run_url = f"{server_url}/{repo}/actions/runs/{run_id}" + + results_path = os.path.join(args.report, "all_results.json") + if not os.path.isfile(results_path): + print(f"ERROR: {results_path} not found") + return + + with open(results_path, "r") as f: + results = json.load(f) + + failed = [r for r in results if r["result"] and r["result"].get("status") == "failed"] + + if not failed: + print("No failures, no issues to create.") + return + + date_str = r["timestamp"][:10] if failed else "unknown-date" + + for r in failed: + title = build_issue_title(r["pipeline"], r["variant"], date_str) + title_prefix = f"[CI] {r['pipeline']} / {r['variant']}" + + existing = find_existing_issues(repo, token, title_prefix) + if existing: + print(f"[SKIP] Issue already exists for {r['pipeline']} / {r['variant']}: {existing[0].get('html_url')}") + continue + + body = build_issue_body(r, run_url) + try: + url = create_issue(repo, token, title, body) + print(f"[OK] Created issue: {url}") + except Exception as e: + print(f"[FAIL] Could not create issue: {e}") + + +if __name__ == "__main__": + main() From 5d972198b05708a05817ce9958d3f0a36171d03e Mon Sep 17 00:00:00 2001 From: CI Runner Date: Thu, 30 Apr 2026 00:21:01 +0800 Subject: [PATCH 12/23] feat: add model_ci.yml GitHub Actions workflow --- .github/workflows/model_ci.yml | 41 ++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 .github/workflows/model_ci.yml diff --git a/.github/workflows/model_ci.yml b/.github/workflows/model_ci.yml new file mode 100644 index 000000000000..4ea230e7e20e --- /dev/null +++ b/.github/workflows/model_ci.yml @@ -0,0 +1,41 @@ +name: Model Pipeline CI + +on: + schedule: + - cron: "0 0 1,15 * *" + workflow_dispatch: + +env: + DIFFUSERS_IS_CI: yes + +jobs: + run_pipelines: + runs-on: [self-hosted, diffusers_ci] + container: + image: diffusers_ci + options: --ipc host --device=/dev/davinci0 --device=/dev/davinci1 + steps: + - uses: actions/checkout@v6 + + - name: Run all pipelines + run: | + python .github/ci_runners/run_pipeline.py \ + --configs .github/ci_runners/configs \ + --output artifacts/run-${GITHUB_RUN_ID} + + - name: Generate report + if: always() + run: python .github/ci_runners/report.py --output artifacts/run-${GITHUB_RUN_ID} + + - name: Create issues for failures + if: failure() + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: python .github/ci_runners/issue_bot.py --report artifacts/run-${GITHUB_RUN_ID} + + - name: Upload artifacts + if: always() + uses: actions/upload-artifact@v6 + with: + name: ci-run-${GITHUB_RUN_ID} + path: artifacts/run-${GITHUB_RUN_ID}/ From 8dc1601c280b71d67568da1d570e383af29353e0 Mon Sep 17 00:00:00 2001 From: CI Runner Date: Wed, 6 May 2026 10:50:48 +0800 Subject: [PATCH 13/23] fix: pass model_id to load_pipeline for modelscope/hf download --- .github/ci_runners/run_pipeline.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/ci_runners/run_pipeline.py b/.github/ci_runners/run_pipeline.py index 953965b574b7..cdc4dc3c8767 100644 --- a/.github/ci_runners/run_pipeline.py +++ b/.github/ci_runners/run_pipeline.py @@ -33,7 +33,7 @@ def save_image(image, output_dir: str, filename: str) -> str: return filepath -def load_pipeline(pipeline_class_name: str, module_path: str, weight_path: str, backend: str, device: str, torch_dtype: torch.dtype): +def load_pipeline(pipeline_class_name: str, module_path: str, weight_path: str, model_id: str, backend: str, device: str, torch_dtype: torch.dtype): module = importlib.import_module(module_path) pipeline_cls = getattr(module, pipeline_class_name) @@ -45,12 +45,18 @@ def load_pipeline(pipeline_class_name: str, module_path: str, weight_path: str, ) elif backend == "modelscope": from modelscope import snapshot_download - local_path = snapshot_download(weight_path) + local_path = snapshot_download(model_id or weight_path) pipe = pipeline_cls.from_pretrained( local_path, torch_dtype=torch_dtype, trust_remote_code=True, ) + elif backend == "hf": + pipe = pipeline_cls.from_pretrained( + model_id, + torch_dtype=torch_dtype, + trust_remote_code=True, + ) else: pipe = pipeline_cls.from_pretrained( weight_path, @@ -182,6 +188,7 @@ def generate_reference_only(config_dir: str, output_dir: str): pipe = load_pipeline( pipeline_class, module_path, variant_data.get("weight_path", variant_data["model_id"]), + variant_data["model_id"], variant_data.get("backend", "local"), device, torch_dtype, ) From 236acae8cec4b7d5b6194f579c7535ed9eacadc8 Mon Sep 17 00:00:00 2001 From: CI Runner Date: Wed, 6 May 2026 10:55:13 +0800 Subject: [PATCH 14/23] fix: switch Qwen variants to modelscope backend --- .github/ci_runners/configs/qwen_image/variants/2512.yaml | 2 +- .github/ci_runners/configs/qwen_image_edit/variants/2511.yaml | 2 +- .../ci_runners/configs/qwen_image_layered/variants/default.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/ci_runners/configs/qwen_image/variants/2512.yaml b/.github/ci_runners/configs/qwen_image/variants/2512.yaml index fa4095ce4793..e6b51b7932f3 100644 --- a/.github/ci_runners/configs/qwen_image/variants/2512.yaml +++ b/.github/ci_runners/configs/qwen_image/variants/2512.yaml @@ -1,4 +1,4 @@ model_id: Qwen/Qwen-Image-2512 weight_path: /home/weights/Qwen-Image-2512 -backend: local +backend: modelscope extra_params: {} diff --git a/.github/ci_runners/configs/qwen_image_edit/variants/2511.yaml b/.github/ci_runners/configs/qwen_image_edit/variants/2511.yaml index a7cabb3c99ba..982c5c5316ea 100644 --- a/.github/ci_runners/configs/qwen_image_edit/variants/2511.yaml +++ b/.github/ci_runners/configs/qwen_image_edit/variants/2511.yaml @@ -1,4 +1,4 @@ model_id: Qwen/Qwen-Image-Edit-2511 weight_path: /home/weights/Qwen-Image-Edit-2511 -backend: local +backend: modelscope extra_params: {} diff --git a/.github/ci_runners/configs/qwen_image_layered/variants/default.yaml b/.github/ci_runners/configs/qwen_image_layered/variants/default.yaml index 1ddce3f26c81..a307307d648a 100644 --- a/.github/ci_runners/configs/qwen_image_layered/variants/default.yaml +++ b/.github/ci_runners/configs/qwen_image_layered/variants/default.yaml @@ -1,4 +1,4 @@ model_id: Qwen/Qwen-Image-Layered weight_path: /home/weights/Qwen-Image-Layered -backend: local +backend: modelscope extra_params: {} From 5181860d66062cceff74f2b7ca8e000161aa2e88 Mon Sep 17 00:00:00 2001 From: CI Runner Date: Wed, 6 May 2026 13:14:34 +0800 Subject: [PATCH 15/23] fix: downgrade checkout/upload-artifact to v4 for node20 compat --- .github/workflows/model_ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/model_ci.yml b/.github/workflows/model_ci.yml index 4ea230e7e20e..4fc8f0dd922d 100644 --- a/.github/workflows/model_ci.yml +++ b/.github/workflows/model_ci.yml @@ -15,7 +15,7 @@ jobs: image: diffusers_ci options: --ipc host --device=/dev/davinci0 --device=/dev/davinci1 steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v4 - name: Run all pipelines run: | @@ -35,7 +35,7 @@ jobs: - name: Upload artifacts if: always() - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v4 with: name: ci-run-${GITHUB_RUN_ID} path: artifacts/run-${GITHUB_RUN_ID}/ From e75b2d9111713e8868f4b1fdc6942def7c834150 Mon Sep 17 00:00:00 2001 From: CI Runner Date: Wed, 6 May 2026 13:32:40 +0800 Subject: [PATCH 16/23] fix: remove container block - runner already inside container --- .github/workflows/model_ci.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/model_ci.yml b/.github/workflows/model_ci.yml index 4fc8f0dd922d..74b14f2658ab 100644 --- a/.github/workflows/model_ci.yml +++ b/.github/workflows/model_ci.yml @@ -11,9 +11,6 @@ env: jobs: run_pipelines: runs-on: [self-hosted, diffusers_ci] - container: - image: diffusers_ci - options: --ipc host --device=/dev/davinci0 --device=/dev/davinci1 steps: - uses: actions/checkout@v4 From 2b26a72176cc2a5b5833107496d6b3c9000630c4 Mon Sep 17 00:00:00 2001 From: CI Runner Date: Wed, 6 May 2026 13:58:35 +0800 Subject: [PATCH 17/23] fix: UnboundLocalError in issue_bot.py date_str reference --- .github/ci_runners/issue_bot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ci_runners/issue_bot.py b/.github/ci_runners/issue_bot.py index 24dcbe67fc4d..f685c16e3682 100644 --- a/.github/ci_runners/issue_bot.py +++ b/.github/ci_runners/issue_bot.py @@ -108,7 +108,7 @@ def main(): print("No failures, no issues to create.") return - date_str = r["timestamp"][:10] if failed else "unknown-date" + date_str = failed[0]["timestamp"][:10] for r in failed: title = build_issue_title(r["pipeline"], r["variant"], date_str) From dafeb65ddb0ac550321a89ec9c51b5f31fce68a2 Mon Sep 17 00:00:00 2001 From: CI Runner Date: Wed, 6 May 2026 13:59:32 +0800 Subject: [PATCH 18/23] fix: remove checkout, use local paths; fix import in run_pipeline.py --- .github/ci_runners/run_pipeline.py | 1 + .github/workflows/model_ci.yml | 16 ++++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/.github/ci_runners/run_pipeline.py b/.github/ci_runners/run_pipeline.py index cdc4dc3c8767..93dc01982a2a 100644 --- a/.github/ci_runners/run_pipeline.py +++ b/.github/ci_runners/run_pipeline.py @@ -11,6 +11,7 @@ import torch from diffusers import DiffusionPipeline +sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)))) from runner_utils import detect_device, timer, validate_image, compare_with_reference diff --git a/.github/workflows/model_ci.yml b/.github/workflows/model_ci.yml index 74b14f2658ab..590314f554ca 100644 --- a/.github/workflows/model_ci.yml +++ b/.github/workflows/model_ci.yml @@ -12,27 +12,31 @@ jobs: run_pipelines: runs-on: [self-hosted, diffusers_ci] steps: - - uses: actions/checkout@v4 - - name: Run all pipelines run: | + cd /home/m30063890/diffusers + git pull origin main python .github/ci_runners/run_pipeline.py \ --configs .github/ci_runners/configs \ - --output artifacts/run-${GITHUB_RUN_ID} + --output /tmp/artifacts/run-${GITHUB_RUN_ID} - name: Generate report if: always() - run: python .github/ci_runners/report.py --output artifacts/run-${GITHUB_RUN_ID} + run: | + cd /home/m30063890/diffusers + python .github/ci_runners/report.py --output /tmp/artifacts/run-${GITHUB_RUN_ID} - name: Create issues for failures if: failure() env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: python .github/ci_runners/issue_bot.py --report artifacts/run-${GITHUB_RUN_ID} + run: | + cd /home/m30063890/diffusers + python .github/ci_runners/issue_bot.py --report /tmp/artifacts/run-${GITHUB_RUN_ID} - name: Upload artifacts if: always() uses: actions/upload-artifact@v4 with: name: ci-run-${GITHUB_RUN_ID} - path: artifacts/run-${GITHUB_RUN_ID}/ + path: /tmp/artifacts/run-${GITHUB_RUN_ID}/ From e0dd1e23c65db2e72a7160f6c114ec62b51b387b Mon Sep 17 00:00:00 2001 From: CI Runner Date: Wed, 6 May 2026 14:10:22 +0800 Subject: [PATCH 19/23] fix: add missing model_id arg in main loop load_pipeline call --- .github/ci_runners/run_pipeline.py | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ci_runners/run_pipeline.py b/.github/ci_runners/run_pipeline.py index 93dc01982a2a..233e97620d8a 100644 --- a/.github/ci_runners/run_pipeline.py +++ b/.github/ci_runners/run_pipeline.py @@ -265,6 +265,7 @@ def main(): pipe = load_pipeline( pipeline_class, module_path, variant_data.get("weight_path", variant_data["model_id"]), + variant_data["model_id"], variant_data.get("backend", "local"), device, torch_dtype, ) From 5de232933523a48c96dd0d2bd7da5f3766adbfed Mon Sep 17 00:00:00 2001 From: CI Runner Date: Wed, 6 May 2026 18:47:57 +0800 Subject: [PATCH 20/23] fix: remove ltx2, boundary_ratio/expand_timesteps from extra_params, add NPU empty_cache --- .github/ci_runners/configs/ltx2/config.yaml | 16 -- .../configs/ltx2/variants/ltx_2.3.yaml | 6 - .../wan_pipeline/variants/wan2.2_ti2v_5b.yaml | 3 +- .../wan_vace/variants/flf2v_14b_720p.yaml | 4 +- .../configs/wan_vace/variants/vace_14b.yaml | 4 +- .github/ci_runners/run_pipeline.py | 10 +- .gitignore | 193 +----------------- 7 files changed, 16 insertions(+), 220 deletions(-) delete mode 100644 .github/ci_runners/configs/ltx2/config.yaml delete mode 100644 .github/ci_runners/configs/ltx2/variants/ltx_2.3.yaml diff --git a/.github/ci_runners/configs/ltx2/config.yaml b/.github/ci_runners/configs/ltx2/config.yaml deleted file mode 100644 index 93e048acfdb4..000000000000 --- a/.github/ci_runners/configs/ltx2/config.yaml +++ /dev/null @@ -1,16 +0,0 @@ -pipeline_class: LTX2Pipeline -module: diffusers.pipelines.ltx2.pipeline_ltx2 - -params_grid: - - name: "landscape_50steps_single" - width: 768 - height: 512 - num_inference_steps: 50 - guidance_scale: 4.0 - num_frames: 49 - stg_scale: 0.0 - parallel: "single" - -prompt: "A cat walking on a beach at sunset, cinematic quality." -negative_prompt: "blurry, low quality, distorted." -reference_config: "landscape_50steps_single" diff --git a/.github/ci_runners/configs/ltx2/variants/ltx_2.3.yaml b/.github/ci_runners/configs/ltx2/variants/ltx_2.3.yaml deleted file mode 100644 index 30b66cefefae..000000000000 --- a/.github/ci_runners/configs/ltx2/variants/ltx_2.3.yaml +++ /dev/null @@ -1,6 +0,0 @@ -model_id: Lightricks/LTX-2.3 -weight_path: /home/weights/LTX-2.3 -backend: modelscope -extra_params: - use_cross_timestep: true - spatio_temporal_guidance_blocks: [28] diff --git a/.github/ci_runners/configs/wan_pipeline/variants/wan2.2_ti2v_5b.yaml b/.github/ci_runners/configs/wan_pipeline/variants/wan2.2_ti2v_5b.yaml index 3b619dd02a5f..6ed3bb11e840 100644 --- a/.github/ci_runners/configs/wan_pipeline/variants/wan2.2_ti2v_5b.yaml +++ b/.github/ci_runners/configs/wan_pipeline/variants/wan2.2_ti2v_5b.yaml @@ -1,5 +1,4 @@ model_id: Wan-AI/Wan2.2-TI2V-5B-Diffusers weight_path: /home/weights/Wan2.2-TI2V-5B-Diffusers backend: modelscope -extra_params: - expand_timesteps: true +extra_params: {} diff --git a/.github/ci_runners/configs/wan_vace/variants/flf2v_14b_720p.yaml b/.github/ci_runners/configs/wan_vace/variants/flf2v_14b_720p.yaml index e1bd90b5a776..1ed66107ff53 100644 --- a/.github/ci_runners/configs/wan_vace/variants/flf2v_14b_720p.yaml +++ b/.github/ci_runners/configs/wan_vace/variants/flf2v_14b_720p.yaml @@ -1,6 +1,4 @@ model_id: Wan-AI/Wan2.1-FLF2V-14B-720P-diffusers weight_path: /home/weights/Wan2.1-FLF2V-14B-720P-diffusers backend: modelscope -extra_params: - boundary_ratio: 0.875 - guidance_scale_2: 5.0 +extra_params: {} diff --git a/.github/ci_runners/configs/wan_vace/variants/vace_14b.yaml b/.github/ci_runners/configs/wan_vace/variants/vace_14b.yaml index 766c06c7714a..a5eb62a9b86f 100644 --- a/.github/ci_runners/configs/wan_vace/variants/vace_14b.yaml +++ b/.github/ci_runners/configs/wan_vace/variants/vace_14b.yaml @@ -1,6 +1,4 @@ model_id: Wan-AI/Wan2.1-VACE-14B-diffusers weight_path: /home/weights/Wan2.1-VACE-14B-diffusers backend: modelscope -extra_params: - boundary_ratio: 0.875 - guidance_scale_2: 5.0 +extra_params: {} diff --git a/.github/ci_runners/run_pipeline.py b/.github/ci_runners/run_pipeline.py index 233e97620d8a..cbf24b8a9ed8 100644 --- a/.github/ci_runners/run_pipeline.py +++ b/.github/ci_runners/run_pipeline.py @@ -208,8 +208,10 @@ def generate_reference_only(config_dir: str, output_dir: str): print(f"[{pipeline_name}] reference saved to {ref_path}") del pipe - if device in ("cuda", "npu"): - torch.cuda.empty_cache() if device == "cuda" else None + if device == "cuda": + torch.cuda.empty_cache() + elif device == "npu": + torch.npu.empty_cache() def scan_pipelines(configs_root: str) -> list[str]: @@ -316,8 +318,10 @@ def main(): print(f" FAIL") del pipe - if device in ("cuda", "npu"): + if device == "cuda": torch.cuda.empty_cache() + elif device == "npu": + torch.npu.empty_cache() results_path = os.path.join(args.output, "all_results.json") with open(results_path, "w") as f: diff --git a/.gitignore b/.gitignore index 5d19ea2db3c9..a75f1067ecae 100644 --- a/.gitignore +++ b/.gitignore @@ -1,187 +1,6 @@ -# Initially taken from GitHub's Python gitignore file - -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# tests and logs -tests/fixtures/cached_*_text.txt -logs/ -lightning_logs/ -lang_code_data/ - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a Python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -.python-version - -# celery beat schedule file -celerybeat-schedule - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# vscode -.vs -.vscode - -# Cursor -.cursor - -# Pycharm -.idea - -# TF code -tensorflow_code - -# Models -proc_data - -# examples -runs -/runs_old -/wandb -/examples/runs -/examples/**/*.args -/examples/rag/sweep - -# data -/data -serialization_dir - -# emacs -*.*~ -debug.env - -# vim -.*.swp - -# ctags -tags - -# pre-commit -.pre-commit* - -# .lock -*.lock - -# DS_Store (MacOS) -.DS_Store - -# RL pipelines may produce mp4 outputs -*.mp4 - -# dependencies -/transformers - -# ruff -.ruff_cache - -# wandb -wandb - -# AI agent generated symlinks -/AGENTS.md -/CLAUDE.md -/.agents/skills -/.claude/skills \ No newline at end of file +# CI runner artifacts +_actions/ +_PipelineMapping/ +_update/ +diffusers/ +fusion_result.json From 2995cd09608da280d874037ddb4668886d736544 Mon Sep 17 00:00:00 2001 From: CI Runner Date: Wed, 6 May 2026 19:16:11 +0800 Subject: [PATCH 21/23] fix: reduce resolution, add image input for I2V/VACE/Edit, gc.collect for NPU memory --- .../configs/qwen_image_edit/config.yaml | 1 + .github/ci_runners/configs/wan_i2v/config.yaml | 13 +++++++------ .../ci_runners/configs/wan_vace/config.yaml | 13 +++++++------ .github/ci_runners/run_pipeline.py | 10 ++++++++++ .github/ci_runners/test_data/sample_input.png | Bin 0 -> 788082 bytes .gitignore | 2 ++ 6 files changed, 27 insertions(+), 12 deletions(-) create mode 100644 .github/ci_runners/test_data/sample_input.png diff --git a/.github/ci_runners/configs/qwen_image_edit/config.yaml b/.github/ci_runners/configs/qwen_image_edit/config.yaml index 476cfba6e5a4..3e882a2ef294 100644 --- a/.github/ci_runners/configs/qwen_image_edit/config.yaml +++ b/.github/ci_runners/configs/qwen_image_edit/config.yaml @@ -8,6 +8,7 @@ params_grid: num_inference_steps: 50 true_cfg_scale: 4.0 parallel: "single" + image: ".github/ci_runners/test_data/sample_input.png" prompt: "Transform this image into a watercolor painting style." negative_prompt: "blurry, low quality, distorted." diff --git a/.github/ci_runners/configs/wan_i2v/config.yaml b/.github/ci_runners/configs/wan_i2v/config.yaml index 42495ead138f..6cdc4e2136c7 100644 --- a/.github/ci_runners/configs/wan_i2v/config.yaml +++ b/.github/ci_runners/configs/wan_i2v/config.yaml @@ -2,14 +2,15 @@ pipeline_class: WanImageToVideoPipeline module: diffusers.pipelines.wan.pipeline_wan_i2v params_grid: - - name: "square_50steps_single" - width: 832 - height: 480 - num_inference_steps: 50 + - name: "small_30steps_single" + width: 480 + height: 272 + num_inference_steps: 30 guidance_scale: 5.0 - num_frames: 81 + num_frames: 33 parallel: "single" + image: ".github/ci_runners/test_data/sample_input.png" prompt: "A cat walking on a beach at sunset, cinematic quality." negative_prompt: "blurry, low quality, distorted." -reference_config: "square_50steps_single" +reference_config: "small_30steps_single" diff --git a/.github/ci_runners/configs/wan_vace/config.yaml b/.github/ci_runners/configs/wan_vace/config.yaml index 4fb45fb443ec..30fefa65883b 100644 --- a/.github/ci_runners/configs/wan_vace/config.yaml +++ b/.github/ci_runners/configs/wan_vace/config.yaml @@ -2,14 +2,15 @@ pipeline_class: WanVACEPipeline module: diffusers.pipelines.wan.pipeline_wan_vace params_grid: - - name: "square_50steps_single" - width: 832 - height: 480 - num_inference_steps: 50 + - name: "small_30steps_single" + width: 480 + height: 272 + num_inference_steps: 30 guidance_scale: 5.0 - num_frames: 81 + num_frames: 33 parallel: "single" + image: ".github/ci_runners/test_data/sample_input.png" prompt: "A cat walking on a beach at sunset, cinematic quality." negative_prompt: "blurry, low quality, distorted." -reference_config: "square_50steps_single" +reference_config: "small_30steps_single" diff --git a/.github/ci_runners/run_pipeline.py b/.github/ci_runners/run_pipeline.py index cbf24b8a9ed8..1cd813140f6a 100644 --- a/.github/ci_runners/run_pipeline.py +++ b/.github/ci_runners/run_pipeline.py @@ -1,4 +1,5 @@ import argparse +import gc import importlib import json import os @@ -95,6 +96,14 @@ def build_kwargs(params_grid_entry: dict, prompt: str, negative_prompt: str, dev if extra_params: kwargs.update(extra_params) + if "image" in kwargs and isinstance(kwargs["image"], str): + from PIL import Image + image_path = kwargs["image"] + if os.path.isfile(image_path): + kwargs["image"] = Image.open(image_path).convert("RGB") + else: + del kwargs["image"] + gen_device = "cuda" if device == "cuda" else "cpu" kwargs["generator"] = torch.Generator(device=gen_device).manual_seed(42) @@ -208,6 +217,7 @@ def generate_reference_only(config_dir: str, output_dir: str): print(f"[{pipeline_name}] reference saved to {ref_path}") del pipe + gc.collect() if device == "cuda": torch.cuda.empty_cache() elif device == "npu": diff --git a/.github/ci_runners/test_data/sample_input.png b/.github/ci_runners/test_data/sample_input.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb1cb5e0c346fc9415ef59c190538ecb7d61098 GIT binary patch literal 788082 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