Kaarel Kaarelson github.com/kaarelkaarelson/lingbot-world-v2-realtime ↗

LingBot-World 2.0 1.3B at 16 FPS on one RTX 5090

@kaarelkaarelson · 2026-09-18

16 FPS
real time
2.7×
vs the original paper's code
2.5×
vs SGLang Diffusion

LingBot-World 2.0 [1] is a 1.3-billion-parameter video world model: give it an image and a prompt, then drive the camera with WASD and it generates the world in front of you. The original paper's code runs it at 6 frames per second on an RTX 5090. Real time is 16. This repository gets there on the same card, the same weights and the same decoder.

The original paper

Original paper
Ours
FPS
6.0
16.1
s / chunk2.680.98 +
DiT1.62 s0.64 s
Decoder1.06 s0.34 s
GPU busy90%98%
Kernel launches~20,000~4,800
Host syncs1102

DiT + decoder = s / chunk. GPU busy and kernel launches are per chunk, from the profiler traces of both configurations; host syncs per three chunks.

A chunk is 16 frames.

LingBot-World 2.0 [1] ships its code and weights. Run as released on one RTX 5090, it makes one second of video in 2.68 s, which plays at 6.0 FPS. This repository makes the same second in 0.98 s: 16.1 FPS, real time, same weights, same decoder, same picture.

Performance against other inference engines

Three public engines run this model. I measured each one as it ships, on the same card and at the same settings: 832×464, four denoising steps, one-second chunks, the original decoder, steady state after warm-up.

Same clip, each panel at that engine's measured speed.
Engines / chunkFPSOurs vs it
Original paper's code [1]2.686.02.7×
SGLang Diffusion [7]2.486.452.5×
LightX2V [9]2.077.732.1×
NVIDIA FlashDreams [8]1.858.651.9×
Ours0.9816.1

FPS is 16 frames divided by the time to generate and decode one chunk. Nothing of mine was added to another engine. The scripts that produced each row, the settings that differ per engine, and the raw logs are in the repository.

Optimizations

Nothing about the model changed: same weights, same sampler, same decoder. I went through the inference stack layer by layer, cheapest and most general first, measured each step, and stopped where the only thing left would have been a custom GPU kernel. One chunk is one second of video; the original paper's code takes 2.68 s to make it, this repository 0.98 s.

StepBeforeAfters / chunk
Host syncsCPU↔GPU sync on every layerbookkeeping on the GPU2.68 → 2.57
DecoderWan 2.1 VAE in fp32fp16 with sub-pixel upsampling2.57 → 1.95
CompilerPyTorch eagerone compiled graph1.95 → 1.68
Matmulsbf16 linearsFP8 rowwise via torchao1.68 → 1.47
AttentionFlashAttention-2SageAttention 2.21.47 → 1.04
Kernel fusionone kernel per operationfused kernels for norm, RoPE, residual and FP8 quant1.04 → 0.98
Total6.0 FPS16.1 FPS2.68 → 0.98

Seconds per chunk after each step, in the order applied. Each gain was measured on its own; the last step closes to the measured total. Custom kernels would be the step after fusion; the roofline below says they are not worth it here.

What is left runs inside four kernels written by others. Three of them are already near the card's peak. The one with room is attention. A hand-written attention kernel at 90 % of peak would gain about one frame per second, so there is no custom kernel [2].

KernelReachedPeak on RTX 5090of peak
FP8 matmuls390 TFLOP/s419 TFLOP/s FP890 %
Decoder convolutions173 TFLOP/s210 TFLOP/s FP1683 %
Fused elementwise~1.3 TB/s1.8 TB/s memory~70 %
SageAttention543 TOPS838 TOPS INT865 %

RTX 5090 peaks from NVIDIA's specification.

Lossless performance

The speed is not bought with quality. Four of the six steps are bit-identical to the paper's code; the two that change the arithmetic, FP8 matrix multiplies and the INT8 attention kernel, were checked on identical inputs against the paper's decoder and sampler.

Original paperOurs
PSNRreference43.6 dB
SSIM [6]reference0.981
LPIPS [5]reference0.004
MUSIQ [3]68.9868.99
CLIP-IQA [4]0.5920.590
Sharpness (Laplacian), first / last s1022 / 2981023 / 298
Colourfulness, first / last s41.9 / 50.241.9 / 50.2
Brightness, first / last s0.692 / 0.3840.692 / 0.384
Flicker0.03810.0381
DiT latents, exact presetreferencebit-identical

PSNR, SSIM and LPIPS: the same latents through the paper's fp32 decoder and ours, after the mp4 encoder (43.6 dB is above the 40 dB line usually called visually lossless). MUSIQ and CLIP-IQA are no-reference quality scores; sharpness is the variance of the Laplacian; flicker is the mean frame-to-frame difference; first / last second shows drift over the 22 s rollout. Same scene, seed 42. A causal model amplifies any numeric difference chunk by chunk, so the claim is made on paired latents and on quality metrics, not on the pixels of a long rollout; the FP8 and SageAttention stack is also not run-to-run deterministic.

Limits

The code, the setup instructions and the full experiment log, including every lever that did not work, are in the repository.

References

  1. Gao Z. et al. (2026). Infinite Worlds with Versatile Interactions (LingBot-World 2.0 technical report). arXiv:2607.07534
  2. Williams S., Waterman A., Patterson D. (2009). Roofline: An Insightful Visual Performance Model for Multicore Architectures. Communications of the ACM 52(4). doi:10.1145/1498765.1498785
  3. Ke J. et al. (2021). MUSIQ: Multi-scale Image Quality Transformer. ICCV 2021. arXiv:2108.05997
  4. Wang J. et al. (2023). Exploring CLIP for Assessing the Look and Feel of Images. AAAI 2023. arXiv:2207.12396
  5. Zhang R. et al. (2018). The Unreasonable Effectiveness of Deep Features as a Perceptual Metric. CVPR 2018. arXiv:1801.03924
  6. Wang Z. et al. (2004). Image Quality Assessment: From Error Visibility to Structural Similarity. IEEE Transactions on Image Processing 13(4). doi:10.1109/TIP.2003.819861
  7. SGLang project (2026). SGLang Diffusion documentation. docs.sglang.io/docs/sglang-diffusion
  8. NVIDIA (2026). FlashDreams. github.com/NVIDIA/flashdreams
  9. ModelTC (2025). LightX2V. github.com/ModelTC/LightX2V