Skip to content

ReVolta 0.1.1

Choose a tag to compare

@Leonccaa Leonccaa released this 21 Oct 19:19
· 253 commits to main since this release

ReVolta 0.1.1

A bug-fix release for ReVolta 0.1.0 (Qwen3.8 Flash-Next on 4 × V100 32 GB). Only Python code
changed. The native extensions were rebuilt from unchanged sources: their code and data are
identical to 0.1.0, and three nvcc-built files differ only in local symbol names and the
debug-file checksum. On requests that do not hit one of the
fixes, greedy output and fixed-seed sampling are identical to 0.1.0.

Behaviour changes

  • Stop strings with thinking on match only after the reasoning ends. A stop string
    repeated inside the reasoning no longer ends the request with empty content, and a
    stop of </think> no longer ends a request at the end of the reasoning.
  • Reasoning/content split uses the </think> token, not its text. A literal
    </think> written in the reasoning or the answer no longer moves the split. With
    thinking off, the whole output is content, in streaming and non-streaming responses.
  • qwen3_coder tool calls stream string arguments as they are generated, instead of
    sending a long argument only at the end. A repeated parameter name keeps its first
    value (a warning is logged).
  • Invalid request parameters return 400 with a one-line warning in the log, without
    an ASGI traceback.

Fixes

API and output processing:

  • Streaming with n ≥ 2 kept prompt log-probabilities for every choice.
  • A structured-output failure while generating now ends only that request; the engine
    keeps serving.
  • An output buffer could be reused while it was still being sent to the API server.
  • The end-of-stream tool-call flush could join a sent prefix and the full arguments into
    invalid JSON.

Scheduling, KV offload and state:

  • Resetting the prefix cache (development endpoints and LLM.reset_prefix_cache) with KV
    offload enabled no longer crashes the engine; preemptions outside the step loop are
    flushed correctly.
  • Without MTP, a prompt no longer takes one extra prefill step.
  • Draft warm-up runs no longer write QSA ring state into the null block.
  • Loading an AWQ checkpoint with a missing tensor fails at startup instead of running.

Memory and startup:

  • PLE layers no longer allocate speculative state blocks that are never used
    (KV pool 1,145,881 tokens on the reference setup, from 1,140,505).
  • NCCL communicators are created before memory profiling, so they no longer allocate
    memory inside the profiling window.
  • Standard NVFP4 checkpoints get their validated kernel settings from the ReVolta
    profile; they no longer need manual environment variables.
  • FP4-Local with a data-parallel vision encoder profiles the encoder at startup.
  • Two blocking GPU synchronizations in mixed batches (PLE metadata, QSA prefill bounds) are gone.
  • A 512K view whose outer config has no rope_parameters now loads (#2).
  • The startup profile line no longer reports pex_p2p before the workers have resolved
    the interconnect, and the profile's own compile setting no longer triggers a
    diagnostic warning (#2).

Multimodal:

  • A repeated image or video is no longer evicted from the encoder cache while another
    occurrence still needs it.
  • Media preprocessing runs on its own thread and no longer blocks tokenization.
  • A multimodal request rejected after rendering no longer leaves its media registered.
  • Videos with an unknown or invalid frame rate no longer fail.
  • Startup checks that the visual token IDs in the config match the tokenizer.
  • Faster placeholder matching for long multimodal prompts.

Documentation:

  • The README's 512K view script failed to load. Fixed in the README on 2026-10-21 (#2).
  • Host memory guidance for large image bursts (#2).
  • The cause of batch-dependent output differences: the order of the tensor-parallel
    all-reduce sums, amplified near routing and block-selection ties.

Release gate

All results come from the reference machine (4 × V100 32 GB PCIe behind one PCIe switch).
Baselines were measured with 0.1.0 in the same window.

Check Result
Greedy output and C1 fixed-seed sampling vs 0.1.0 Identical
Full AWQ gate (4/8-request stress, multimodal stress, offload readback, 211K retrieval, 512K boundary) Pass
Speed vs 0.1.0 (512-token responses, C1/C2/C4/C8) Throughput ratio 1.004 / 1.019 / 1.008 / 0.999
FP4-Local and standard NVFP4 smoke (release candidate) Pass
Offload connector GPU unit tests 158 passed; 2 failures also present in 0.1.0 (sliding-window layout, not used by this model)

Known limitations

See README, Support and known limits.
New in this list: a qwen3_coder string argument containing the literal text
</function> is cut at that point.

Assets

File Content
revolta-0.1.1-cp312-cp312-linux_x86_64.whl Wheel (Linux x86-64, Python 3.12, CUDA 12.8; debug symbols stripped)
revolta-0.1.1-cp312-cp312-linux_x86_64.debug.tar.xz Separate debug symbols for the native extensions
SHA256SUMS Checksums of the files above

Docker image: ghcr.io/leonccaa/revolta:0.1.1 (digest sha256:dce36236fa4018c0d45fcf1a33284b8cdbb20638713ce5fdd2a77fca686cf084).

PyPI: pip install revolta==0.1.1 (added 2026-10-21). The PyPI file is
revolta-0.1.1-1-cp312-cp312-manylinux_2_34_x86_64.whl, sha256
87ad51a5aac165edc0dc094b96a8d9e861668930504ecbf0788512e9e7305b19. It contains the
same files as the wheel above. Only the metadata differs: plain version pins for
torch==2.10.0, torchaudio==2.10.0 and torchvision==0.25.0 instead of
download.pytorch.org URLs, the manylinux_2_34_x86_64 platform tag and build tag 1.
Both wheels need glibc 2.34 or newer.

The first PyPI file, revolta-0.1.1-cp312-cp312-manylinux_2_34_x86_64.whl, has a
malformed RECORD: paths that contain commas are not quoted. uv refuses it and pip
prints warnings. pip and uv prefer the build-1 file, which fixes this.

Thanks

Thanks to @jttdev for the first NVLink test and the bug
reports in #2.