Repository navigation
[Fast Start] Support online FP8 and CUTLASS NVFP4 weight-cache restarts - #63672
Merged
Isotr0py merged 7 commits intoNov 3, 2026
Merged
Conversation
Restore online FP8 and MXFP8 runtime state without requantizing cached weights. Preserve the CUTLASS logical width and avoid fusing NVFP4 MoE scales twice in shared IPC tensors. Add output-equivalence coverage and CI jobs. Co-authored-by: Codex <noreply@openai.com> Signed-off-by: liusy58 <mg21330037@smail.nju.edu.cn>
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: liusy58 <mg21330037@smail.nju.edu.cn>
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: liusy58 <mg21330037@smail.nju.edu.cn>
Contributor
|
Documentation preview: https://vllm--63672.org.readthedocs.build/en/63672/ |
This was referenced Oct 26, 2026
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: liusy58 <mg21330037@smail.nju.edu.cn>
Contributor
|
This pull request has merge conflicts that must be resolved before it can be |
Signed-off-by: liusy58 <mg21330037@smail.nju.edu.cn> Co-authored-by: Codex <noreply@openai.com>
6 tasks done
6 tasks done
Isotr0py
marked this pull request as ready for review
November 3, 2026 06:49
Isotr0py
requested review from
AndreasKaratzas,
WoosukKwon,
mgoin,
tlrmchlsmth,
yewentao256 and
zyongye
as code owners
November 3, 2026 06:50
Isotr0py
requested review from
Harry-Chen,
bnellnm,
khluu,
pavanimajety,
robertgshaw2-redhat and
wzhao18
as code owners
November 3, 2026 06:50
Isotr0py
approved these changes
Nov 3, 2026
Member
|
/ci run |
|
✅ Triggered Buildkite CI #99491 for commit ℹ️ This PR is 324 commits behind upstream |
Isotr0py
enabled auto-merge (squash)
November 3, 2026 09:18
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Overview
Allow the weight-cache daemon to reuse online FP8/MXFP8 linear weights and ModelOpt NVFP4 CUTLASS MoE weights across engine restarts. Related to #56049; this covers a subset of its quantization roadmap.
Claims
Validation
Current head
35711168b0135573234bbaa4bd8f9e8fe32647e8includes main914d61fc538a84e8487cb16fe8241a70f6f4bf9e. October 29 agent-run validation after resolving the inherited online-FP8 import conflict with upstream #60163. The merge retains both CUTLASS and Humming imports, the upstream processed-dimension metadata, and upstream rejection of the unsupported Humming per-token/channel path. It adds no Humming IPC capability.online-unitsonline-modelsnvfp4-modelRuntime: NVIDIA B300, PyTorch 2.13.0+cu130, process-local CUDA 13.4 compatibility libraries. The two stable-libtorch extensions are from the official CUDA 13.0 wheel for main
914d61fc538a84e8487cb16fe8241a70f6f4bf9e, checked against wheel RECORD hashes and linked only into task worktrees. The shared venv and host driver were unchanged. This does not validate the full upstream PyTorch 2.14 dependency matrix.Full-model checks use TP1, BF16, eager mode, CUTLASS and TRITON_ATTN, with the existing batch-invariant exact greedy-output comparisons. Each completed case checks ordinary load, missing-daemon fallback, IPC and a second IPC load; both IPC loads forbid fallback. These are output-equivalence smoke checks, not accuracy or performance benchmarks. No multi-GPU, ROCm or other-backend result is claimed.
The temporary local helper calls the existing
run_cold_start_and_warm_restartwithdataclasses.replace(case, model=local_checkpoint, llm_kwargs={**case.llm_kwargs, "gpu_memory_utilization": 0.12})andVLLM_BATCH_INVARIANT=1. It changes only checkpoint location and the GPU memory budget; loading paths, prompts and assertions are unchanged. Online cases keep their checked-in 0.2 budget.NVFP4 checkpoint:
nvidia/Qwen3-30B-A3B-NVFP4, pinned2538ded2a4edb247b4d2b4a8ba24e44bd4c017c3.Commands for this revision
All commands set
HF_HUB_OFFLINE=1,PYTHONPATHto the corresponding worktree andLD_LIBRARY_PATH=/home/liusy/codex-runtime/cuda-compat-13-4/usr/local/cuda-13.4/compat.CUDA_VISIBLE_DEVICES=0 .venv/bin/python -m pytest tests/model_executor/model_loader/test_weight_cache.py tests/kernels/quantization/test_cutlass_scaled_mm.py -k 'test_cutlass_fp8_gemm_padded or (not cutlass and not cold_start and not d2d_warmup and not online)' -q CUDA_VISIBLE_DEVICES=4 .venv/bin/python -m pytest tests/model_executor/model_loader/test_weight_cache.py::test_ipc_cache_online_fp8 tests/model_executor/model_loader/test_weight_cache.py::test_ipc_cache_online_blackwell -q CUDA_VISIBLE_DEVICES=4 CODEX_CACHE_VALIDATION_CASE=nvfp4 CODEX_CACHE_MODEL_PATH=/home/liusy/codex-runtime/checkpoints/nvfp4-2538ded2a4 .venv/bin/python -m pytest tests/model_executor/model_loader/_codex_oct29_validation.py -qGitHub checks for the new head are pending at publication. No Buildkite GPU-suite pass or completed human review is claimed. AI assistance and original feature baselines are recorded below.
Earlier validation and original feature baselines (previous heads)
Earlier head
aa141888102c8431c5f25c53477cf18cb837fd5dincludes main36d4ef654a83e227216b0c0b55cf4041d96b1675. Agent-run B300 validation on October 29, after synchronizing the native extensions with that main commit:The four online cases use their checked-in settings (
gpu_memory_utilization=0.2). The NVFP4 case uses a local copy ofnvidia/Qwen3-30B-A3B-NVFP4pinned at2538ded2a4edb247b4d2b4a8ba24e44bd4c017c3, with only the checkpoint path and GPU memory fraction (0.12) substituted for shared-machine coexistence.B300, TP1, BF16, eager mode, CUTLASS linear kernels and TRITON_ATTN. Full-model cases exercise ordinary loading → missing-daemon fallback → IPC → second IPC, with fallback forbidden on both IPC loads and the existing exact batch-invariant greedy-output comparisons unchanged. These are output-equivalence smoke tests, not accuracy or performance benchmarks; multi-GPU and other hardware are not claimed.
Runtime: PyTorch 2.13.0+cu130 with process-local CUDA 13.4 compatibility libraries. The two stable-libtorch native extensions were taken from the official CUDA 13.0 wheel for exact main
36d4ef654a83e227216b0c0b55cf4041d96b1675, verified against wheel RECORD hashes, and linked only into the task worktrees. Their declared stable ABI supports PyTorch >=2.11. This is not validation of the complete upstream PyTorch 2.14 dependency matrix; the shared venv and host driver were unchanged.An initial Llama run stalled reading the shared NFS checkpoint; it was stopped and rerun using a pinned local-disk checkpoint. An initial NVFP4 ordinary load failed before IPC because the old native extension exposed an 11-argument operator while current source required 12; the matching extensions above resolved that environment mismatch. Neither initial run is counted as a passing test or as a cache regression. All results in the table use the matching extensions. Existing torch/fork deprecation warnings are retained in the logs.
The exact heads above are MERGEABLE; GitHub pre-commit, DCO and Read the Docs passed on October 29. No Buildkite GPU-suite success or completed human review is claimed. Original feature baselines and earlier results remain below and are not reruns of the October 29 conflict resolution.
Original feature baselines, reproduction commands and earlier validation
B300, single GPU per scenario. Each end-to-end case compares normal loading, disk fallback without a daemon, first IPC attachment, and a second IPC attachment. Both IPC runs disable fallback. Quantization tests use greedy output comparison with VLLM_BATCH_INVARIANT=1 and TRITON_ATTN.
On main 0f6b261, branch 084cab1: online FP8 per-tensor/per-channel/per-block and MXFP8: 4 passed (272.15s); Qwen3-30B-A3B-NVFP4 with CUTLASS linear/MoE: 1 passed (102.83s); weight-cache unit and CUTLASS padding/scales/bias cases: 102 passed (79.85s).
After merging main 2fb320d (including #62734 and #63506), on then-then-current head d771fd8:
gpu_memory_utilization=0.12instead of the CI case's0.3to coexist with other B300 workloads. The four loading paths and output assertions were unchanged; the earlier0.3result above is from 084cab1.The unit runs emitted a background-thread warning in unchanged upstream seed.py: self._server became None before accept during listener shutdown; the warning is retained. Model runs emitted torch/multiprocessing deprecation warnings.
Before the fix, the real online-FP8 daemon reported
UnsupportedQuantForIPCError: ... Fp8PerTensorOnlineLinearMethod does not support loading from pre-processed weights. The padded CUTLASS regression failed atassert output_size is not Nonewhen IPC skipped post-processing; the same regression passes with the constructor restoring the logical width.Reproduction from the branch using an idle GPU:
Post-merge command (small GPU allocations only):
CUDA_VISIBLE_DEVICES=7 PYTHONPATH=. .venv/bin/python -m pytest tests/model_executor/model_loader/test_weight_cache.py tests/kernels/quantization/test_cutlass_scaled_mm.py -k 'test_cutlass_fp8_gemm_padded or (not cutlass and not cold_start and not d2d_warmup and not online)' -qNVFP4 local validation substitutes the existing same-model checkpoint directory for its Hugging Face ID. This validates IPC equivalence to ordinary quantized inference, not quantization accuracy against BF16. No TP/PP/DP/EP, multi-node, or full hardware matrix claim. Earlier shared-GPU profiling failures are retained in the logs; the same online suite passed on an isolated GPU without changing assertions. Precompiled FlashAttention was incompatible with this host, hence the explicit Triton attention choice.
Details
Online methods previously rejected daemon caching despite successful ordinary loading. The restore paths opt in only when their kernel state can be reconstructed. NVFP4 CUTLASS otherwise performs an in-place scale fusion during kernel initialization, which must not run again on shared daemon tensors.
Adds focused loading regressions, extends the existing padding test to construct a real kernel, adds L4/B200 Buildkite selection, and documents supported paths in the preload guide. No model-runner/scheduler changes or new steady-state host synchronization.
Duplicate checks on October 26 examined issue #56049 and its comments and searched open PRs for the issue, preload quantization, and weight-cache FP8. #62734 covers daemon-loss detection and #63506 covers kernel cache keys; neither adds these restore paths. #60015 concerns compressed-tensors scale registration and is outside this change. No duplicate implementing this scope was found in those searches.
AI assistance: implementation, debugging, validation, and this description were prepared with Codex at the submitter's request. This is a draft for human review; no completed human approval or human-run validation is asserted.
Pull Request Checklist
/pr-checklistskill. (Mandatory for agents, optional for humans).Need help on this PR? Tag
@codesmith-botwith what you need.