Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
104 commits
Select commit Hold shift + click to select a range
01a823c
spec(ltx-2.5): scope the 21B joint video+audio DiT and the generalize…
mudler Aug 11, 2026
3db9233
feat(video): generalize the video seam behind vllm::multimodal::Video…
mudler Aug 11, 2026
3d89f6f
port(ltx-2.5): the DiT layout + forward, gated against upstream at re…
mudler Aug 12, 2026
b0aa475
port(ltx-2.5): L4 — Conv video VAE, audio VAE and vocoder, gated on u…
mudler Aug 12, 2026
d9a1c7b
spec(ltx-2.5): correct the ABI version, 17 -> 18, not v13
mudler Aug 12, 2026
a1cc5cf
spec(ltx-2.5): record two findings that a port would otherwise assume
mudler Aug 12, 2026
0af3325
spec(ltx-2.5): the prompt-K/V cache CAN silently diverge, on a change…
mudler Aug 12, 2026
63cdf03
fix(video): a duplicate family name is refused, not silently deduplic…
mudler Aug 12, 2026
47a2dbe
port(ltx-2.5): L3 — the Gemma-4 text conditioning path, gated against…
mudler Aug 12, 2026
85857ff
spec(ltx-2.5): NVFP4 stored widths are HALF the logical ones; the TE …
mudler Aug 12, 2026
0541cbe
fix(ltx-2.5): guard the two L2 paths that shipped ungated
mudler Aug 12, 2026
791a5ff
merge: land LTX-2.5 L1 -- the generalized VideoEngine seam (#435)
mudler Aug 12, 2026
93329b1
fix(ltx-2.5): L4 review repairs -- revision anchor, shared 1-D seam, …
mudler Aug 12, 2026
35be90a
spec(ltx-2.5): reproducible goldens do not prove the oracle was right
mudler Aug 12, 2026
3cc1c13
merge: land LTX-2.5 L2 -- the DiT layout and forward (#435)
mudler Aug 12, 2026
16b90c4
fix(ltx-2.5): L3 review repair — enforce the declared weight contract…
mudler Aug 12, 2026
0cb654a
merge: land LTX-2.5 L4 -- the Conv video VAE, audio VAE and vocoder (…
mudler Aug 12, 2026
cd96578
fix(ltx-2.5): mirror upstream's f32 mean denominator, and gate the in…
mudler Aug 12, 2026
012fa9e
merge: land LTX-2.5 L3 -- the Gemma-4 text conditioning path (#435)
mudler Aug 12, 2026
742e38a
port(ltx-2.5): L5 — the pipeline layer, gated against upstream
mudler Aug 12, 2026
967f288
merge: origin/row/MODEL-DIFFUSION-LTX25 (L3) into row/LTX25-L5-PIPELINE
mudler Aug 12, 2026
0c54544
spec(ltx-2.5): a fixture that cannot separate right from wrong is the…
mudler Aug 12, 2026
32c275d
port(ltx-2.5): L6 — the quantized loaders, and what the shipped DiT a…
mudler Aug 12, 2026
130cc3e
spec(ltx-2.5): RETRACT the prompt-K/V "free win" -- it does not apply…
mudler Aug 12, 2026
b40b3d1
fix(ltx-2.5): gate the linspace walk, and restate the guider refusal …
mudler Aug 12, 2026
04c29dd
test(gates): the max|diff| helper could not see a NaN, and now it doe…
mudler Aug 12, 2026
d7ca4c5
test(gates): the max|diff| helper could not see a NaN, and now it doe…
mudler Aug 12, 2026
1b8cae0
merge: land LTX-2.5 L5 -- the pipeline layer (#435)
mudler Aug 12, 2026
3fa3976
Merge branch 'row/LTX25-NAN-GATE' into row/MODEL-DIFFUSION-LTX25
mudler Aug 12, 2026
5966ffe
fix(ltx-2.5): L6 review findings -- the gates that could not see thei…
mudler Aug 12, 2026
1d57c97
merge: land LTX-2.5 L6 -- the quantized loaders (#435)
mudler Aug 12, 2026
d81ddcd
spec(ltx-2.5): the FP8 and NVFP4 DiTs differ in a TRAINED parameter
mudler Aug 12, 2026
4818a93
port(ltx-2.5): L7 — LTX-2.5 behind the VideoEngine seam, and the driv…
mudler Aug 12, 2026
f193eaf
port(ltx-2.5): L8 — the DiT forward on the GPU, and the CUDA cross-at…
mudler Aug 12, 2026
ae588d8
spec(ltx-2.5): L8's spec, written AFTER the fact, and why that is a f…
mudler Aug 12, 2026
d67f812
fix(ltx-2.5): close the L7+L8 review findings -- the config the FP8 D…
mudler Aug 12, 2026
ede1a4d
fix(ltx-2.5): the F9 cross-backend bf16 arm needs its OWN scratch pool
mudler Aug 12, 2026
e1cf184
Merge branch 'row/LTX25-L8-FIX' into row/MODEL-DIFFUSION-LTX25
mudler Aug 12, 2026
5b7cd15
test(ltx-2.5): the v18 refusal case named a family that L7 then regis…
mudler Aug 12, 2026
75fb292
fix(ltx-2.5): F8's defect, reintroduced by F8's own fix, caught by th…
mudler Aug 12, 2026
3feda35
record(ltx-2.5): the GB10 re-verification, and the one mutation that …
mudler Aug 12, 2026
5115a27
merge: land the L7+L8 review repair (#435)
mudler Aug 12, 2026
7f15838
merge: the v18 family test whose premise L7 invalidated (#435)
mudler Aug 12, 2026
c16a6e0
spec(ltx-2.5): the diffusers source was never read, and it disagrees …
mudler Aug 12, 2026
933b57b
spec(ltx-2.5): a broken environment can impersonate a repair
mudler Aug 12, 2026
aac2476
spec(ltx-2.5): sharpen 7.0(d) -- SET is not USABLE, and how narrowly …
mudler Aug 12, 2026
7da4d00
record(ltx-2.5): merge authority, and the widened scope it covers
mudler Aug 12, 2026
f400413
spec(ltx-2.5): RETRACT the linear-layout diagnosis; the NVFP4 DiT is …
mudler Aug 12, 2026
9cf9fbf
port(ltx-2.5): L9B -- the render driver, --video-family, and the firs…
mudler Aug 12, 2026
6c9374e
port(ltx-2.5): L11 — the VAE ENCODERS L4 recorded as owed, and what t…
mudler Aug 12, 2026
3f5ae3f
spec(ltx-2.5): the first real disagreement between the two references
mudler Aug 12, 2026
ab66713
port(ltx-2.5): L10 — a text prompt drives the 12B tower, and the orac…
mudler Aug 12, 2026
5b5bd69
Merge remote-tracking branch 'origin/row/MODEL-DIFFUSION-LTX25' into …
mudler Aug 12, 2026
3c50042
spec(ltx-2.5): the tower's oracle existed all along; BOS is the secon…
mudler Aug 12, 2026
8e5292c
spec(ltx-2.5): the reference disagreement is LIVE at our own stage-2 …
mudler Aug 12, 2026
127d291
Merge branch 'row/LTX25-L11-VAE-ENCODERS' into row/MODEL-DIFFUSION-LTX25
mudler Aug 12, 2026
387f8ea
fix(ltx-2.5): the audio VAE's norm_eps was read by NO arm, on either …
mudler Aug 13, 2026
8040dd7
test(ltx-2.5): the constant sweep found a FIFTH instance, in the DiT …
mudler Aug 13, 2026
4749af6
spec(ltx-2.5): the invisible-constant class was swept and had FIVE me…
mudler Aug 13, 2026
10f2b74
spec(ltx-2.5): "upstream discards it" was the label a fixture gap was…
mudler Aug 13, 2026
5b598fc
merge: origin/main into row/MODEL-DIFFUSION-LTX25 (192 commits)
mudler Aug 13, 2026
2d437d5
fix(vt): name main's five new ops -- the drift guard fired on its fir…
mudler Aug 13, 2026
e48c862
port(ltx-2.5): L9C -- the connector on the render path, and a pool th…
mudler Aug 13, 2026
50c922f
spec(nvfp4): the nibble order is a PRODUCER convention, and two of ou…
mudler Aug 12, 2026
9f807fe
feat(ltx-2.5): the first-party NVFP4 DiT loads -- swizzled, HIGH-nibb…
mudler Aug 12, 2026
7d08e22
fix(ltx-2.5): an apostrophe in refusal prose breaks "refuse BY NAME" …
mudler Aug 12, 2026
127405e
test(ltx-2.5): gate the producer resolution across ALL 1176 quantized…
mudler Aug 12, 2026
9125863
spec(nvfp4): the Outcome -- what was measured, and the three things r…
mudler Aug 13, 2026
757a7bb
fix(ltx-2.5): the decoder's norm_eps was never unreachable, and the g…
mudler Aug 13, 2026
708e05b
record(ltx-2.5): the two L9C arms the GPU lock never came free for
mudler Aug 13, 2026
38cd1fb
merge: campaign into L9B -- the docs row said two different things ab…
mudler Aug 13, 2026
846301c
test(ltx-2.5): the register boundary, made numerically reachable
mudler Aug 13, 2026
2c1dda5
merge: L9B into L9C -- the scene row, and an append-only log that rea…
mudler Aug 13, 2026
25bfd66
merge: the L9 stack into the campaign -- LTX-2.5 renders a scene
mudler Aug 13, 2026
c412383
spec(ltx-2.5): I overcorrected -- the BWE precedent does not transfer
mudler Aug 13, 2026
aa6aa0e
docs(ltx-2.5): pay the STATUS shrink ratchet by MOVING the detail, no…
mudler Aug 13, 2026
67a7b1c
merge: campaign into L10 -- and the tower's refusal reason just becam…
mudler Aug 13, 2026
dbf8a52
fix(nvfp4): "refused by name" was FALSE for the case that matters, an…
mudler Aug 13, 2026
d45bcb5
fix(ltx-2.5): the pin list shipped three more wrong reachability verd…
mudler Aug 13, 2026
ebbbcc2
merge: L9A into the campaign -- first-party NVFP4 loads, and the gate…
mudler Aug 13, 2026
43aa583
port(ltx-2.5): L13 — a typed PROMPT conditions the render, and the th…
mudler Aug 13, 2026
ef83d94
fix(ltx-2.5): the BWE clamp is the third entry to leave the invisible…
mudler Aug 13, 2026
9fbc682
fix(ltx-2.5): close the L10 review — and two of its premises did not …
mudler Aug 13, 2026
d2cbe60
fix(ltx-2.5): withdraw the prompted-render claim, and gate the trace …
mudler Aug 13, 2026
4f1ec6e
fix(ltx-2.5): six more reachability claims that a mutation refutes (#…
mudler Aug 13, 2026
56a917c
docs(ltx-2.5): retire the two USAGE blocks this PR itself made false
mudler Aug 13, 2026
8fef917
fix(ltx-2.5): say arm coverage where the blur note said scale map (#5…
mudler Aug 13, 2026
310fa16
merge: the eps-pin row into the campaign -- 25 reachability claims, m…
mudler Aug 13, 2026
d5964c5
spec(POOL-DEVICE-KEY): the pool's free list forgot which device a blo…
mudler Aug 12, 2026
c8c0141
test(POOL-DEVICE-KEY): RED -- device 1 is handed device 0's block, th…
mudler Aug 12, 2026
d44e6ff
fix(POOL-DEVICE-KEY): one scratch pool per DEVICE, and no way to spel…
mudler Aug 12, 2026
400b0fe
spec(POOL-DEVICE-KEY): the Outcome -- both directions RED, both GREEN…
mudler Aug 13, 2026
d567be1
fix(POOL-DEVICE-KEY): rebase off a stale base, and close the six revi…
mudler Aug 13, 2026
4e5d4a2
docs(ltx-2.5): sweep six more "no render path" claims out of USAGE.md
mudler Aug 13, 2026
2098683
record(POOL-DEVICE-KEY): the dgx BEFORE/AFTER pair, and all nine fail…
mudler Aug 13, 2026
2962be4
docs: the ABI bump to v18 falsified five public claims, in four places
mudler Aug 13, 2026
33d026c
merge: POOL-DEVICE-KEY -- the scratch pool forgot which device a bloc…
mudler Aug 13, 2026
ddfcb51
fix(ltx-2.5): F7 was still inverted in the file that carries the call…
mudler Aug 13, 2026
66c00f9
merge: L13 into the campaign -- a typed prompt reaches cross-attention
mudler Aug 13, 2026
14efa53
fix(ltx-2.5): a SEMANTIC merge conflict git had nothing to conflict on
mudler Aug 13, 2026
131328e
fix(ltx-2.5): F10 was one of EIGHT wrong anchors this branch added (#…
mudler Aug 13, 2026
c43b5fa
merge: L10 into the campaign -- the last row, and 8 wrong anchors it …
mudler Aug 13, 2026
105e785
merge: origin/main into the campaign -- final integration before landing
mudler Aug 13, 2026
3cfe65b
merge: origin/main into the campaign -- final integration, second pass
Aug 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
315 changes: 315 additions & 0 deletions .agents/benchmark-record.md

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions .agents/claims/CLAIM-LTX25-L0-L7.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# CLAIM-LTX25-L0-L7

| Claim | Row IDs | Agent | Worktree / remote dir | Branch | Owned scope | State | Last update |
|---|---|---|---|---|---|---|---|
| `CLAIM-LTX25-L0-L7` | `MODEL-DIFFUSION-ltx-2-5-ltx2-video-transformer-3d-model` (`SPIKE`), `ROAD-V1-LTX25` | Claude Code (opus-5), operator role | isolated worktree `/home/mudler/_git/vllm.cpp-ltx25`; GPU work on dgx.casa serialized through `flock $HOME/gpu.lock` | `row/MODEL-DIFFUSION-LTX25`, issue [#435](https://github.com/mudler/vllm.cpp/issues/435) | Owns: NEW `.agents/specs/ltx-2-5.md`; the LTX-2.5 rows in `.agents/roadmap_v1.md` and `.agents/model-matrix.md`; the LTX-2.5 rows in `docs/{STATUS,BENCHMARKS,FEATURES}.md`; NEW `src/vllm/model_executor/models/ltx2_*` and `include/vllm/model_executor/models/ltx2*`; NEW `vllm::multimodal::VideoEngine` seam plus the MiniMax-H3 move behind it (BEHAVIOUR-PRESERVING only); additive ABI v13 fields in `include/vllm.h`. EXCLUDES: any change to H3's numerics or its checkpoint handling, the v12 ABI contract, DiffVAE / `NADiffusionDecoder`, the temporal x2 upsampler, LoRA fusion, multishot, `int8-convrot`, and multi-GPU / CFG parallelism, all of which are recorded as owed in the spec rather than silently dropped | `ACTIVE` | 2026-08-13 — **MERGE AUTHORITY RECORDED**: developer-directed "keep going autonomously until you get it working, fix the bugs you find along the way and merge the PRs directly once everything is proved". Scope widened beyond L0-L7 to a working END-TO-END LTX-2.5 render: L9a NVFP4 linear scale layout, L9b real render + `--video-family`, L10 the Gemma-4 tower so a prompt works, L11 the VAE encoders for image/video/audio conditioning, and the #516 pool fix that a trustworthy render depends on. Merge is gated on PROVED, which for this campaign means: fresh review PASS, the operator's own gate rerun, and no red bought by weakening a detector. |
6 changes: 4 additions & 2 deletions .agents/model-matrix.md

Large diffs are not rendered by default.

549 changes: 549 additions & 0 deletions .agents/porting-inventory.md

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions .agents/roadmap_v1.md

Large diffs are not rendered by default.

953 changes: 953 additions & 0 deletions .agents/specs/ltx-2-5.md

Large diffs are not rendered by default.

447 changes: 447 additions & 0 deletions .agents/specs/nvfp4-nibble-order.md

Large diffs are not rendered by default.

704 changes: 704 additions & 0 deletions .agents/specs/pool-device-key.md

Large diffs are not rendered by default.

44 changes: 43 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -780,6 +780,36 @@ add_library(vllm STATIC
src/vllm/model_executor/models/minimax_h3_encoder_sharded.cpp
src/vllm/model_executor/models/minimax_h3_encoder_device.cpp
src/vllm/model_executor/models/minimax_h3_vision_gguf.cpp
# LTX-2.5 (row MODEL-DIFFUSION-LTX25, .agents/specs/ltx-2-5.md phase L2).
src/vllm/model_executor/models/ltx2.cpp
src/vllm/model_executor/models/ltx2_dit.cpp
# LTX-2.5 (row MODEL-DIFFUSION-LTX25, phase L8): the DEVICE-RESIDENT forward and
# the (kLtx2, device) resolver. The resolver is its own TU so the vt::GetOp cast
# links in CPU-only builds, exactly as minimax_h3_device_resolve.cpp is.
src/vllm/model_executor/models/ltx2_device_resolve.cpp
src/vllm/model_executor/models/ltx2_device.cpp
# LTX-2.5 (ROW MODEL-DIFFUSION-LTX25, phase L4): the Conv video VAE, the audio
# VAE and its vocoder. Additive files mirroring ltx_core's own structure.
src/vllm/model_executor/models/ltx2_audio_vae.cpp
src/vllm/model_executor/models/ltx2_video_vae.cpp
# LTX-2.5 (ROW MODEL-DIFFUSION-LTX25, phase L3): the Gemma-4 multi-layer feature
# aggregation, the two caption projections and the embedded asset pack. An
# additive file mirroring ltx_core's own structure.
src/vllm/model_executor/models/ltx2_text_encoder.cpp
# LTX-2.5 (ROW MODEL-DIFFUSION-LTX25, phase L5): the flow-matching pipeline,
# the latent spatial upsampler, the duration head and the embeddings
# connector. Additive files mirroring ltx_core's own structure.
src/vllm/model_executor/models/ltx2_pipeline.cpp
src/vllm/model_executor/models/ltx2_upsampler.cpp
src/vllm/model_executor/models/ltx2_duration_head.cpp
src/vllm/model_executor/models/ltx2_connector.cpp
# LTX-2.5 (ROW MODEL-DIFFUSION-LTX25, phase L11): the conditioning items that
# place the VAE ENCODERS' output into the denoise state.
src/vllm/model_executor/models/ltx2_conditioning.cpp
# LTX-2.5 (ROW MODEL-DIFFUSION-LTX25, phase L6): the quantized loaders — the
# FP8 and torchao-NVFP4 DiT arms, the torchao-NVFP4 text encoder, and the
# load-time device staging GB10's ATS penalty makes the default.
src/vllm/model_executor/models/ltx2_loader.cpp
src/vllm/entrypoints/openai/video_api.cpp
src/vllm/model_executor/models/kimi_kda.cpp
src/vllm/model_executor/models/kimi_linear_registry.cpp
Expand Down Expand Up @@ -883,6 +913,15 @@ add_library(vllm STATIC
# server's private /v1/videos twin. Builds artifacts + the ffmpeg argv and
# SPAWNS NOTHING (the ratified process boundary).
src/vllm/multimodal/minimax_h3_video.cpp
# The GENERALIZED video seam (vllm::multimodal::VideoEngine) + its
# checkpoint-detected family registry — LTX-2.5 L1, .agents/specs/ltx-2-5.md
# §5. Knows about no family; each family self-registers from its own TU.
src/vllm/multimodal/video_engine.cpp
# LTX-2.5 behind that seam — the SECOND family, and the driving loop that
# composes the L2-L6 bricks into frames + a waveform (phase L7). Additive:
# one file plus one REGISTER_VLLM_VIDEO_FAMILY line, which is the property
# the seam exists to have.
src/vllm/multimodal/ltx2_video.cpp
src/vllm/v1/core/encoder_cache_manager.cpp
src/vllm/tokenizer/unicode_data.cpp
src/vllm/tokenizer/pretokenizer.cpp
Expand Down Expand Up @@ -1081,6 +1120,7 @@ add_library(vllm STATIC
src/vt/cpu/cpu_threadpool.cpp
src/vt/cpu/cpu_ops.cpp
src/vt/cpu/cpu_minimax_h3.cpp
src/vt/cpu/cpu_ltx2.cpp
src/vt/cpu/cpu_isa_arm.cpp
src/vt/cpu/cpu_isa_x86.cpp
src/vt/cpu/cpu_matmul_elem.cpp
Expand Down Expand Up @@ -1487,7 +1527,9 @@ if(VLLM_CPP_CUDA)
src/vt/cuda/cuda_sample.cu
src/vt/cuda/cuda_deepseek_v4.cu
src/vt/cuda/cuda_laguna.cu
src/vt/cuda/cuda_minimax_h3.cu)
src/vt/cuda/cuda_minimax_h3.cu
src/vt/cuda/cuda_ltx2.cu
src/vt/cuda/cuda_attention_cross.cu)
find_package(CUDAToolkit REQUIRED)
# cublasLt is linked now so the Task 4 matmul lands without a build change.
target_link_libraries(vllm PUBLIC CUDA::cudart CUDA::cublasLt)
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ configs, token-for-token the same output. Switching to it should be boring. Ever
you get on top, most of it borrowed from whichever engine does it best:

- **One 66 MiB binary instead of a 9.1 GiB install.** A flat, exception-free, llama.cpp-style C ABI
([`include/vllm.h`](include/vllm.h), ABI v17, 35 functions) for C, C++, Go, or Rust. No Python
([`include/vllm.h`](include/vllm.h), ABI v18, 36 functions) for C, C++, Go, or Rust. No Python
interpreter in the process.
- **GGUF as a first-class citizen.** Load the same quantized files llama.cpp uses, and on CPU
**compute directly on the compressed blocks** (Q4_0/Q8_0/Q3_K/Q4_K/Q5_K/Q6_K) with no BF16
Expand Down Expand Up @@ -385,7 +385,7 @@ behind a model gallery, multi-model serving, the full OpenAI API surface, auth,
## Use it as a library (C API)

Link `libvllm` and include [`include/vllm.h`](include/vllm.h): a flat, exception-free,
llama.cpp-style C ABI (`VLLM_ABI_VERSION 17`, 35 exported functions) suitable for `dlopen` / FFI.
llama.cpp-style C ABI (`VLLM_ABI_VERSION 18`, 36 exported functions) suitable for `dlopen` / FFI.

```c
vllm_model_params mp = vllm_model_params_default();
Expand Down
1 change: 1 addition & 0 deletions docs/BENCHMARKS.md
Original file line number Diff line number Diff line change
Expand Up @@ -435,6 +435,7 @@ built on it rather than keeping the flattering one.
| Kimi-Linear-48B-A3B (KDA+MLA+MoE) | **RUNNER FOLD LANDS (ROW 7, §21, #122): engine==CLI 128/128 byte-identical; vs golden 122/128 (near-tie profile); FA2 MLA default-ON; SACRED green.** Server 19.0 tok/s wall; CLI 18.93 reproduced | vLLM ~21 (#111 floor; in-session re-measure ABORTED by GB10 reboot at util 0.82, §21): **~0.90×**, >= vLLM NOT met; residual = KDA host islands + grouped MoE + decode graph |
| vLLM 0.26 re-benchmark | Pending | Re-run the binding grids on the advanced pin |
| MiniMax-H3 FP4 speed (W-FP4a) | **Measured GB10 (`row/H3-FP4-GPU-E2E`).** Marlin W4A16 byte-exact vs bf16; fp4 a memory win, 0.8x bf16/forward. Real-ckpt fp4-resident e2e RUNS (mp4/wav) | fp4 speed CLOSED. bf16-vs-quant A/B: ENCODER half MEASURED (§8.15), DiT half NOT (no bf16 render exists). Detail: benchmark-record + spec §8 |
| LTX-2.5 axes | Speed `PENDING` (vllm-omni#6066 has no native 2.5), binding oracle too. **SIZE: 320x192/25f completes on GB10, 448x256 does not**; that render was REGISTER-conditioned, not prompted | Wall is the HOST VAE decode, not the pool: drain returns 0.11 GiB, byte-inert. 2 baselines UNRESOLVED (lock). A real-checkpoint PROMPTED render is OWED |
| MiniMax-H3 render coherence (`row/H3-RENDER-CLOSE` #77) | **CLOSED: a COHERENT scene on GB10.** #70/#74 white was wrong-PARTITION usage (t2va on the ref2va ckpt); t2va on the FL2VA GGUF renders a prompt-matched orange cat (adj-cos 0.95 vs 0.06, no patch-grid) | Verified first: t2va inputs byte-exact vs upstream; CUDA device==host at seq 1920. Follow-up `H3-TASK-PARTITION-GUARD`: the task/partition mismatch now RAISES 1:1 with `_resolve_task` (spec §8.6-8.7) |
| MiniMax-H3 image conditioning (`row/H3-CONDITIONED-E2E`, `row/H3-VISION-SCATTER`, `row/H3-REF2VA-ASSEMBLY`) | **fl2va COHERENT; ref2va assembly bug FIXED+gated.** vision→cond scatter gated; ref2va block-dim double-division fixed + RED-first gated (128 vs 512) + a permanent ref2va DiT-forward rung (§8.10) | grid RE-ATTRIBUTED: with the fix ref2va grids in fp4 AND bf16, and t2va with no refs on the ref2va NVFP4 also grids while FL2VA-GGUF renders, so it is the **NVFP4 checkpoint/loader**, NOT assembly/fp4 (§8.10) |
| MiniMax-H3 Thor render speed (sm_110, no FA2) | **34.6 s/step** at 864x480/124f/50 steps on Q4_K_M, **16.6x** off 574.5 (render ~28 min, was ~8 h). Landed: warp-per-query, chunked warp reduce-scatter (1.76x), bf16 `mma.sync` (9.82x) | Shared-memory K/V tiling (23% SLOWER) and register Q-blocking (-0.8%) both measured and REVERTED: memory traffic is not the bound (one head's K+V is 3.9 MB against 32 MB of L2) |
Expand Down
1 change: 1 addition & 0 deletions docs/ENVIRONMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@ Read-only observability; none change output.
| `VT_FP4_AUTOTUNE_VERBOSE` | off | Log the NVFP4 GEMM autotuner's tactic selection |
| `VT_H3_PROGRESS` | unset | Trace the MiniMax-H3 denoise loop's phases to stderr: which forward path was taken (device vs the CPU reference), how long the ONE-TIME device weight staging took, and per-step forward seconds with the sequence length. A real-checkpoint run spends its minutes in exactly one of those phases, and this says which without guessing — it was added after GPU-utilization counters proved unreliable on Tegra-class boards |
| `VT_POOL_BYPASS` | off | `=1` makes every device-scratch pool allocation an exact-size driver `Alloc` and every release a real `Free`, so `compute-sanitizer` can see tensor boundaries and use-after-free that the caching, size-class-rounding pool hides. DEBUGGING ONLY: it reinstates the per-op `cudaMalloc`/`cudaFree` device-sync storm the pool exists to remove, so it is never a timing configuration |
| `VLLM_LTX2_POOL_DRAIN` | on | `=0` suppresses the LTX-2.5 render's per-phase device scratch-pool drain. The drain is on by default and there is no supported reason to turn it off: a denoise phase leaves the pool holding every activation size class it touched, the next phase (twice the resolution) and the VAE decode allocate different classes, and on an uncapped pool those blocks are headroom the next stage never gets. This exists so the A/B that MEASURES what the drain is worth runs on ONE binary, which is what a same-binary A/B requires. Not a configuration |
| `VT_TTFT_DUMP` | unset | `=1` prints one `TTFTSPLIT rid=... intake=.. queued=.. prefill=.. decode=.. e2e=..` line per finished request to stderr, reconstructing the per-request timing split from the event-populated `req_state` timestamps. The async serving frontend otherwise tracks no per-request stats (passes `iteration_stats=nullptr` and never stamps `EngineCoreOutputs.timestamp`); under this flag both are wired so a serving TTFT attribution can read the queue-vs-execution split against vLLM's own `request_{queue,prefill,decode}_time_seconds`. Generation is byte-identical when unset (the default path is instruction-identical to production); the durable replacement is the async `/metrics` stat logger |
| `VT_LOOP_TRACE` | unset | `=1` prints one `LOOPTRACE ...` line per ~1 s window to stderr from the engine busy loop: the full-iteration cadence (`interval`), `process_engine_step` wall (`step`), per-window admits, input-queue residence (`resid` = enqueue-to-drain, the same endpoints `VT_TTFT_DUMP`'s `intake` measures), per-drain admit max and max backlog depth. Diagnoses whether the admission wait is one busy-loop iteration or the input queue is backing up (it attributed the 35B INTAKE deficit to bursty arrival during long prefill steps). Byte-identical when unset: every trace read is guarded, and the enqueue timestamp is stamped only under the flag |
| `VT_H3_GAUSSIAN_NOISE` | unset | `minimax-h3-gen` only: `=1` seeds the diffusion initial noise from Box-Muller GAUSSIAN N(0,1) (what a flow-matching model is trained on) instead of the historical uniform[-1,1] draw. A/B knob for the render-coherence investigation; the exact values still do not match torch's RNG (that only selects WHICH sample), but the DISTRIBUTION does |
Expand Down
16 changes: 12 additions & 4 deletions docs/FEATURES.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ are our reading of their documented behavior, not measurements.
| KV events (block create / evict publish) | ◐ no transport | ✅ | ☐ | ☐ |
| Prefix-cache matching unit | ◐ resolver only | ✅ | ☐ | ☐ |
| Compute directly on quantized blocks | ✅ | ☐ | ☐ | ✅ |
| Scratch allocator keyed by device (two backends, one process) | ✅ since [#516](https://github.com/mudler/vllm.cpp/issues/516); a pool is bound to one backend and refuses any other, and a backend with no registered platform is refused rather than given another's residency cap | ✅ device is field 0 of the allocation handle | ✅ | ✅ |
| Automatic memory sizing (no hand-tuned budget) | ☐ hand-typed block count | ☐ percent, hand-tuned | ☐ | ◐ |
| Memory cap with a pre-flight error instead of an OOM | ☐ | ◐ KV pool only | ◐ | ☐ |

Expand Down Expand Up @@ -147,13 +148,20 @@ speed-pending, which [BENCHMARKS.md](BENCHMARKS.md) tracks.
### Standalone and non-registered lanes

These run through dedicated forwards, not the `REGISTER_VLLM_MODEL` registry, so
they sit outside the gated list above.
they sit outside the gated list above. One caveat the LTX-2.5 row is too narrow
to carry: its text tower's prompt tokenization mirrors upstream only while the
checkpoint's tokenizer `post_processor` adds nothing. The shipped one is MEASURED
empty, so this port's plain encode plus an explicit BOS prepend matches
upstream's `add_special_tokens=True` today; a checkpoint with a non-empty
`post_processor` would tokenize differently here, and `Ltx2TokenizeGemmaPrompt`
in `ltx2_text_encoder.cpp` is the call that would have to change.

| Lane | Tested checkpoint(s) | Correctness gate | Speed vs reference |
|---|---|---|---|
| Voxtral audio (`VoxtralForConditionalGeneration`) | Voxtral-Mini-3B-2507 | near-tie-robust 16/16 vs vLLM 0.25.0 | decode 0.97x (beats vLLM); encoder FORWARD 15.90x of vLLM's whole TTFT (pin 46.02 ms), or 2.89x with opt-in `VT_WHISPER_ENC_FA2=1` (costs 3 near-tie divergences vs 0). Not a TTFT ratio. Pending |
| Whisper audio encoder | openai/whisper-small; whisper-large-v3 (Voxtral cfg) | encoder tower 77/77; large-v3 tower 203/203 | pending |
| MiniMax-H3 DiT (`MiniMaxH3DiTModel`, vllm-omni lane) | MiniMax-H3 (33.1B video+audio) | portable 79/79; all three modalities COHERENT on Q4_K_M (§8.20); PRUNED ckpts run, Q8_0 seam 0.9941 (§8.21); ref2va grid was NVFP4 quant error, §8.9 REFUTED; GGUF/NVFP4/bf16 shards stream | FP4/Marlin landed; speed pending; no bf16 render yet. Render from the Q4_K_M GGUF, not the NVFP4 arm. Krea 2 text-to-image (roadmap C11) is scoped to reuse these DiT seams |
| LTX-2.5 DiT (`LTX2VideoTransformer3DModel`, Lightricks lane) | LTX-2.5 (21.00B video+audio) | `SPIKE`. DiT, VAEs+ENCODERS, conditioning, pipeline, quant loaders gated at reduced dims. Typed prompt to Gemma-4 to cross-attn, FIXTURE-gated. The 320x192/25f scene was register-conditioned; a prompted render is OWED | Family `ltx-2.5` via `ltx2-gen`. ~29 GB NVFP4/GB10, FP8 ~44 GB, +~24 GB tower. FP8, torchao and first-party NVFP4 all load. DiffVAE, LoRA, image conditioning refused AT THE ENGINE. Speed PENDING |
| MTP speculator | Qwen3.6-27B, Qwen3.6-35B-A3B | token-identical to vLLM `mtp` at c1 | ~4% faster c1; +16% output tput (MoE) |
| DFlash block-diffusion | Qwen3 (DFlash draft) | near-tie e2e 27/27 vs vLLM | 2.9x over spec-off, 1.003x vs vLLM DFlash-on |
| DeepSeek-V4 MTP | DeepSeek-V4-Flash (nextn head) | lossless 5/5; real-model weight-blocked | pending |
Expand Down Expand Up @@ -269,7 +277,7 @@ Build with `-DVLLM_CPP_VULKAN=ON`; off by default.
| Multiple engines in one process (build, destroy, rebuild) | ✅ resident device state is owned by the weights, so a new engine never inherits a freed one's pointers | ✅ | ✅ | ✅ |
| LoRA adapters | ☐ CPU brick only | ✅ | ✅ | ✅ |
| Embedding / pooling endpoints | ◐ `/v1/embeddings` live (task=embed; score/rerank/classify pending) | ✅ | ✅ | ✅ |
| OpenAI video generation `/v1/videos` (Sora shape) | ✅ `model`/`size`/`seconds` aliases + `GET /{id}/content`; `input_reference` and the `metadata` video/audio references condition the render | ◐ (vllm-omni, its own request shape) | ☐ | ☐ |
| OpenAI video generation `/v1/videos` (Sora shape) | ✅ `model`/`size`/`seconds` aliases + `GET /{id}/content`; `input_reference` and `metadata` references condition the render; `--video-family` pins the family (default DETECT), `--video-extra K=V` carries family knobs | ◐ (vllm-omni, its own request shape) | ☐ | ☐ |
| Flat C ABI for embedding in other languages | ✅ versioned | ☐ | ☐ | ✅ |

#### C-ABI capability coverage <!-- abi-capability-table:begin -->
Expand All @@ -287,9 +295,9 @@ Build with `-DVLLM_CPP_VULKAN=ON`; off by default.
| Custom logits processor | `vllm_logits_processor` | reachable |
| Embeddings / pooling (task=embed) | `vllm_embed`, `vllm_embedding_result_free` (ABI v15; pooling checkpoints load via `vllm_engine_load`) | reachable |
| Audio transcription (Parakeet ASR) | `vllm_transcribe`, `vllm_transcription_params_default`, `vllm_transcription_free` | reachable |
| Video+audio generation (MiniMax-H3) | `vllm_video_engine_load`, `vllm_video_generate`, `vllm_video_result_free`, `vllm_video_mux_argv` | reachable |
| Video+audio generation (MiniMax-H3, LTX-2.5) | `vllm_video_engine_load`, `vllm_video_generate`, `vllm_video_result_free`, `vllm_video_mux_argv`, `vllm_video_engine_family` (ABI v18 family registry) | reachable |
| Explicit device selection (auto/cpu/cuda) | `device` field on `vllm_model_params` (ABI v14; 0=auto keeps the probe, explicit absent device fails loud) | reachable |
| Run the OpenAI server (server as a thin ABI client) | `vllm_server_main` (ABI v17) | reachable |
| Run the OpenAI server (server as a thin ABI client) | `vllm_server_main` (ABI v18) | reachable |
| Multimodal input (image/audio/video) | none | embedder-unreachable | <!-- abi-capability-table:end -->

## Parallelism and scale-out
Expand Down
Loading
Loading