Repository navigation
ReVolta 0.1.5
A fix release for ReVolta 0.1.4 (Qwen3.8 Flash-Next on 4 × V100 32 GB). DFlash2 now hits the full cached prefix on the first reuse of a prompt, the model loader reads index shards it used to skip silently, large integer tool arguments stay exact, and optional DFlash2 state replay costs less. On NVLink machines the MoE sum uses the PCIe-switch route. Each item links to its pull request, which has the details and measurements.
Fixes
- DFlash2 first prefix reuse hits the full cached prefix. With DFlash2 and sparse prefix-cache retention (the reference setting), the first reuse of a prompt hit one 1,664-token block less than the full cacheable prefix, for example 29,952 instead of 31,616 tokens for a 32K prompt; later reuses were already full. The first reuse now hits the full prefix (31,616 / 98,176 / 129,792 tokens at 32K / 99K / 131K). It keeps one more 1,664-token checkpoint per recurrent group per distinct prompt on the GPU, in the CPU tier and on disk. MTP4 is unchanged. (#48)
- Model loader reads index shards in subfolders. When a checkpoint's
model.safetensors.index.jsonnamed shards in a subfolder as well as at the top level, the subfolder shards were never read, the parameters in them stayed unloaded and no error was raised. They are now read, and loading fails if the index names a shard that would still not be read. Direct I/O now also mapsU16andU32. The documented checkpoints load as before. Port of 1CatAI/1Cat-vLLM#1274. (#55, fixes #54) - Large integer tool arguments stay exact. Tool-call arguments declared as
numberwent throughfloat(), so integers beyond 2^53 changed silently (for example9007199254740993→9007199254740992); 64-bit IDs reached the tool with a different value. Integers are now parsed as integers first; decimals and theinf/nanguard are unchanged. Port of vllm-project/vllm#55743. (#47) - Clearer startup report for MTP deployments. The SM70 accelerator report printed
dflash2_verifier: contract_mismatch:…for deployments that never use the fused DFlash2 verifier, which read like a fault. It now saysnot_applicable:…there; a real DFlash2 mismatch still sayscontract_mismatch. Display only. (#43, reported in #38)
Performance
- DFlash2 state replay replays only the accepted prefix (state replay is optional and off by default). With replay on, single-request decoding is about 0.9% faster (about 0.4 ms per step), which recovers about a third of the replay's cost. Outputs are bitwise identical with this change on and off. (#44)
- SM70 TP4 on NVLink: the MoE sum uses the PCIe-switch route. At sizes without a fused kernel the sum2 call now does a local add plus the ordinary all-reduce instead of the generic fused kernel: about 2.2–2.5× faster per call at 2–10 tokens. End to end on a machine with two links between every GPU pair, MTP4 at two requests is about 1% faster and other levels are unchanged within run-to-run variation; DFlash2 shows no difference beyond variation. Single-request output is bitwise identical to 0.1.4. PCIe-switch systems are unchanged. (#49)
Documentation
- 0.1.4 follow-up: versions, the 32 GiB host memory minimum with the experimental PLE disk option, the watchdog option and consistency fixes. (#45)
- Issue templates for the report and bug labels. (#52)
Upgrade notes
- Python-only release. The native extensions are byte-identical to 0.1.4; only Python files changed.
- The first start after upgrading compiles the graphs again, because the version is part of the compile cache key; later starts load them from the cache. The GPU KV pool is the same size as with 0.1.4 (reference setup: 1,366,121 tokens for DFlash2, 1,153,143 for MTP4).
- The recommended configuration is unchanged from 0.1.4: MTP4 is the public default, DFlash2 with probabilistic drafting and state replay off is the reference production deployment.
Known issues
- CPU KV offload can leave
/dev/shm/vllm_offload_*.mmapbehind on a normal stop (#51). Start with--shutdown-timeout 30, or remove stale files before starting. A fix is planned after 0.1.5. - DFlash2 remains workload-dependent: short English and code prompts benefit most; Chinese and long agent sessions often favour MTP4. With several requests at once DFlash2 pulls ahead: on the reference setup, four and eight concurrent requests (512-token answers) ran about 20% and 9% faster than MTP4, while a replay of 90 agent sessions one request at a time put DFlash2 at 0.98 of MTP4, within run-to-run variation (measured with 0.1.4; 0.1.5 speed is unchanged).
- Concurrent output can differ at near-ties as request batches change.
- The tool-calling and
/v1/messageslimits listed for 0.1.4 remain. All limits are in Support and known limits.
Validation
Release gate on the reference 4 × V100 32 GB PCIe setup, on the release image, against 0.1.4 run in the same window:
- Single-request output bitwise identical to 0.1.4 (greedy and sampled). With four or eight concurrent requests, outputs differ from 0.1.4 only at near-ties, as much as two runs of the same version differ from each other.
- Speed unchanged: DFlash2 sampled C1 / C4 / C8 1.00 / 1.04 / 1.00 of 0.1.4, greedy 1.00 / 1.01 / 1.01.
- KV module: the first reuse of a prompt hits the full cached prefix with DFlash2; CPU readback, preemption and eviction checks pass; a live KV smoke replayed 601 recorded agent-session requests with no errors.
- 512K depth retrieval (six depths, two documents of about 487K tokens): 12 of 12 for DFlash2 and 12 of 12 for MTP4.
- Large-integer tool arguments: 12 of 12 exact (0.1.4: 4 of 12). Tool calling, structured output and the multimodal stress check pass as in 0.1.4.
- Loader: FP4-Local and NVFP4 checkpoints load and answer.
- One structured-output check at eight concurrent requests and temperature 1 had 2 of 168 replies cut at its 800-token budget (no invalid output, no errors; 0.1.4: 1); this is a test budget, not a defect.
Assets
| File | Content |
|---|---|
revolta-0.1.5-cp312-cp312-linux_x86_64.whl |
Wheel (Linux x86-64, Python 3.12, CUDA 12.8; debug symbols stripped), 79,261,925 bytes, sha256 436bd3d758cef27bf877c03601c171bdf93a180a0c91c82e00470299e0a74962 |
revolta-0.1.5-cp312-cp312-linux_x86_64.debug.tar.xz |
Separate debug symbols for the native extensions (unchanged from 0.1.4), 86,018,096 bytes, sha256 f7dcddab74e0e6c61107ae6265a50d97867fb3948b5a81ae6b44738b9a5dbfd4 |
SHA256SUMS |
Checksums of the files above |
Docker image: ghcr.io/leonccaa/revolta:0.1.5 (digest sha256:136b8f2f6b557cd21f486abe9aad5d7ca907c6e078e940ec2db2f6c796ed78ed). PyPI: pip install revolta==0.1.5 (revolta-0.1.5-cp312-cp312-manylinux_2_34_x86_64.whl, sha256 f58d3b3b56f47e2ffe58629c8880ffac380a9446c6783cede16ca1ced70cf98b).
Thanks
Thanks to @Peuqui for 1CatAI/1Cat-vLLM#1274, to @Woolgathererer for vllm-project/vllm#55743, and to @That80-20 for the report in #38.