Skip to content

lingbot_video_pipeline

Stage-composed LingBot-Video Dense and MoE/refiner T2V pipeline.

Classes

fastvideo.pipelines.basic.lingbot_video.lingbot_video_pipeline.LingBotVideoPipeline

LingBotVideoPipeline(*args, **kwargs)

Bases: LoRAPipeline, ComposedPipelineBase

T2V pipeline with optional released MoE pixel-space refinement.

Source code in fastvideo/pipelines/lora_pipeline.py
def __init__(self, *args, **kwargs) -> None:
    super().__init__(*args, **kwargs)
    self.device = get_local_torch_device()
    self.lora_adapter_paths = {}
    # build list of trainable transformers
    for transformer_name in self.trainable_transformer_names:
        if (transformer_name in self.modules and self.modules[transformer_name] is not None):
            self.trainable_transformer_modules[transformer_name] = (self.modules[transformer_name])
        # check for transformer_2 in case of Wan2.2 MoE or fake_score_transformer_2
        if transformer_name.endswith("_2"):
            raise ValueError(
                f"trainable_transformer_name override in pipelines should not include _2 suffix: {transformer_name}"
            )

        secondary_transformer_name = transformer_name + "_2"
        if (secondary_transformer_name in self.modules and self.modules[secondary_transformer_name] is not None):
            self.trainable_transformer_modules[secondary_transformer_name] = self.modules[
                secondary_transformer_name]

    logger.info(
        "trainable_transformer_modules: %s",
        self.trainable_transformer_modules.keys(),
    )

    for (
            transformer_name,
            transformer_module,
    ) in self.trainable_transformer_modules.items():
        self.exclude_lora_layers[transformer_name] = (transformer_module.config.arch_config.exclude_lora_layers)
    self.lora_target_modules = self.fastvideo_args.lora_target_modules
    self.lora_path = self.fastvideo_args.lora_path
    self.lora_nickname = self.fastvideo_args.lora_nickname
    self.training_mode = self.fastvideo_args.training_mode
    if self.training_mode and getattr(self.fastvideo_args, "lora_training", False):
        assert isinstance(self.fastvideo_args, TrainingArgs)
        if self.fastvideo_args.lora_alpha is None:
            self.fastvideo_args.lora_alpha = self.fastvideo_args.lora_rank
        self.lora_rank = self.fastvideo_args.lora_rank  # type: ignore
        self.lora_alpha = self.fastvideo_args.lora_alpha  # type: ignore
        logger.info(
            "Using LoRA training with rank %d and alpha %d",
            self.lora_rank,
            self.lora_alpha,
        )
        if self.lora_target_modules is None:
            self.lora_target_modules = [
                "q_proj",
                "k_proj",
                "v_proj",
                "o_proj",
                "to_q",
                "to_k",
                "to_v",
                "to_out",
                "to_qkv",
                "to_gate_compress",
            ]
            logger.info(
                "Using default lora_target_modules for all transformers: %s",
                self.lora_target_modules,
            )
        else:
            logger.warning(
                "Using custom lora_target_modules for all transformers, which may not be intended: %s",
                self.lora_target_modules,
            )

        self.convert_to_lora_layers()
    # Inference
    elif not self.training_mode and self.lora_path is not None:
        self.convert_to_lora_layers()
        self.set_lora_adapter(
            self.lora_nickname,  # type: ignore
            self.lora_path,
        )  # type: ignore

Methods:

fastvideo.pipelines.basic.lingbot_video.lingbot_video_pipeline.LingBotVideoPipeline.create_pipeline_stages
create_pipeline_stages(fastvideo_args: FastVideoArgs) -> None

Create base generation and the optional decoded-video refiner stages.

Source code in fastvideo/pipelines/basic/lingbot_video/lingbot_video_pipeline.py
def create_pipeline_stages(self, fastvideo_args: FastVideoArgs) -> None:
    """Create base generation and the optional decoded-video refiner stages."""
    refiner = self.get_module("transformer_2")
    self.add_stage(
        "input_validation_stage",
        LingBotVideoInputValidationStage(refiner_enabled=refiner is not None),
    )
    self.add_stage(
        "prompt_encoding_stage",
        TextEncodingStage(
            text_encoders=[self.get_module("text_encoder")],
            tokenizers=[self.get_module("tokenizer")],
        ),
    )
    self.add_stage("conditioning_stage", ConditioningStage())
    self.add_stage(
        "timestep_preparation_stage",
        TimestepPreparationStage(scheduler=self.get_module("scheduler")),
    )
    self.add_stage(
        "latent_preparation_stage",
        LingBotVideoLatentPreparationStage(transformer=self.get_module("transformer")),
    )
    self.add_stage(
        "denoising_stage",
        LingBotVideoDenoisingStage(
            transformer=self.get_module("transformer"),
            scheduler=self.get_module("scheduler"),
        ),
    )
    self.add_stage(
        "decoding_stage",
        DecodingStage(vae=self.get_module("vae"), pipeline=self),
    )
    if refiner is not None:
        self.add_stage(
            "refiner_preparation_stage",
            LingBotVideoRefinerPreparationStage(
                vae=self.get_module("vae"),
                scheduler=self.get_module("scheduler"),
            ),
        )
        self.add_stage(
            "refiner_denoising_stage",
            LingBotVideoDenoisingStage(
                transformer=refiner,
                scheduler=self.get_module("scheduler"),
                refiner=True,
            ),
        )
        self.add_stage(
            "refiner_decoding_stage",
            DecodingStage(vae=self.get_module("vae"), pipeline=self),
        )
fastvideo.pipelines.basic.lingbot_video.lingbot_video_pipeline.LingBotVideoPipeline.initialize_pipeline
initialize_pipeline(fastvideo_args: FastVideoArgs) -> None

Apply the released runtime flow shift to the loaded scheduler.

Source code in fastvideo/pipelines/basic/lingbot_video/lingbot_video_pipeline.py
def initialize_pipeline(self, fastvideo_args: FastVideoArgs) -> None:
    """Apply the released runtime flow shift to the loaded scheduler."""
    shift = fastvideo_args.pipeline_config.flow_shift
    if shift is None:
        raise ValueError("LingBot-Video requires a flow shift")
    self.get_module("scheduler").set_shift(float(shift))
fastvideo.pipelines.basic.lingbot_video.lingbot_video_pipeline.LingBotVideoPipeline.load_modules
load_modules(fastvideo_args: FastVideoArgs, loaded_modules: dict[str, Any] | None = None) -> dict[str, Any]

Load the optional refiner DiT and the VAE encoder only when declared.

Source code in fastvideo/pipelines/basic/lingbot_video/lingbot_video_pipeline.py
def load_modules(
    self,
    fastvideo_args: FastVideoArgs,
    loaded_modules: dict[str, Any] | None = None,
) -> dict[str, Any]:
    """Load the optional refiner DiT and the VAE encoder only when declared."""
    model_index = self._load_config(self.model_path)
    required = list(type(self)._required_config_modules)
    load_refiner = "transformer_2" in model_index and getattr(fastvideo_args, "refine_enabled", None) is not False
    if load_refiner:
        required.append("transformer_2")
        fastvideo_args.pipeline_config.vae_config.load_encoder = True
    self._required_config_modules = required
    return super().load_modules(fastvideo_args, loaded_modules)