test: run the optional tier's payload cases against vLLM CPU servers - #745
Merged
kubernetes-prow[bot] merged 1 commit intoAug 26, 2026
Merged
Conversation
Bslabe123
force-pushed
the
test/optional-tier-to-cpu
branch
from
August 19, 2026 17:56
8447a6e to
8bb0285
Compare
Bslabe123
force-pushed
the
test/optional-tier-to-cpu
branch
from
August 19, 2026 18:04
8bb0285 to
b97c1bc
Compare
Bslabe123
force-pushed
the
test/optional-tier-to-cpu
branch
from
August 19, 2026 18:32
b97c1bc to
938820a
Compare
Bslabe123
force-pushed
the
test/optional-tier-to-cpu
branch
from
August 19, 2026 18:44
938820a to
027ae9d
Compare
Bslabe123
marked this pull request as ready for review
August 19, 2026 19:51
This was referenced Aug 19, 2026
Open
The optional tier's multimodal cases check whether a real vLLM accepts the image, video, audio and shared-prefix payloads we build, and that question does not depend on model size or speed. They needed a GPU cluster and a person to run them, so they never gated anything. This moves the nine cases to e2e/tests/test_vllm_cpu_multimodal.py, against small models on real vLLM CPU servers, as a merge-blocking job. Two servers, because no small model covers image, video and audio at once: InternVL3-1B-hf for image and video, granite-4.0-1b-speech for audio. A case runs only when the served model covers every modality it needs, and a pass that skips anything fails the job, so a drifted modality table cannot quietly turn the gate off. The job goes in this workflow rather than one of its own. kubernetes-sigs#606 puts cpu-vllm in the at-merge lane, and the merge gate keys on workflow name, so a tier in its own workflow would report a rejected payload the morning after it merged. It is a second job rather than more steps in e2e-tests because the two halves need different models, context lengths, chat templates and release pins, and because two jobs finish in the wall clock of the slower one: 25 min here against 17 for e2e-tests. ARM runners, for the reason kubernetes-sigs#743 moved e2e-tests there. On x86 the failures tracked the runner draw and not the slice: of four jobs in one run, the only server without the "Failed to create oneDNN linear" fallback brought its engine up in 49s and passed, while the three carrying it took 623s, died 6.6 minutes into encoder profiling, or never finished profiling inside the health budget. The e2e-tests job met the same pool as a triton SIGILL; startup profiling does not survive the slower version. The release table is separate from e2e/vllm_releases.txt on purpose: 0.26.x's CPU backend pins host memory when it batches more than one multimodal item and kills the engine, and these pins carry no metric-families goldens.
Bslabe123
force-pushed
the
test/optional-tier-to-cpu
branch
from
August 19, 2026 20:16
027ae9d to
c535092
Compare
Bslabe123
marked this pull request as draft
August 20, 2026 15:34
Bslabe123
marked this pull request as ready for review
August 20, 2026 15:51
|
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: Bslabe123, SachinVarghese The full list of commands accepted by this bot can be found here. The pull request process is described here DetailsNeeds approval from an approver in each of these files:
Approvers can indicate their approval by writing |
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.
Part of #606 (Testing, Test infrastructure and gating) and #748. Moves the
tests/optionalpayload cases off GPU capacity onto real vLLM CPU servers in CI, keeping one cluster-backed case for the Kubernetes deploy path.Why
The optional tier held nine cases (eight multimodal, one text chat) that ran only by hand against Qwen3-VL-8B / Qwen2-Audio-7B on H100 and had never run in CI. Their single assertion is that a real vLLM accepts the image, video, audio and shared-prefix payloads inference-perf builds and every request completes. That oracle does not depend on model size or speed, so a plain runner can host it. The sim cannot: it recognises
image_url/input_audio/video_urlblocks by type string and never decodes bytes, checks a media format, or knows what a model supports (that shape check istest_multimodal_sim.py).What
e2e/tests/test_vllm_cpu_multimodal.py: one case per file undere2e/configs/vllm_cpu_multimodal/(images, video, mixed, mixed_frames, shared_image_prefix, shared_mixed_prefix, visionarena, chat, audio), payload shapes unchanged, sized for a 4-vCPU runner. The test overridesserver/tokenizerwith what the server serves and asserts the optional tier's oracle: clean exit, exactly the dispatched request count succeeded, zero errors. Servers:OpenGVLab/InternVL3-1B-hf(image + video) andibm-granite/granite-4.0-1b-speech(audio), the smallest ungated models vLLM lists for those modality sets.multimodal-e2ejob inE2E Test on change, not a workflow of its own: v0.7.0 Release #606 puts cpu-vllm in the at-merge lane, and the merge gate keys on workflow name, so a tier in a separate workflow would report a rejected payload the morning after it merged. Per release ine2e/vllm_multimodal_releases.txtthe job starts each server, runs its slice, and fails a pass that skips anything. A second job rather than more steps ine2e-tests, because the two halves need different models, context lengths, chat templates and release pins, and two jobs finish in the wall clock of the slower one.e2e/vllm_cpu_server.sh:VLLM_CHAT_TEMPLATE(empty = model's own),VLLM_MAX_MODEL_LEN,VLLM_HEALTH_TIMEOUT_SEC,VLLM_CPU_OMP_THREADS_BIND,VLLM_EXTRA_ARGS,VLLM_CONTAINER_NAME; default invocation unchanged.utils.vllm_server.served_modalities()added.tests/optional: multimodal cases removed;text/chatstays as the deploy-path smoke (manifests, published image, ConfigMap, Job), which nothing else exercises. Its config was invalid onmain(syntheticdatagen is completion-only, soapi.type: chatcould not start); nowshared_prefix.Findings from running it
v0.27.1, separate frome2e/vllm_releases.txt.Failed to create oneDNN linearstarted its engine in 49 s and passed; all three that logged it failed: one at 623 s, one killed in encoder profiling, one still profiling when the health budget expired.VLLM_HEALTH_TIMEOUT_SEC(default 300, 600 here). ARM startups measured 93-132 s, so that budget is headroom for a slow Hugging Face, not for the profiling pass.Status
Green on ARM: four passes (two releases x two servers), 18 case runs, zero skipped, 25 min wall clock against 17 for
e2e-tests. Locally:pdm run validateclean, unit suite 865 passed,pytest tests/optional1 skipped without--kubeconfigs.Still WIP for one decision: the job gates from its first run, and puts ~8 min on the merge gate's wall clock for every PR.