Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
2154bfc
[Doc] README: speed overview, NVLink results and KV capacity by method
Leonccaa Oct 24, 2026
da762ae
Merge remote-tracking branch 'release/main' into docs/readme-speed-kv
Leonccaa Oct 24, 2026
aaff9ce
[Doc] Drop the audio limit from the reference multimodal settings
Leonccaa Oct 24, 2026
314d6a6
[Doc] Fill README performance and KV measurements for 0.1.3
Leonccaa Oct 24, 2026
c2d6239
[GDN] Replay: build each replay index table in one kernel launch
Leonccaa Oct 24, 2026
26de211
[Doc] Add checkpoint, KV scale and MTP draft setup to README
Leonccaa Oct 25, 2026
baa1063
[Docs] Split README into task-oriented guides
Leonccaa Oct 25, 2026
7f7eb5f
[Doc] Fix the KV capacity link text in the README highlights
Leonccaa Oct 25, 2026
8dfd770
[Doc] FP4-Local: use the v1.1 scale pack with E4M3 MTP draft KV
Leonccaa Oct 25, 2026
b6e0a53
[Tools] FP4-Local KV scales: mirror the v1.1 pack with MTP draft scales
Leonccaa Oct 25, 2026
03e4db7
[Doc] State replay figures: C8 wording, +12% capacity, upstream ref
Leonccaa Oct 25, 2026
8b1d061
[GDN] Replay: capture the post-sampling replay in CUDA graphs
Leonccaa Oct 25, 2026
e9ece50
[Doc] State replay: report both release-image runs at eight requests
Leonccaa Oct 25, 2026
6b74496
[Doc] README and guides: 0.1.3 is the current release
Leonccaa Oct 25, 2026
2b666af
Merge pull request #19 from Leonccaa/docs/readme-speed-kv
Leonccaa Oct 25, 2026
3e04af0
Merge pull request #27 from Leonccaa/kv-scales/fp4-local-v1.1
Leonccaa Oct 25, 2026
b395f93
[Doc] README: a first page for deciding whether ReVolta fits
Leonccaa Oct 25, 2026
7579a74
Merge pull request #29 from Leonccaa/docs/readme-first-page
Leonccaa Oct 25, 2026
321d2d3
[Doc] PLE: document the experimental whole-table disk option
Leonccaa Oct 25, 2026
f06db8e
Merge pull request #30 from Leonccaa/docs/ple-disk-option
Leonccaa Oct 25, 2026
763673a
[Test] Add independent replay and selector review cases
Leonccaa Oct 24, 2026
87ecef3
[Test] Align the replay and selector review cases with the 0.1.3 cont…
Leonccaa Oct 25, 2026
1e9371b
Merge pull request #31 from Leonccaa/test/replay-review-cases
Leonccaa Oct 25, 2026
6e44751
[Bugfix] Reject INT8 target KV with DFlash before loading
Leonccaa Oct 25, 2026
9768ecd
[Bugfix][Anthropic] Map client exceptions before translation
Leonccaa Oct 25, 2026
4a9b23d
[Bugfix][KV Offload] Reset store progress on token-zero restart
Leonccaa Oct 25, 2026
427a5f5
[Feat] Add opt-in watchdog stack dumps for engine and workers
Leonccaa Oct 25, 2026
9196043
Merge pull request #32 from Leonccaa/r014/b1-upstream
Leonccaa Oct 25, 2026
f410ab1
Merge pull request #33 from Leonccaa/r014/b2b3-guards
Leonccaa Oct 25, 2026
f1973f9
[GDN] Replay: log each replay graph capture
Leonccaa Oct 25, 2026
df07150
Merge main into f/gdn-replay-fused-table
Leonccaa Oct 25, 2026
6041876
[Config] DFlash2: turn GDN state replay off by default
Leonccaa Oct 25, 2026
eea0f9d
[Doc] DFlash2: state replay as an option, with 0.1.4 measurements
Leonccaa Oct 25, 2026
ed97fbf
Merge pull request #24 from Leonccaa/f/gdn-replay-fused-table
Leonccaa Oct 25, 2026
b1ee324
[Perf] Avoid SM70 PCIe sum2 pull reductions
Leonccaa Oct 25, 2026
e0e3fb0
[Perf] Retain ordinary all-reduce routing for local sum2
Leonccaa Oct 25, 2026
cd89276
[Doc] Correct public documentation inconsistencies
Leonccaa Oct 26, 2026
9043efc
Merge pull request #35 from Leonccaa/r014/docs-consistency
Leonccaa Oct 26, 2026
664bab9
[Bugfix][KV Offload] Do not let an unhashed block truncate load boundary
Leonccaa Oct 26, 2026
4f8297b
[Bugfix][KV Cache] Two-phase allocation for cross-group prefix hits
Leonccaa Oct 26, 2026
4018320
Merge pull request #36 from Leonccaa/r014/offload-recurrent-boundary
Leonccaa Oct 26, 2026
4dca7ce
[Test] Annotate the sum2 route test's admitted-size set
Leonccaa Oct 26, 2026
dfc092c
Merge pull request #34 from Leonccaa/r014/a5-sum2-route
Leonccaa Oct 26, 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
2 changes: 1 addition & 1 deletion .github/MULTIMODAL_INPUTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ This V100 behaviour is the same as in 0.1.0 and 0.1.1, and 0.1.2 keeps it. Set

- the generic 0.1.2 default: `--limit-mm-per-prompt '{"image": 8, "video": 1, "audio": 1}'`;
- the reference deployment, as in the README launch command:
`--limit-mm-per-prompt '{"image": 16, "video": 1, "audio": 16}'`.
`--limit-mm-per-prompt '{"image": 16, "video": 1}'` (Qwen3.8 Flash-Next has no audio input).

The image resizing below applies on V100 too.

Expand Down
6 changes: 3 additions & 3 deletions .github/SUPPORT.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# ReVolta 0.1.0 support scope
# ReVolta support scope

The [support matrix in the README](../README.md#support-matrix) is the reference.
In short:
Expand All @@ -8,14 +8,14 @@ In short:
| GPUs | 4 × NVIDIA V100 32 GB PCIe |
| PCIe switch with P2P | Validated |
| PCIe without P2P | Validated by disabling P2P on P2P-capable hardware; about 30–55% of P2P speed |
| NVLink | Unverified (no hardware available); the upstream topology path and `VLLM_SM70_INTERCONNECT` override exist |
| NVLink | Community results on 4 × V100-SXM2 32 GB ([#2](https://github.com/Leonccaa/ReVolta/issues/2)); outside our release gate |
| Host memory | 128 GiB recommended; 80 GiB measured minimum with KV offload off |
| KV offload | Off, CPU, or CPU + SSD tier |
| KV cache | E4M3 (default) or INT8; INT8 with the SSD tier is not supported |
| Models | Qwen3.8 Flash-Next (QSA, multimodal) |
| Checkpoints | AWQ g32, standard NVFP4 `RadixArk/Qwen3.8-Flash-Next-NVFP4`, `nvidia/Qwen3.8-Flash-Next-FP4-Local` |

Unverified configurations (NVLink, TP2/TP8, V100 16 GB, other models or
Configurations outside our release gate (NVLink, TP2/TP8, V100 16 GB, other models or
topologies) are handled on a best-effort basis. Other GPU architectures,
ROCm/CPU/XPU/TPU serving and GGUF are not built.

Expand Down
10 changes: 5 additions & 5 deletions BUILDING.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ The release version is `RELEASE_VERSION` in `setup.py` (initially `0.1.0`).
Set `VLLM_VERSION_OVERRIDE` for an exact wheel and runtime version, or pass
`SETUPTOOLS_SCM_PRETEND_VERSION` to the Docker build. Inherited Git tags do not
select the ReVolta version. Use a PEP 440 local version for private deployments,
for example `0.1.0+deployment.20261018.g0123456789`.
for example `0.1.3+deployment.20261025.g0123456789`.

## SM70 source build

Expand All @@ -15,13 +15,13 @@ Use CUDA 12.8; CUDA 13 cannot compile SM70. Limit parallelism to available memor
NVCC thread per job are a conservative starting point on a 32 GB host.

```bash
version=0.1.0
version=0.1.3
docker build --target build -f docker/Dockerfile \
--build-arg torch_cuda_arch_list=7.0 \
--build-arg max_jobs=4 --build-arg nvcc_threads=1 \
--build-arg SETUPTOOLS_SCM_PRETEND_VERSION="$version" \
-t local/revolta-build:0.1.0 .
container=$(docker create local/revolta-build:0.1.0)
-t "local/revolta-build:$version" .
container=$(docker create "local/revolta-build:$version")
mkdir -p artifacts
docker cp "$container:/workspace/dist" artifacts/
docker cp "$container:/workspace/debug" artifacts/
Expand All @@ -31,7 +31,7 @@ docker build --target vllm-openai -f docker/Dockerfile \
--build-arg torch_cuda_arch_list=7.0 \
--build-arg max_jobs=4 --build-arg nvcc_threads=1 \
--build-arg SETUPTOOLS_SCM_PRETEND_VERSION="$version" \
-t local/revolta:0.1.0 .
-t "local/revolta:$version" .
```

Flash-V100 and FlashQLA are bundled into the ReVolta wheel. DeepEP is skipped
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Contributing to ReVolta

ReVolta focuses on the configurations in the
[0.1.0 support scope](.github/SUPPORT.md), derived from roadmap W10. Inherited
[support scope](.github/SUPPORT.md). Inherited
vLLM functionality outside that scope is not a support commitment.

## Issues
Expand Down
930 changes: 115 additions & 815 deletions README.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
Report suspected vulnerabilities through this repository's GitHub
**Security → Advisories → Report a vulnerability** form (private vulnerability
reporting). Do not put exploit details, credentials or private data in a public
issue. Private reporting must be enabled before the public release.
issue.

Include the affected version or commit, configuration, impact, reproduction
steps and any suggested mitigation. Maintainers will coordinate investigation,
Expand Down
323 changes: 323 additions & 0 deletions docs/checkpoints.md

Large diffs are not rendered by default.

127 changes: 127 additions & 0 deletions docs/configuration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
# Configuration reference

This page explains the reference deployment settings, sampling defaults and resource budgets.
Use the [getting-started tutorial](getting-started.md) for the installation and launch sequence.

## Environment settings

The engine detects SM70, TP4, a QSA model (Qwen3.8 Flash-Next) and FP16, and then sets
the tuned kernel switches by itself (the "ReVolta profile"). Only these deployment
settings remain:

The complete reference exports are in [step 3 of the tutorial](getting-started.md#3-environment).

Use only the documented `VLLM_SM70_*` settings unless you are troubleshooting. Explicit
values override the profile.

## Interconnect

The engine selects the interconnect automatically and logs `SM70 interconnect=<mode>`.
P2P uses custom all-reduce for messages up to 80 KiB inside CUDA graphs; other
collectives use NCCL. Override with `VLLM_SM70_INTERCONNECT=auto|pex|nccl|nvlink`
or disable custom all-reduce with `--disable-custom-all-reduce`.

## Launch options

- **`draft_sample_method` must be `greedy`.** A probabilistic draft corrupts output
above `max_num_seqs=2` at temperature > 0 (upstream 1Cat-vLLM issue #656). This
setting is about draft verification only; clients can still use any sampling
parameters.
- **`--gpu-memory-utilization 0.95`** passed the full gate, including the multimodal
stress test with 8 concurrent requests. Higher values ran out of memory in earlier
multimodal stress tests. If you change concurrency or media limits, measure again.
- The scheduler settings (`--prefill-pressure-*`, `--long-prefill-token-threshold`,
`--mixed-prefill-step-latency-ms`) and `ple_disk_cascade: false` are the tested
values for this machine. They are deployment settings, not universal defaults.
- `cpu_bytes_to_use` is the total for all four workers (48 GiB = 12 GiB per worker).
- **Keep `--limit-mm-per-prompt` on V100.** With FlashAttention-V100, the engine allows
1 image and no video per request without it, and a value that leaves out `"video"`
disables video. 0.1.3 keeps this V100 default. `{"image": 16, "video": 1}`
keeps the reference deployment's limits; Qwen3.8 Flash-Next takes images and video,
not audio, so no audio limit is set. To use the generic image count instead, set
`--limit-mm-per-prompt '{"image": 8, "video": 1}'`; a lower image count leaves more
host memory for bursts of large images. Large images are resized
either way (see [Support and known limits](known-limits.md)).
- `--structured-outputs-config '{"backend": "xgrammar"}'` pins the structured-output
backend. With `auto`, the engine keeps the backend chosen for its first
structured-output request.
- `--sse-keep-alive-interval 15` sends an SSE comment line (`: keep-alive`) after 15 idle
seconds on streaming responses, so proxies with read timeouts keep the connection open
during queueing and prefill. The default, 0, sends none.
- `TILELANG_CACHE_DIR` ([step 3](getting-started.md#3-environment)) keeps TileLang's compiled kernels on persistent storage.
Without persistent cache storage, a recreated container compiles them again.
- Media limits and request budgets: see
[multimodal input limits](../.github/MULTIMODAL_INPUTS.md).

## Sampling parameters

The server takes default sampling values from the checkpoint's `generation_config.json`
(`temperature` 1.0, `top_p` 0.95, `top_k` 20), but only for fields that a request
leaves out. Many chat clients send their own `temperature` and `top_p`, so check the
client settings. Qwen recommends:

| Mode | `temperature` | `top_p` | `top_k` | `min_p` | `presence_penalty` | `repetition_penalty` |
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
| Thinking (default) | 1.0 | 0.95 | 20 | 0.0 | 0.0 | 1.0 |
| Non-thinking | 0.7 | 0.80 | 20 | 0.0 | 1.5 | 1.0 |

- **Endless repetition:** Qwen suggests a `presence_penalty` between 0 and 2. Higher values
can mix languages and slightly lower quality.
- `presence_penalty` can only be set per request. `--override-generation-config` sets
server defaults for `temperature`, `top_p`, `top_k`, `min_p`, `repetition_penalty` and
`max_new_tokens` only.
- `top_k` and `min_p` are not standard OpenAI fields. With the OpenAI Python SDK, pass them
in `extra_body`.
- These are the model vendor's values. The [speed tests](performance.md) use
`temperature=0`. The greedy `draft_sample_method` in the launch command applies only to
draft verification, not to these request settings.

## YaRN and native context

YaRN in vLLM is static: it applies the same scaling to every request, short or long.
Qwen's model card notes that this can lower quality on shorter texts and advises
enabling YaRN only when long contexts are needed. ReVolta's quality measurements
compare against a BF16 reference that also uses YaRN, so they do not show this
effect. If your requests stay within 262,144 tokens, do not make YaRN views: use
`--max-model-len 262144` and serve the checkpoint directory itself (the materialized
directory for Standard NVFP4 and FP4-Local). For the MTP draft, use the AWQ
checkpoint's own `mtp-fp8/`, the scale pack's `mtp-fp8/` for Standard NVFP4, or
FP4-Local's built-in MTP layer with no draft `model` field. The full acceptance ran
with the 512K views.

## System memory and storage

**128 GiB RAM is recommended** for the default 48 GiB CPU KV pool. The AWQ PLE
embedding table uses about 47.7 GiB of pinned host memory even with KV offload disabled.

| Container memory limit | KV offload | Result |
| --- | --- | --- |
| 128 GiB | Off, or 48 GiB CPU pool | Full acceptance passed |
| 80 GiB | Off | Memory stress passed; full acceptance not run |
| 64 GiB | Off | Out of memory during startup |

80 GiB is the smallest tested limit that passed memory stress, without full acceptance. With less than 128 GiB,
reduce or disable the CPU KV pool.

Image and video preprocessing also uses host memory, in the API server process. In one
test, 8 concurrent requests with 8 different 2048-pixel images each used about 33 GB at
peak. With a 32 GiB CPU KV pool on a 125 GiB host, the kernel then killed a worker. The
same burst passed with a 16 GiB pool. If you expect bursts of large images or videos,
use a smaller CPU KV pool or limit the image size and the number of concurrent requests.

The AWQ checkpoint is 137 GB at the pinned revision:

| Part | Format | Size | Where it runs |
| --- | --- | ---: | --- |
| Routed experts | 4-bit AWQ, group size 32 | 74.9 GB | GPU |
| PLE n-gram tables | FP8 E4M3 | 51.3 GB | Pinned host memory |
| Other weights (attention, embeddings, `lm_head`, vision tower, shared experts) | 16-bit | 10.9 GB | GPU |
| Optional MTP draft (`mtp-fp8/`) | FP8 | 5.3 GB | GPU |

Allow extra disk space for compilation caches and the optional disk KV tier.

## See also

- [Reference launch tutorial](getting-started.md)
- [Checkpoint preparation](checkpoints.md)
- [KV offload modes](kv-offload.md)
Loading
Loading