Skip to content

test: run the optional tier's payload cases against vLLM CPU servers - #745

Merged
kubernetes-prow[bot] merged 1 commit into
kubernetes-sigs:mainfrom
Bslabe123:test/optional-tier-to-cpu
Aug 26, 2026
Merged

test: run the optional tier's payload cases against vLLM CPU servers#745
kubernetes-prow[bot] merged 1 commit into
kubernetes-sigs:mainfrom
Bslabe123:test/optional-tier-to-cpu

Conversation

@Bslabe123

@Bslabe123 Bslabe123 commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Part of #606 (Testing, Test infrastructure and gating) and #748. Moves the tests/optional payload 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_url blocks by type string and never decodes bytes, checks a media format, or knows what a model supports (that shape check is test_multimodal_sim.py).

What

  • e2e/tests/test_vllm_cpu_multimodal.py: one case per file under e2e/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 overrides server/tokenizer with 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) and ibm-granite/granite-4.0-1b-speech (audio), the smallest ungated models vLLM lists for those modality sets.
  • A multimodal-e2e job in E2E 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 in e2e/vllm_multimodal_releases.txt the job starts each server, runs its slice, and fails a pass that skips anything. 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 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/chat stays as the deploy-path smoke (manifests, published image, ConfigMap, Job), which nothing else exercises. Its config was invalid on main (synthetic datagen is completion-only, so api.type: chat could not start); now shared_prefix.

Findings from running it

  • vLLM 0.26.0's CPU backend pins host memory when batching more than one multimodal item and kills the engine on the first multi-image request; fixed upstream, green on 0.27.1. The tier's release table therefore starts at v0.27.1, separate from e2e/vllm_releases.txt.
  • x86 runners cannot serve this slice, for the reason ci: run the e2e job on ARM runners so the live oracle stops failing on a runner draw #743 documents. In one run, the only job whose server did not log Failed to create oneDNN linear started 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.
  • These models profile one max-size encoder item before serving, so the script gained 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 validate clean, unit suite 865 passed, pytest tests/optional 1 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.

@kubernetes-prow kubernetes-prow Bot added the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Aug 18, 2026
@github-actions github-actions Bot added the do-not-merge DEPRECATED. Indicates that a PR should not merge. Label can only be manually applied/removed. label Aug 18, 2026
@kubernetes-prow kubernetes-prow Bot added cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. approved Indicates a PR has been approved by an approver from all required OWNERS files. labels Aug 18, 2026
@kubernetes-prow
kubernetes-prow Bot requested review from alonh and lenadankin August 18, 2026 21:49
@kubernetes-prow kubernetes-prow Bot added the size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files. label Aug 18, 2026
@github-actions github-actions Bot added do-not-merge DEPRECATED. Indicates that a PR should not merge. Label can only be manually applied/removed. and removed do-not-merge DEPRECATED. Indicates that a PR should not merge. Label can only be manually applied/removed. labels Aug 18, 2026
@github-actions github-actions Bot added do-not-merge DEPRECATED. Indicates that a PR should not merge. Label can only be manually applied/removed. and removed do-not-merge DEPRECATED. Indicates that a PR should not merge. Label can only be manually applied/removed. labels Aug 18, 2026
@Bslabe123
Bslabe123 force-pushed the test/optional-tier-to-cpu branch from 8447a6e to 8bb0285 Compare August 19, 2026 17:56
@github-actions github-actions Bot added the do-not-merge DEPRECATED. Indicates that a PR should not merge. Label can only be manually applied/removed. label Aug 19, 2026
@Bslabe123
Bslabe123 force-pushed the test/optional-tier-to-cpu branch from 8bb0285 to b97c1bc Compare August 19, 2026 18:04
@github-actions github-actions Bot removed the do-not-merge DEPRECATED. Indicates that a PR should not merge. Label can only be manually applied/removed. label Aug 19, 2026
@Bslabe123
Bslabe123 force-pushed the test/optional-tier-to-cpu branch from b97c1bc to 938820a Compare August 19, 2026 18:32
@github-actions github-actions Bot added the do-not-merge DEPRECATED. Indicates that a PR should not merge. Label can only be manually applied/removed. label Aug 19, 2026
@Bslabe123
Bslabe123 force-pushed the test/optional-tier-to-cpu branch from 938820a to 027ae9d Compare August 19, 2026 18:44
@github-actions github-actions Bot removed the do-not-merge DEPRECATED. Indicates that a PR should not merge. Label can only be manually applied/removed. label Aug 19, 2026
@Bslabe123
Bslabe123 marked this pull request as ready for review August 19, 2026 19:51
@Bslabe123 Bslabe123 changed the title [WIP] test: run the optional tier's payload cases against vLLM CPU servers test: run the optional tier's payload cases against vLLM CPU servers Aug 19, 2026
@kubernetes-prow kubernetes-prow Bot removed the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Aug 19, 2026
@kubernetes-prow
kubernetes-prow Bot requested a review from Jeffwan August 19, 2026 19:52
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
Bslabe123 force-pushed the test/optional-tier-to-cpu branch from 027ae9d to c535092 Compare August 19, 2026 20:16
@github-actions github-actions Bot added the do-not-merge DEPRECATED. Indicates that a PR should not merge. Label can only be manually applied/removed. label Aug 19, 2026
@github-actions github-actions Bot removed the do-not-merge DEPRECATED. Indicates that a PR should not merge. Label can only be manually applied/removed. label Aug 19, 2026
@Bslabe123 Bslabe123 changed the title test: run the optional tier's payload cases against vLLM CPU servers [WIP] test: run the optional tier's payload cases against vLLM CPU servers Aug 20, 2026
@kubernetes-prow kubernetes-prow Bot added the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Aug 20, 2026
@Bslabe123
Bslabe123 marked this pull request as draft August 20, 2026 15:34
@Bslabe123 Bslabe123 changed the title [WIP] test: run the optional tier's payload cases against vLLM CPU servers test: run the optional tier's payload cases against vLLM CPU servers Aug 20, 2026
@Bslabe123
Bslabe123 marked this pull request as ready for review August 20, 2026 15:51
@kubernetes-prow kubernetes-prow Bot removed the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Aug 20, 2026
@SachinVarghese SachinVarghese self-assigned this Aug 20, 2026
@Bslabe123 Bslabe123 added the priority/critical-urgent Highest priority. Must be actively worked on as someone's top priority right now. label Aug 20, 2026

@SachinVarghese SachinVarghese left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/lgtm

@kubernetes-prow kubernetes-prow Bot added the lgtm "Looks good to me", indicates that a PR is ready to be merged. label Aug 26, 2026
@kubernetes-prow

Copy link
Copy Markdown

[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

Details Needs approval from an approver in each of these files:
  • OWNERS [Bslabe123,SachinVarghese]

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@kubernetes-prow
kubernetes-prow Bot merged commit 5032e35 into kubernetes-sigs:main Aug 26, 2026
8 checks passed
@Bslabe123
Bslabe123 deleted the test/optional-tier-to-cpu branch August 26, 2026 15:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. lgtm "Looks good to me", indicates that a PR is ready to be merged. priority/critical-urgent Highest priority. Must be actively worked on as someone's top priority right now. size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants