The Phase-3 fine-tune, retrofitted as a Looped-DiT (12 pre-loop blocks, 9 looped core blocks, 12 post-loop blocks, head-wise attention gates) and trained for 2500 and 4500 steps at loop depth N = 4 with deep supervision. The same eight test windows, captions and noise seed as the zero-shot loop-depth gallery: only the model and the number of core passes change across the columns. 33 future frames at 15 fps, 384×512, Euler 30 steps, CFG 4.
Columns from left: ground-truth future, base FLUX 3 Action zero-shot, the Phase-3 fine-tune (grey underline, the previous reference), then the looped model sampled with the core run 1, 2, 4 and 8 times. N = 4 (green underline) is the depth it was trained at. Cells are downscaled to 256×192 for the page.
At the training depth the looped model reaches LPIPS 0.163 and FVD 151 at k = 1, against 0.166 and 167 for the Phase-3 fine-tune it started from, after 0.9 epoch of looped training. Green rows are the training depth; the best value in each column is marked. The last column is the measured sampling time per 33-frame window (batch 4; one A100 for the 2500 model, one H100 for the 4500 model; 30 Euler steps, two forward passes per step for guidance).
| model | N | PSNR ↑ | SSIM ↑ | LPIPS ↓ | FVD ↓ | judge ↑ | s / window |
|---|---|---|---|---|---|---|---|
| base FLUX 3 Action, zero-shot | 1 | 17.03 | 0.664 | 0.288 | 407.6 | 0.38 | 7.9 |
| fine-tuned 6000 steps (Phase 3) | 1 | 19.83 | 0.805 | 0.166 | 166.9 | 0.46 | 7.9 |
| looped, 2500 steps, N = 1 | 1 | 19.97 | 0.805 | 0.166 | 164.2 | 0.43 | 7.9 |
| looped, 2500 steps, N = 2 | 2 | 20.02 | 0.808 | 0.161 | 162.0 | 0.43 | 9.9 |
| looped, 2500 steps, N = 4 | 4 | 20.00 | 0.807 | 0.162 | 157.1 | 0.39 | 13.9 |
| looped, 2500 steps, N = 8 | 8 | 20.03 | 0.803 | 0.164 | 159.2 | 0.42 | 21.9 |
| looped, 4500 steps, N = 1 | 1 | 19.74 | 0.804 | 0.168 | 166.3 | 0.39 | 3.2 |
| looped, 4500 steps, N = 2 | 2 | 19.94 | 0.808 | 0.162 | 154.4 | 0.46 | 4.0 |
| looped, 4500 steps, N = 4 | 4 | 19.93 | 0.807 | 0.163 | 150.5 | 0.40 | 15.9 |
| looped, 4500 steps, N = 8 | 8 | 20.05 | 0.807 | 0.161 | 151.5 | 0.40 | 27.1 |
k = 1: PSNR / SSIM / LPIPS on 100 windows; FVD on 300 windows; judge on 100 windows (adherence = yes-rate with the true caption minus yes-rate with a swapped caption, Qwen3-VL judge).
| model | N | PSNR ↑ | SSIM ↑ | LPIPS ↓ | s / window |
|---|---|---|---|---|---|
| base FLUX 3 Action, zero-shot | 1 | 20.16 | 0.799 | 0.168 | 9.6 |
| fine-tuned 6000 steps (Phase 3) | 1 | 21.77 | 0.848 | 0.123 | 9.6 |
| looped, 2500 steps, N = 1 | 1 | 21.82 | 0.848 | 0.121 | 9.7 |
| looped, 2500 steps, N = 2 | 2 | 21.75 | 0.848 | 0.121 | 12.1 |
| looped, 2500 steps, N = 4 | 4 | 21.78 | 0.848 | 0.120 | 16.8 |
| looped, 2500 steps, N = 8 | 8 | 21.73 | 0.846 | 0.122 | 26.4 |
| looped, 4500 steps, N = 1 | 1 | 21.91 | 0.850 | 0.120 | 4.0 |
| looped, 4500 steps, N = 2 | 2 | 21.85 | 0.849 | 0.120 | 4.8 |
| looped, 4500 steps, N = 4 | 4 | 21.78 | 0.849 | 0.121 | 6.7 |
| looped, 4500 steps, N = 8 | 8 | 21.79 | 0.847 | 0.122 | 10.6 |
k = 9: PSNR / SSIM / LPIPS on 100 windows.
The untrained loop (Phase 4's zero-shot probe) degraded quickly with depth because the core blocks had only ever run once. After Phase 5 every depth is a usable exit.
| N | block passes | k = 1, untrained loop | k = 1, looped, 2500 steps | k = 1, looped, 4500 steps | k = 9, untrained loop | k = 9, looped, 2500 steps | k = 9, looped, 4500 steps |
|---|---|---|---|---|---|---|---|
| 1 | 33 | 0.166 | 0.166 | 0.168 | 0.123 | 0.121 | 0.120 |
| 2 | 42 | 0.183 | 0.161 | 0.162 | 0.132 | 0.121 | 0.120 |
| 4 | 60 | 0.203 | 0.162 | 0.163 | 0.148 | 0.120 | 0.121 |
| 8 | 96 | 0.357 | 0.164 | 0.161 | 0.259 | 0.122 | 0.122 |
LPIPS (lower is better). "Untrained loop" is the Phase-3 model wrapped as a Looped-DiT without gates and sampled at depth N with no looped training (first 50 of the same windows); N = 1 is the Phase-3 model itself. The trained columns are the Phase-5 models on 100 windows.
| run | step | k0 | k1 | k5 | k9 | k17 | k9, N=1 | k9, N=2 | k9, N=8 |
|---|---|---|---|---|---|---|---|---|---|
| Phase-3 fine-tune (N = 1) | 6000 | 0.1904 | 0.0792 | 0.0693 | 0.0659 | 0.0639 | – | – | – |
| looped, 2500 steps | 500 | 0.1929 | 0.0806 | 0.0707 | 0.0672 | 0.0653 | 0.0670 | 0.0662 | 0.0716 |
| looped, 2500 steps | 1000 | 0.1916 | 0.0799 | 0.0700 | 0.0666 | 0.0647 | 0.0668 | 0.0660 | 0.0699 |
| looped, 2500 steps | 1500 | 0.1902 | 0.0795 | 0.0696 | 0.0662 | 0.0642 | 0.0665 | 0.0657 | 0.0691 |
| looped, 2500 steps | 2000 | 0.1891 | 0.0791 | 0.0691 | 0.0658 | 0.0639 | 0.0663 | 0.0654 | 0.0683 |
| looped, 2500 steps | 2500 | 0.1879 | 0.0787 | 0.0688 | 0.0654 | 0.0635 | 0.0660 | 0.0651 | 0.0678 |
| looped, 4500 steps | 3000 | 0.1884 | 0.0787 | 0.0688 | 0.0655 | 0.0636 | 0.0660 | 0.0652 | 0.0678 |
| looped, 4500 steps | 3500 | 0.1876 | 0.0785 | 0.0687 | 0.0653 | 0.0634 | 0.0659 | 0.0651 | 0.0674 |
| looped, 4500 steps | 4000 | 0.1863 | 0.0783 | 0.0685 | 0.0651 | 0.0632 | 0.0658 | 0.0649 | 0.0672 |
Velocity-prediction MSE of the EMA weights on 32 fixed validation windows at 8 timesteps, per context length k; the looped runs are evaluated at the training depth N = 4 unless the column says otherwise. Lower is better. The 4500-step run shares steps 0–2000 with the 2500-step run and continues from that checkpoint (the step-4500 point itself is missing: the trainer was killed before that eval).
The 33 transformer blocks of the fine-tuned model (5 dual-stream mode blocks, 28 joint single blocks) are split into three stages. The retrofit adds no blocks: the core is 9 of the existing single blocks, run N times with shared weights.
| N | block passes per forward | relative | s / window, looped, 2500 steps | s / window, looped, 4500 steps |
|---|---|---|---|---|
| 1 | 33 | 1.00× | 7.9 | 3.2 |
| 2 | 42 | 1.27× | 9.9 | 4.0 |
| 4 | 60 | 1.82× | 13.9 | 15.9 |
| 8 | 96 | 2.91× | 21.9 | 27.1 |
Seconds per 33-frame window at k = 1, including the guidance pass (two forwards per step) and the VAE decode; batch 4, one A100 for the 2500 model and one H100 for the 4500 model, so the two columns are not comparable in absolute terms. The plain Phase-3 model takes 7.9 s under the same protocol.
ldvflux/eval_phase4.py, seed 0, Euler 30, CFG 4, shift 5). Looped weights: EMA of the Phase-5 run, loaded strictly; depth set with --loops N. Frames are from AgiBot World Beta (CC BY-NC-SA 4.0: attribution, non-commercial, share-alike). Weights: Jinyan0924/flux3-agibot-looped and Jinyan0924/flux3-agibot-videoft; code: naomili0924/looped-dit-video, agibot-flux3/.