From 9d239e9f8b69924a2bc6089ba3dc8c4b2ebb9509 Mon Sep 17 00:00:00 2001 From: SolitaryThinker Date: Fri, 31 Oct 2025 20:52:31 +0000 Subject: [PATCH] prepare for wan2.2 self-forcing --- fastvideo/configs/pipelines/registry.py | 3 +- fastvideo/configs/pipelines/wan.py | 10 +++++ fastvideo/configs/sample/registry.py | 52 +++++++++++++++++-------- fastvideo/configs/sample/wan.py | 17 +++++++- 4 files changed, 63 insertions(+), 19 deletions(-) diff --git a/fastvideo/configs/pipelines/registry.py b/fastvideo/configs/pipelines/registry.py index 8803d0765..6fce86e48 100644 --- a/fastvideo/configs/pipelines/registry.py +++ b/fastvideo/configs/pipelines/registry.py @@ -13,7 +13,7 @@ from fastvideo.configs.pipelines.wan import ( FastWan2_1_T2V_480P_Config, FastWan2_2_TI2V_5B_Config, Wan2_2_I2V_A14B_Config, Wan2_2_T2V_A14B_Config, Wan2_2_TI2V_5B_Config, WanI2V480PConfig, WanI2V720PConfig, WanT2V480PConfig, WanT2V720PConfig, - SelfForcingWanT2V480PConfig, WANV2VConfig) + SelfForcingWanT2V480PConfig, WANV2VConfig, SelfForcingWan2_2_T2V480PConfig) # isort: on from fastvideo.logger import init_logger from fastvideo.utils import (maybe_download_model_index, @@ -37,6 +37,7 @@ PIPE_NAME_TO_CONFIG: dict[str, type[PipelineConfig]] = { "FastVideo/stepvideo-t2v-diffusers": StepVideoT2VConfig, "FastVideo/Wan2.1-VSA-T2V-14B-720P-Diffusers": WanT2V720PConfig, "wlsaidhi/SFWan2.1-T2V-1.3B-Diffusers": SelfForcingWanT2V480PConfig, + "rand0nmr/SFWan2.2-T2V-A14B-Diffusers": SelfForcingWan2_2_T2V480PConfig, "Wan-AI/Wan2.2-TI2V-5B-Diffusers": Wan2_2_TI2V_5B_Config, "Wan-AI/Wan2.2-T2V-A14B-Diffusers": Wan2_2_T2V_A14B_Config, "Wan-AI/Wan2.2-I2V-A14B-Diffusers": Wan2_2_I2V_A14B_Config, diff --git a/fastvideo/configs/pipelines/wan.py b/fastvideo/configs/pipelines/wan.py index 139d2bb90..17c3420f9 100644 --- a/fastvideo/configs/pipelines/wan.py +++ b/fastvideo/configs/pipelines/wan.py @@ -176,3 +176,13 @@ class SelfForcingWanT2V480PConfig(WanT2V480PConfig): dmd_denoising_steps: list[int] | None = field( default_factory=lambda: [1000, 750, 500, 250]) warp_denoising_step: bool = True + + +@dataclass +class SelfForcingWan2_2_T2V480PConfig(Wan2_2_T2V_A14B_Config): + is_causal: bool = True + flow_shift: float | None = 12.0 + boundary_ratio: float | None = 0.875 + dmd_denoising_steps: list[int] | None = field( + default_factory=lambda: [1000, 850, 700, 550, 350, 275, 200, 125]) + warp_denoising_step: bool = True diff --git a/fastvideo/configs/sample/registry.py b/fastvideo/configs/sample/registry.py index 1a551cafd..753ba64d6 100644 --- a/fastvideo/configs/sample/registry.py +++ b/fastvideo/configs/sample/registry.py @@ -9,7 +9,7 @@ from fastvideo.configs.sample.stepvideo import StepVideoT2VSamplingParam # isort: off from fastvideo.configs.sample.wan import ( - FastWanT2V480PConfig, + FastWanT2V480P_SamplingParam, Wan2_1_Fun_1_3B_InP_SamplingParam, Wan2_2_I2V_A14B_SamplingParam, Wan2_2_T2V_A14B_SamplingParam, @@ -19,7 +19,8 @@ from fastvideo.configs.sample.wan import ( WanT2V_1_3B_SamplingParam, WanT2V_14B_SamplingParam, Wan2_1_Fun_1_3B_Control_SamplingParam, - SelfForcingWanT2V480PConfig, + SelfForcingWan2_1_T2V_1_3B_480P_SamplingParam, + SelfForcingWan2_2_T2V_A14B_480P_SamplingParam, ) # isort: on from fastvideo.logger import init_logger @@ -29,35 +30,50 @@ from fastvideo.utils import (maybe_download_model_index, logger = init_logger(__name__) # Registry maps specific model weights to their config classes SAMPLING_PARAM_REGISTRY: dict[str, Any] = { - "FastVideo/FastHunyuan-diffusers": FastHunyuanSamplingParam, - "hunyuanvideo-community/HunyuanVideo": HunyuanSamplingParam, - "FastVideo/stepvideo-t2v-diffusers": StepVideoT2VSamplingParam, + "FastVideo/FastHunyuan-diffusers": + FastHunyuanSamplingParam, + "hunyuanvideo-community/HunyuanVideo": + HunyuanSamplingParam, + "FastVideo/stepvideo-t2v-diffusers": + StepVideoT2VSamplingParam, # Wan2.1 - "Wan-AI/Wan2.1-T2V-1.3B-Diffusers": WanT2V_1_3B_SamplingParam, - "Wan-AI/Wan2.1-T2V-14B-Diffusers": WanT2V_14B_SamplingParam, - "Wan-AI/Wan2.1-I2V-14B-480P-Diffusers": WanI2V_14B_480P_SamplingParam, - "Wan-AI/Wan2.1-I2V-14B-720P-Diffusers": WanI2V_14B_720P_SamplingParam, + "Wan-AI/Wan2.1-T2V-1.3B-Diffusers": + WanT2V_1_3B_SamplingParam, + "Wan-AI/Wan2.1-T2V-14B-Diffusers": + WanT2V_14B_SamplingParam, + "Wan-AI/Wan2.1-I2V-14B-480P-Diffusers": + WanI2V_14B_480P_SamplingParam, + "Wan-AI/Wan2.1-I2V-14B-720P-Diffusers": + WanI2V_14B_720P_SamplingParam, "weizhou03/Wan2.1-Fun-1.3B-InP-Diffusers": Wan2_1_Fun_1_3B_InP_SamplingParam, "IRMChen/Wan2.1-Fun-1.3B-Control-Diffusers": Wan2_1_Fun_1_3B_Control_SamplingParam, # Wan2.2 - "Wan-AI/Wan2.2-TI2V-5B-Diffusers": Wan2_2_TI2V_5B_SamplingParam, + "Wan-AI/Wan2.2-TI2V-5B-Diffusers": + Wan2_2_TI2V_5B_SamplingParam, "FastVideo/FastWan2.2-TI2V-5B-FullAttn-Diffusers": Wan2_2_TI2V_5B_SamplingParam, - "Wan-AI/Wan2.2-T2V-A14B-Diffusers": Wan2_2_T2V_A14B_SamplingParam, - "Wan-AI/Wan2.2-I2V-A14B-Diffusers": Wan2_2_I2V_A14B_SamplingParam, + "Wan-AI/Wan2.2-T2V-A14B-Diffusers": + Wan2_2_T2V_A14B_SamplingParam, + "Wan-AI/Wan2.2-I2V-A14B-Diffusers": + Wan2_2_I2V_A14B_SamplingParam, # FastWan2.1 - "FastVideo/FastWan2.1-T2V-1.3B-Diffusers": FastWanT2V480PConfig, + "FastVideo/FastWan2.1-T2V-1.3B-Diffusers": + FastWanT2V480P_SamplingParam, # FastWan2.2 - "FastVideo/FastWan2.2-TI2V-5B-Diffusers": Wan2_2_TI2V_5B_SamplingParam, + "FastVideo/FastWan2.2-TI2V-5B-Diffusers": + Wan2_2_TI2V_5B_SamplingParam, # Causal Self-Forcing Wan2.1 - "wlsaidhi/SFWan2.1-T2V-1.3B-Diffusers": SelfForcingWanT2V480PConfig, + "wlsaidhi/SFWan2.1-T2V-1.3B-Diffusers": + SelfForcingWan2_1_T2V_1_3B_480P_SamplingParam, + "rand0nmr/SFWan2.2-T2V-A14B-Diffusers": + SelfForcingWan2_2_T2V_A14B_480P_SamplingParam, # Add other specific weight variants } @@ -67,6 +83,8 @@ SAMPLING_PARAM_DETECTOR: dict[str, Callable[[str], bool]] = { "wanpipeline": lambda id: "wanpipeline" in id.lower(), "wanimagetovideo": lambda id: "wanimagetovideo" in id.lower(), "stepvideo": lambda id: "stepvideo" in id.lower(), + "wandmdpipeline": lambda id: "wandmdpipeline" in id.lower(), + "wancausaldmdpipeline": lambda id: "wancausaldmdpipeline" in id.lower(), # Add other pipeline architecture detectors } @@ -77,7 +95,9 @@ SAMPLING_FALLBACK_PARAM: dict[str, Any] = { "wanpipeline": WanT2V_1_3B_SamplingParam, # Base Wan config as fallback for any Wan variant "wanimagetovideo": WanI2V_14B_480P_SamplingParam, - "stepvideo": StepVideoT2VSamplingParam + "wandmdpipeline": FastWanT2V480P_SamplingParam, + "wancausaldmdpipeline": SelfForcingWan2_1_T2V_1_3B_480P_SamplingParam, + "stepvideo": StepVideoT2VSamplingParam, # Other fallbacks by architecture } diff --git a/fastvideo/configs/sample/wan.py b/fastvideo/configs/sample/wan.py index 8beab07f9..a13556351 100644 --- a/fastvideo/configs/sample/wan.py +++ b/fastvideo/configs/sample/wan.py @@ -97,7 +97,7 @@ class WanI2V_14B_720P_SamplingParam(WanT2V_14B_SamplingParam): @dataclass -class FastWanT2V480PConfig(WanT2V_1_3B_SamplingParam): +class FastWanT2V480P_SamplingParam(WanT2V_1_3B_SamplingParam): # DMD parameters # dmd_denoising_steps: list[int] | None = field(default_factory=lambda: [1000, 757, 522]) num_inference_steps: int = 3 @@ -183,5 +183,18 @@ class Wan2_2_Fun_A14B_Control_SamplingParam( # ============= Causal Self-Forcing ============= # ============================================= @dataclass -class SelfForcingWanT2V480PConfig(WanT2V_1_3B_SamplingParam): +class SelfForcingWan2_1_T2V_1_3B_480P_SamplingParam( + Wan2_1_Fun_1_3B_InP_SamplingParam): pass + + +@dataclass +class SelfForcingWan2_2_T2V_A14B_480P_SamplingParam( + Wan2_2_T2V_A14B_SamplingParam): + guidance_scale: float = 2.0 + guidance_scale_2: float = 2.0 + num_inference_steps: int = 8 + num_frames: int = 81 + height: int = 448 + width: int = 832 + fps: int = 16