Add diffusion backend & Wan training support#779
Open
zirui wants to merge 20 commits into
Open
Conversation
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Contributor
There was a problem hiding this comment.
Pull request overview
This PR introduces an in-tree Primus diffusion backend to enable training WAN2.1/WAN2.2 diffusion video models using the existing Primus lifecycle (configs, launch, logging, checkpointing), with a PyTorch FSDP2 + optional Ulysses sequence-parallel trainer stack.
Changes:
- Added a new
primus.backends.diffusionbackend (adapter, registry, trainer, distributed/checkpoint utilities, attention backends). - Added WAN model components + training pipeline (DiT, VAE, UMT5 encoder, flow-matching scheduler).
- Added runner hooks, example configs, and backend documentation to support pretrain/posttrain flows.
Reviewed changes
Copilot reviewed 54 out of 54 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| runner/helpers/hooks/train/pretrain/diffusion/requirements-diffusion.txt | Extra Python deps for diffusion training hook installation. |
| runner/helpers/hooks/train/pretrain/diffusion/prepare.py | Pre-flight validation script for diffusion module configs/assets. |
| runner/helpers/hooks/train/pretrain/diffusion/00_install_requirements.sh | Hook script to install diffusion requirements with pip caching. |
| runner/helpers/hooks/train/posttrain/diffusion/prepare.py | Posttrain prepare wrapper invoking the pretrain validator with post_trainer. |
| primus/configs/modules/diffusion/pre_trainer.yaml | Diffusion pretrain module preset (stage wiring). |
| primus/configs/modules/diffusion/post_trainer.yaml | Diffusion posttrain module preset (stage/trainable wiring). |
| primus/configs/models/diffusion/wan2.2_ti2v_5b.yaml | WAN2.2 TI2V model preset (paths + encoder assets). |
| primus/configs/models/diffusion/wan2.2_ti2v_5b_sft.yaml | WAN2.2 SFT preset overriding init checkpoint convention. |
| primus/configs/models/diffusion/wan2.1_t2v_1.3b.yaml | WAN2.1 T2V model preset (paths + encoder assets). |
| primus/configs/models/diffusion/wan2.1_t2v_1.3b_sft.yaml | WAN2.1 SFT preset overriding init checkpoint convention. |
| primus/backends/diffusion/utils/vision_process.py | Vendored vision/video processing utilities (qwen-vl-utils derived). |
| primus/backends/diffusion/utils/train_utils.py | Training helper utilities (dtype/seed/state-dict utilities). |
| primus/backends/diffusion/utils/log.py | Loguru proxy to ensure Primus-bound extra fields are present. |
| primus/backends/diffusion/utils/data_utils.py | Small video frame-count helpers. |
| primus/backends/diffusion/utils/init.py | Diffusion utils package init/documentation. |
| primus/backends/diffusion/trainers/fsdp2.py | WAN FSDP2 trainer implementation (wrapping, grad sync, checkpointing). |
| primus/backends/diffusion/trainers/base.py | Shared training loop + optimizer/scheduler plumbing for WAN trainers. |
| primus/backends/diffusion/trainers/init.py | Trainer builder exports. |
| primus/backends/diffusion/schedulers/flow_match.py | Flow-matching scheduler used by WAN training. |
| primus/backends/diffusion/registry.py | Explicit diffusion factory registry (model/dataset/trainer builders). |
| primus/backends/diffusion/README.md | Backend-level documentation (data, checkpoints, launch, configs). |
| primus/backends/diffusion/optim/adamw_fp32_state.py | AdamW variant maintaining FP32 optimizer state for bf16/fp16 params. |
| primus/backends/diffusion/models/wan/wan_dit.py | Vendored WAN DiT backbone with SP-aware RoPE/attention integration. |
| primus/backends/diffusion/models/wan/vae2_1.py | Vendored WAN2.1 VAE wrapper with minor Primus compatibility helpers. |
| primus/backends/diffusion/models/wan/train_pipeline.py | Training pipeline computing flow-match loss over VAE latents. |
| primus/backends/diffusion/models/wan/t5.py | UMT5-XXL encoder-only implementation + meta-init checkpoint loader. |
| primus/backends/diffusion/models/wan/configuration_wanvideo.py | WAN config container used to drive component construction. |
| primus/backends/diffusion/models/wan/components.py | Container dataclass for WAN components (dit/vae/text encoder). |
| primus/backends/diffusion/models/wan/attention_backend.py | Vendored attention backend shim with CPU fallback behavior. |
| primus/backends/diffusion/models/wan/adapter.py | GenAIModel adapter exposing forward_train/freeze/to() semantics. |
| primus/backends/diffusion/models/wan/init.py | WAN model package exports. |
| primus/backends/diffusion/models/registrations/wan.py | WAN model builder/loader (config, DiT/VAE/T5 wiring, checkpoint load). |
| primus/backends/diffusion/models/registrations/init.py | Model registrations package init. |
| primus/backends/diffusion/models/interface.py | GenAIModel interface definition for train/inference entrypoints. |
| primus/backends/diffusion/models/init.py | Diffusion model exports. |
| primus/backends/diffusion/distributed/ulysses.py | Ulysses sequence-parallel collectives + autograd-safe split/gather. |
| primus/backends/diffusion/distributed/mesh.py | DeviceMesh creation + distributed init utilities for DP/SP/HSDP shapes. |
| primus/backends/diffusion/distributed/checkpoint.py | DTCP save/load utilities for sharded checkpointing. |
| primus/backends/diffusion/distributed/init.py | Exports for diffusion distributed utilities. |
| primus/backends/diffusion/diffusion_pretrain_trainer.py | Primus BaseTrainer wrapper that builds model/dataset/trainer and runs training. |
| primus/backends/diffusion/diffusion_adapter.py | Primus backend adapter converting module params into WAN args + trainer selection. |
| primus/backends/diffusion/attention/flex.py | FlexAttention backend integration (torch.compile-based). |
| primus/backends/diffusion/attention/attention.py | Unified attention API selecting SDPA/Flash/Flex/AITER backends. |
| primus/backends/diffusion/attention/aiter.py | AITER flash-attn backend integration. |
| primus/backends/diffusion/attention/_flash_common.py | Shared flash-attn varlen/fixed-length glue. |
| primus/backends/diffusion/attention/init.py | Attention package exports. |
| primus/backends/diffusion/argument_builder.py | Primus-style override normalization into compact WAN runtime args. |
| primus/backends/diffusion/init.py | Registers the diffusion adapter in BackendRegistry. |
| examples/diffusion/README.md | Example-level usage documentation for WAN diffusion configs. |
| examples/diffusion/configs/MI355X/wan2.2_ti2v_5b-pretrain.yaml | MI355X WAN2.2 pretrain example config using Primus-style overrides. |
| examples/diffusion/configs/MI355X/wan2.2_ti2v_5b-posttrain.yaml | MI355X WAN2.2 posttrain example config using Primus-style overrides. |
| examples/diffusion/configs/MI355X/wan2.1_t2v_1.3b-pretrain.yaml | MI355X WAN2.1 pretrain example config using Primus-style overrides. |
| examples/diffusion/configs/MI355X/wan2.1_t2v_1.3b-posttrain.yaml | MI355X WAN2.1 posttrain example config using Primus-style overrides. |
…rue for wan2.2-5B
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Remove redundant VAE checkpoint loading, harden AdamW optimizer fallback, and add focused tests for Wan argument normalization and optimizer fallback behavior. Co-authored-by: Cursor <cursoragent@cursor.com>
Add missing diffusion dependency checks, normalize file:// video paths across readers, report accumulated loss correctly, and validate Ulysses all-to-all divisibility before collectives. Co-authored-by: Cursor <cursoragent@cursor.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR integrates diffusion training support into Primus training framework, including WAN2.1 and WAN2.2 models.
The goal is to enable stable single-node and multi-node training for WAN diffusion models with minimal framework changes and clean extensibility.
Motivation
WAN diffusion models are now a primary workload for video generation training. This integration enables:
Scope
Included
Not included (future work)
Current Status
Completed
In Progress
Testing
Single-node
Multi-node
Known Issues / Risks
Next Steps
Notes
This is a WIP draft PR. Frequent commits will be pushed as development continues.
benchmarks
Primus Wan2.2 TI2V 5B Benchmark - 2026-07-06 10:28:13 UTC
batch_mode=local_accummeans effective per-GPU batch size via gradient accumulation with micro batch 1.video_backend=decord,dataloader_num_workers=0,PRIMUS_CACHE_RAW_VIDEO_FRAMES=1, andPRIMUS_CACHE_PROCESSED_SAMPLES=1.