Repository navigation
chore: bump vLLM to 0.33.0 (torch 2.14.0) - #4365
Open
faresobeid wants to merge 6 commits into
Open
faresobeid wants to merge 6 commits into
faresobeid wants to merge 6 commits into
Conversation
vLLM 0.33.0 is compiled against and pins torch 2.14.0, so this also moves the torch stack: torch 2.14.0, torchvision 0.29.0, triton 3.8.0, NCCL 2.30.7, flashinfer 0.7.2.post1, transformers 5.20.2 (what vLLM 0.33 CI tests), nvidia-cudnn-frontend 1.31.0, and NIXL 1.5.0 (required by vLLM's NIXL connector from 0.33). Breakages fixed: - serving_tokens: upstream reads sampling_params.logprobs before consuming outputs and passes derender_request; decide logprob packing up front. - server: cli_args moved to vllm.entrypoints.common. - qwen38 PLE overlap is now a method; GPT-OSS _load_weights_other lost heads_per_rank/head_start and sinks now load via their own loader. - routed experts: _get_local_prefix_cache_hit takes max_cache_hit_length; P/D decode requests skip the new retained-row caps. - sampling_order: accept has_topp_only_rows. Removed (fixed upstream): DeepSeek V4 C128 boundary (#59709), DeepSeek V4 attn_sink loading (#57797), aux-output store eviction rescan (#62392). flash-mla has no torch 2.14 build; the trainer now uses the FlashMLA vLLM bundles (also on aarch64). flash-attn moves to its torch 2.14 wheels. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…itself vllm-project/vllm#41482 resets load_inplace before caching the adapter. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
faresobeid
marked this pull request as ready for review
November 2, 2026 19:55
…orch 2.14 From PrimeIntellect-ai/prime-kernels release v0.1.0-b050074 (PrimeIntellect-ai/prime-kernels#24). torchao stays on v0.1.1: it only uses the stable libtorch ABI. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vllm-project/vllm#62591 admits an external hit only when every block's routing rows are still retained, which it does for at most 2x the GPU KV cache. With a CPU offload tier every multi-turn reload was refused: 0 external hit tokens per turn on a 48-conversation x 4-turn OLMoE run (RTX PRO 6000), vs 13-25k with routed experts off. A load within the routed-experts clamp needs none of its rows, so admit it whole; with the fix the external hits match the routed-experts-off run exactly, every row count is right and generated tokens are identical. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…LM 0.33 vllm-project/vllm#61343 quantizes per-token groups as x * (1/s) instead of x / s, so the trainer's Triton casts (meant to be bit-identical to vLLM's) differed in 0.03-0.08% of fp8 values. Multiply by the exact reciprocal (div_rn(1, s)) on the non-ue8m0 path; test_fp8_utils passes again (25/25 on an RTX PRO 6000). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # uv.lock
This branch has not been deployed
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.
Bumps vLLM 0.32.0 -> 0.33.0. vLLM 0.33 is compiled against and pins torch 2.14.0, so this is also a torch bump for the trainer.
Dependencies
vllm0.33.0 wheel. The GitHub release is attached to tagv0.33.0rc3(same commit asv0.33.0, sha256s match PyPI), so the wheel URLs usedownload/v0.33.0rc3/vllm-0.33.0-…;download/v0.33.0/…404s.torch2.13.0 -> 2.14.0, pinned exactly inoverride-dependencies(>=let the override replace vLLM's==2.14.0and resolve 2.14.1). torchvision 0.29.0, torchaudio 2.11.0, triton 3.8.0, NCCL 2.30.7. 2.14.1 only fixes MPS and the CUDA 13.2 builds, so 2.14.0 is right for cu130.transformers5.19.0 -> 5.20.2 (vLLM 0.33 allows<5.21and its CI tests 5.20.2).flashinfer-python/flashinfer-cubin/flashinfer-jit-cache0.7.0.post1 -> 0.7.2.post1;tokenspeed-mla2.0.3,humming-kernels0.1.19 (already exempt from the cooldown),nvidia-cudnn-frontend>= 1.31.0 (resolves to 1.32.0). Merged withmain(verifiers bump, prime CLI as a uv tool).nixlis pinned indisagg(uv otherwise kept 0.10.1, which drags innixl-cu12) and thedependency-metadataoverride moves to 1.5.0 — 1.5's metadata still requires bothnixl-cu12andnixl-cu13. The NIXL Python API prime-rl uses (transports/weights/nixl/agent.py) is unchanged between 0.10.1 and 1.5.Dockerfile.cudaandscripts/install_nixl_from_source.shuse the tagv1.5.0(tags gained avprefix in 1.0).flash-attn2.8.3 wheels ->cu130torch2.14(mjun0812 v0.10.0 x86_64, v0.10.1 aarch64). Checked: imports on torch 2.14, carries sm_80/90/100/120 cubins.flash-mladropped. There is no torch 2.14 build (skyrl-wheels stops at 2.13) and the 2.13 wheel links the unstable libtorch ABI. The trainer'scudnn_flashmlabackend now calls the FlashMLA vLLM bundles (vllm.third_party.flashmla,_flashmla_C.abi3.so, FlashMLA 2026.09.30 / [Kernel][DSv4.1] Bump FlashMLA to the 2026.09.30 release and its interleaved V4.1 KV cache vllm-project/vllm#61371): sameflash_mla_sparse_fwdsignature, withattn_sinkandtopk_length. This also removes the duplicate-FlashMLA symbol clash the DSv4 kernel tests worked around, and brings the backend to aarch64.torchao(stable ABI),flash_attn_3(abi3),mamba-ssm(Triton-only build), quack / FA4 / sonic-moe / dion / torchtitan / modelexpress (pure Python). torchtitan @ 23e4dfc needs no bump.Breakages fixed
serving_tokens.py(every non-streaming/inference/v1/generate):serve_tokens_full_generator(..., derender_request=...)([Frontend] Add derender output mode to generate vllm-project/vllm#60082) → accept and forward it.sampling_params.logprobsbefore consuming the result generator, so clearing it inside the loop no longer worked: the default flatlogprobs<=1path and the compact path hitAssertionError: Did not output logprobs(500). The packing decision is now made up front and upstream gets a copy with logprobs off. New testtest_flat_sampled_logprobs_are_packedcovers the default RL path.output_mode="tokens"(0.33'stext/derendermodes need detokenization).server.py:vllm.entrypoints.launchers.cli_argsmoved tovllm.entrypoints.common.cli_args([Frontend] Consolidate startup utils. vllm-project/vllm#62390).qwen38_weight_loading.py:compute_ple_shard_overlapbecamePLEVocabParallelEmbedding._compute_shard_overlap([Qwen4Exp] Clean up HC and PLE implementations for Qwen3.8-Flash-Next vllm-project/vllm#61454). This ImportError sat at the top ofapply_shared_vllm_patches, and vLLM swallows plugin errors, so every later patch was silently skipped.gpt_oss_weight_loading.py:_load_weights_otherlostheads_per_rank/head_start, and sinks now load through their own TP-aware loader ([Bugfix][RL] Load attention sinks through weight_loader for layerwise reload vllm-project/vllm#57797). The sink branch is removed (it would now narrow twice under TP>1); expert routing through loaders is kept (upstream stillparam.copy_s them).monkey_patch_routed_experts_cut_loaded_prefix_hits:Scheduler._get_local_prefix_cache_hit(request, max_cache_hit_length)([Bugfix][AuxOutput] Retain routed experts while a KV cache tier holds their blocks vllm-project/vllm#62591); the old wrapper raised TypeError on every new request. New test.monkey_patch_routed_experts_with_pd_connectors: #62591 caps local and external hits at the blocks whose routing rows this instance retains (max_cache_hit/cap_external_hit). A P/D decode instance has no rows for a remotely prefilled prompt, so the cap would zero the NIXL load and recompute the whole prompt on decode. Decode-side P/D requests now skip both caps. New test.monkey_patch_clamp_kv_offload_loads_for_routed_experts): #62591 admits an external hit only when every block's routing rows are retained, which it does for at most 2x the GPU KV cache, so with a CPU offload tier every multi-turn reload was refused. GPU A/B (OLMoE-1B-7B, RTX PRO 6000, OffloadingConnector, 160 GPU blocks, 48 conversations x 4 turns,routed_experts_prompt_start= previous turn): external hit tokens per turn were 0 / 0 / 0 / 0 with routed experts on (with or without the 0.32 clamp) vs 0 / 18432 / 24576 / 13312 with them off. A load within the clamp needs none of its rows, socap_external_hitnow admits it whole: with the fix the routed-on run hits exactly like the routed-off run, every row count is right, generated tokens are identical (192/192) and there is noBlockObjectStoreError. The clamp therefore stays (it bounds those loads).trainer/models/kernels/fp8_utils.py): [Perf] per_token_group_quant_8bit: multiply by reciprocal instead of dividing per element vllm-project/vllm#61343 quantizes per-token groups asx * (1/s)instead ofx / s, so the trainer's Triton casts, which are meant to be bit-identical to vLLM'sper_token_group_quant_fp8, differed in 0.03-0.08% of fp8 values (scales unchanged). The non-ue8m0 path now multiplies by the exact reciprocal (div_rn(1, s));test_fp8_utilspasses again (25/25).sampling_order.py: accept the newhas_topp_only_rowskwarg (PRL_TOP_P_BEFORE_TOP_K=1raised TypeError).test_routed_experts_pd.py:AuxOutputSchedulerConnectornow needs akv_cache_manager.Patches deleted (fixed upstream in 0.33)
monkey_patch_deepseek_v4_c128_boundary: [Bugfix][DSv4] Don't bake the C128 compressor skip into CUDA graphs vllm-project/vllm#59709 (skip is no longer captured into CUDA graphs).monkey_patch_deepseek_v4_attn_sink_loading: [Bugfix][RL] Load attention sinks through weight_loader for layerwise reload vllm-project/vllm#57797 (sinks load viaload_attention_sink, for every DSv4/V4.1 variant). The patch would now raise AttributeError and would mis-shard under TP>1.server.pyLoRA reload: theload_inplace = Falsereset on the stored request — [bug] Fix lora reloading from disk every step when using AsyncLLM vllm-project/vllm#41482 resets it before caching (the only store point; error paths return first). We still forceload_inplace = Trueon the request.monkey_patch_aux_output_store's eviction override: [Perf][AuxOutput] Do not rescan referenced keys in the routed-experts store vllm-project/vllm#62392 keeps referenced keys out of the LRU. The 2x store headroom is kept (with a KV connector the scheduler now retains up to 2x KV blocks; a 1x store would grow by copying its arena on the engine path); its upstream-equivalence test is replaced by a headroom test.Every other patch was checked against the 0.33 source and its target is unchanged in name, signature and the behavior we rely on;
_patch_lora_key_prefix's copy is still in sync (lora_model.pyis unchanged). Still needed on 0.33: KV-transfer freed assert (#46240 open), MiniMax think-end, online FP8 parameter cast, online MXFP8 kernel on reload (#62406 closed unmerged), GLM5-Next KDA conv weights (#60991 merged after the 0.33 cut), routed-experts chat stripping, DP coordinator timeout, no-MoE-LoRA, request replay.Torch 2.14
activation_checkpointing.py: passrespect_saved_tensors_hooks=Falseto keep today's behavior (SAC-saved tensors are not offloaded); 2.14 otherwise warns whenever activation offloading is on.PREMUL_SUMproducing all-zero expert grads withreduce_dtype="bfloat16"+ EP (pytorch#190747; our defaultreduce_dtypeis float32). Inductor'saten_distributed_optimizations.enable_simple_overlapis now on by default and reorders the funcol collectives indeepseek_v4/attention.pyanddistributed/ngram_lookup.py— watch for memory or hangs there (=Falserestores 2.13 behavior).Behavior changes checked, no action
wait/abortmodes; prime-rl always pauses withmode="keep"(server.py,orchestrator/clients.py,inference/dynamo.py).ParamMeta/iter_full/iter_local, #63256, #35911, #60934, #62555): prime-rl uses its own PyNccl broadcast + layerwise reload, notvllm/distributed/weight_transfer.kv_transfer_paramsmoved to the top level of/renderoutput (#61241): prime-rl does not call/render.finish_reason(#59324) changes only affect the eval chat path: a length-truncated tool call is nowlength, nottool_calls.vllm:*metrics prime-rl reads still exist.vllm._Cis now_C_stable_libtorch, but ops stay undertorch.ops._C.Kernel wheels for torch 2.14
prime-kernels,deep-ep,deep-gemm,deep-selectlink the unstable libtorch ABI (prime_kernels/flash_moe/_Cfailed to import on 2.14 with an undefined symbol). PrimeIntellect-ai/prime-kernels#24 builds them against2.14.0+cu130; the pins point at releasev0.1.0-b050074(prime_kernels-0.1.0+cu130torch2.14.0). DeepGEMM 891d57b compiles its extension as C++17 and torch 2.14's headers require C++20, so the build switches it to-std=c++20(what vLLM's DeepGEMM fork does).torchaostays onv0.1.1(stable ABI).prime_kernels.flash_moe._Cnow imports on torch 2.14; deep-ep / deep-select need a GPU to import.Recommended separately (prime-kernels#20): DeepGEMM 2.5.0 -> 2.8.1 (
vllm-project/DeepGEMM@0820030, what vLLM 0.33 vendors). vLLM imports site-packagesdeep_gemmbefore its vendored copy, so ours shadows it in inference. 2.8.1 removesfp8_mqa_logits, sotrainer/models/kernels/fp8_indexer.py:277must move tofp8_fp4_mqa_logitsin the same change.Validation
pytest tests/unit -m "not gpu"on vLLM 0.33.0 / torch 2.14.0: 1085 passed, 1 xfailed;ruff checkandruff format --checkclean.apply_shared_vllm_patches()runs to completion on 0.33 (withPRL_TOP_P_BEFORE_TOP_K=1andPRIME_NO_MOE_LORA=1), and is idempotent;server.py/serving_tokens.pyimport.vllmimport insrc/,tests/,packages/against 0.33: no missing names after the fixes above. Every patched or subclassed upstream function whose source changed between 0.32 and 0.33 was diffed and reviewed.vllm/vllm-openai:v0.33.0): the routed-experts + KV offload A/B above.gpu-ci, 2xH200): requested, but theprime-rl-2xh200runner has not picked up any GPU job since 11-02 14:48 (main's included), so the GPU suite ran on RTX PRO 6000 (SM120) sandboxes instead:pytest tests/unit -m gpu, file by file: everything passes except tests of kernels SM120 doesn't support: DeepGEMM fp8 (test_fp8_indexer,test_fp8_grouped_gemm: "Unsupported architecture" / "Unknown recipe"), prime-kernelsindexed_attention(qwen3_8_flash_next/test_vlm: needs sm_80/90/100/103), andtest_fused_lm_head, whose process dies mid-file (to be rechecked on H200).test_fp8_utilscaught the vLLM #61343 cast change above.tests/integration): the runs train normally (e.g. reverse_text: 5 steps, mismatch KL 0.0007-0.008) but this sandbox is several times slower than the CI runners, so they exceed the tests' 5-20 min budgets; rerunning with longer budgets.Needs GPU before merge:
cudnn_flashmlakernel tests on SM90 and SM100 (vLLM's FlashMLA fork vs nv_dev@b7643bd).BlockObjectStoreError.Dockerfile.cudabuild (NIXL v1.5.0 source build: its[build-system]now requirestorch==2.11.*, which only affects the bundlednixl_ep, unused here).Follow-ups (not in this PR):
monkey_patch_routed_experts_cut_loaded_prefix_hits: redundant without P/D (on 0.33 every non-P/D external load has retained rows). Still needed for P/D decode instances that also serve non-P/D requests: decode requests load prompt blocks without rows, and upstreamrequest_finishedthen records those GPU-cached blocks as row-holding. Delete together with the P/D patch if routed experts + P/D is dropped. The same gap makes an offload connector on a P/D decode instance unsafe for external hits on those blocks.weight_scaleshards are not filtered by the reload patch (harmless; falls through to upstream).🤖 Generated with Claude Code