Instructions to use wlyu/raystream_cfpp with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Wan2.2
How to use wlyu/raystream_cfpp with Wan2.2:
# No code snippets available yet for this library. # To use this model, check the repository files and the library's documentation. # Want to help? PRs adding snippets are welcome at: # https://github.com/huggingface/huggingface.js
- Notebooks
- Google Colab
- Kaggle
RayStream CF++ β bidirectional teacher + AR-diffusion student
Checkpoints from the Causal Forcing++ (CF++) frame-wise rebuild: camera-controlled, image-conditioned video generation on Wan2.2-TI2V-5B at 704Γ1280, with UCPE camera conditioning (PRoPE) throughout.
Code: github.com/weijielyu/RayStream_CF (main)
This repo holds the two checkpoints at the front of the CF++ pipeline:
UCPE bidirectional teacher (this repo: bidirectional_teacher/)
ββ> AR-diffusion (this repo: ar_diffusion/) teacher-forced warmup, step 6200
ββ> Causal-CD consistency distillation, effective step 3000
ββ> DMD final few-step causal student
Contents
.
βββ bidirectional_teacher/
β βββ last.ckpt # 10.1 GiB β PyTorch Lightning ckpt, run ti2v_relray_absmap_comp8_704_fixedloss
βββ ar_diffusion/
βββ model.pt # 19.2 GiB β CF++ AR-diffusion, step 6200 (generator only)
| File | Format | Top-level keys |
|---|---|---|
bidirectional_teacher/last.ckpt |
Lightning (DeepSpeed stage-1 consolidated) | state_dict with pipe.dit.* prefix |
ar_diffusion/model.pt |
CF++ trainer save | generator |
The AR checkpoint is generator-only β do not pass --use_ema when loading it
(ema_start_step was set past the run length, so no EMA weights exist).
Model configuration
Both share the same geometry and camera setup:
- Base: Wan2.2-TI2V-5B β DiT dim 3072, 24 heads (head_dim 128), 30 layers,
in_dim/z_dim48 - Resolution: 704Γ1280, 81 pixel frames @ 16 fps
- VAE:
WanVideoVAE38(48-ch, temporal 4Γ) β 21 latent frames = 81 pixel frames - Latent shape:
[1, 21, 48, 44, 80]; patch factor 32 βframe_seq_length880,seq_len18480 - Camera: UCPE Unified Camera Model (
x_fov,xi), methodrelray_absmap(Relative Ray Encoding + absolute orientation via up-vector and latitude map),attn_compress=8. Injected as a parallelcam_self_attn(PRoPE) branch next to DiT self-attention β ~300 tensors / 142 M params (2.8% of the model). PRoPE is KV-cache compatible, which is what lets the camera branch survive autoregressive distillation. - I2V: frame 0 is the clean condition image β pinned at timestep 0, kept clean, excluded from the loss, never noised or augmented.
The AR student grafts the teacher's camera branch frozen (freeze_camera_branch: true).
β οΈ This is the corrected teacher
An earlier bidirectional teacher (published in wlyu/ucpe_checkpoints as
wan22_bidirectional_ucpe/) baked in an I2V training bug: training_loss noised and
supervised frame 0, even though TI2V-5B pins frame 0 clean at t=0 and inference re-pins it every
step. Frame 0 was therefore fed noised while labeled t=0 β so it never learned the clean
first-frame anchor, and first-frame content ghosted onto later frames through bidirectional
attention.
The fix re-pins frame 0 after add_noise and excludes it from both noise_pred and the training
target. The model was retrained from scratch with the fix; that retrain is the checkpoint here
(run ti2v_relray_absmap_comp8_704_fixedloss, 10 epochs / 10000 steps, batch 32 on 4Γ8 B200).
Use this one, not wlyu/ucpe_checkpoints/wan22_bidirectional_ucpe/, which is superseded.
Usage
Load the teacher's camera branch into a CF++ model
The teacher is consumed by CF++ as the frozen camera branch. load_ucpe_camera_weights accepts
this Lightning checkpoint directly β it unwraps state_dict, keeps keys containing
cam_self_attn, strips the pipe.dit. prefix, and loads with strict=False:
from utils.camera_control import patch_causal_dit, load_ucpe_camera_weights
patch_causal_dit(model, method="relray_absmap", attn_compress=8)
load_ucpe_camera_weights(model, "bidirectional_teacher/last.ckpt")
# -> Loaded 300 camera branch params, 825 missing (expected: base model keys), 0 unexpected
In CF++ configs this is just ucpe_ckpt: /path/to/last.ckpt.
Continue training from the AR checkpoint
Warm-start Causal-CD (or resume AR) by pointing generator_ckpt at the AR weights. Note this is
a weights-only warm start β the optimizer state and step counter are not restored, so the step
counter restarts at 0 and the effective step is 6200 + new_step:
# configs/cfpp_causal_cd_framewise_ti2v704.yaml
generator_ckpt: /path/to/ar_diffusion/model.pt
ucpe_ckpt: /path/to/bidirectional_teacher/last.ckpt
export PYTHONPATH=$PWD TOKENIZERS_PARALLELISM=false HF_HUB_OFFLINE=1
torchrun --nnodes=1 --nproc_per_node=8 --master_port=29562 train.py \
--config_path configs/cfpp_causal_cd_framewise_ti2v704.yaml \
--disable-wandb --no_visualize --logdir /path/to/out
You also need the Wan2.2-TI2V-5B base weights (hf download Wan-AI/Wan2.2-TI2V-5B) symlinked as
wan_models/Wan2.2-TI2V-5B in the code tree.
Download
hf download wlyu/raystream_cfpp --local-dir ./raystream_cfpp
# or just one:
hf download wlyu/raystream_cfpp --include 'ar_diffusion/*' --local-dir ./raystream_cfpp
Training
Both trained on 8ΓB200 (teacher: 4 nodes), data = PanShot panoramic video with ground-truth camera poses at 704p.
AR-diffusion used upstream Causal-Forcing's optimizer recipe verbatim β lr 2e-6, beta1 0.0,
no weight decay, num_frame_per_block: 1 (frame-wise), teacher forcing on, batch 8 β with only
the 704p/5B geometry, camera control, and I2V conditioning added. It ran to step 6200 (~6 s/step),
past the ~5700 plateau of an earlier run.
Expect low-motion, near-static output from the AR checkpoint. That is inherent to teacher forcing on panoramic data and is normal at this stage; motion dynamics are restored later, at the DMD stage. Upstream guidance is AR β₯2K steps (5β10K better), Causal-CD β₯3K, and DMD β€1K at bs64 β beyond ~1K, DMD over-fits to the teacher's static-biased distribution and motion degrades.
Evaluation
PanShot test split, held out at clip level (0/340 exact overlap with train) but not scene-disjoint β roughly 33 of 51 test source videos also appear in training as different segments. Metrics span video quality (FVD, FID, CLIP-T) and camera accuracy (FOV error, distortion k1/k2, pitch/roll, rotation/translation error, CAMMC), computed with the UCPE metric harness.
Citation
@misc{raystream_cfpp_2026,
author = {Lyu, Weijie},
title = {RayStream CF++: Causal Forcing with UCPE Camera Control},
year = {2026},
url = {https://huggingface.co/wlyu/raystream_cfpp}
}
Built on thu-ml/Causal-Forcing (arXiv 2602.02214) and
UCPE. Contact: Weijie Lyu (weijielyu1@gmail.com)
- Downloads last month
- -
Model tree for wlyu/raystream_cfpp
Base model
Wan-AI/Wan2.2-TI2V-5B