test(e2e): serve Qwen3.5 0.8B on shared vLLM path - #128
Conversation
host_serve_target's vLLM branch served Qwen2.5-1.5B, feeding the four most-run Instinct serve scenarios (serve-vllm-inference, serve-readiness-contract, serve-default-engine-working-endpoint and its inference half). Qwen2.5-0.5B is the smallest vLLM-preferred catalog entry and is already served+asserted-vLLM by serve-vllm-default-on-instinct, so switching cuts the loaded model ~3x on those lanes with no coverage loss. Weights lazy-download to the shared HF cache, so no CI prewarm list changes. Signed-off-by: fredespi <fredrik.espinoza@gmail.com>
Document, at host_serve_target (where serve models are chosen), that every GPU serve scenario uses the smallest model satisfying its assertion, name the current per-engine floors (vLLM 0.5B, lemonade 0.6B), and note that large-model coverage lives solely in the @nightly serve-large-model scenario. Prevents a future serve scenario from silently pinning a larger model and reintroducing weight-load overhead on the per-PR path. Signed-off-by: fredespi <fredrik.espinoza@gmail.com>
volen-silo
left a comment
There was a problem hiding this comment.
Reviewed against the model catalog, the affected scenarios, and the xfail matrix. The explicit-engine size cut is a clean win, but the swap also silently changes default-engine resolution on Instinct, which invalidates the xfail matrix for two of the four scenarios the PR names. Requesting changes to either scope the swap or update expectations.toml (and re-verify on GPU).
🔴 The swap changes engine selection, not just model size
host_serve_target().0 feeds two different code paths:
setup_gpu_model— serves with an explicit--engine vllm. Here the model is the only variable, so 1.5B → 0.5B is a pure win. ✅user_serves_default_engine(line 435) — serves with no--engine, so the CLI resolves the engine from the model'spreferred_engines. This is where the behavior changes.
In model_catalog.json:
- old
Qwen/Qwen2.5-1.5B-Instruct→preferred_engines: ["lemonade"],loader: llamacpp,dtype: gguf - new
Qwen/Qwen2.5-0.5B-Instruct→preferred_engines: ["vllm"],loader: transformers,dtype: float16
So rocm serve <model> --managed (no engine) on an Instinct host now resolves to vLLM instead of lemonade. That's the exact assumption the xfail entries for the default-engine scenarios rest on:
[["serve-default-engine-working-endpoint"]] # and serve-default-engine-inference
when = { effective_engine = "vllm" }
bug = "EAI-7052"
reason = "Default serve resolves to a GGUF recipe on lemonade; its Vulkan backend hangs on Instinct, so the endpoint never reaches ready."That reason is only true for a lemonade-preferred model. With the vLLM-preferred 0.5B it no longer holds.
Impact on the MI300X lane (e2e-gpu, non-blocking but the PR's "real verdict")
serve-default-engine-working-endpointasserts only engine auto-selected + model reachable (assert_model_reachable— a/v1/modelscheck, no inference). vLLM does reach/v1/modelsready on Instinct (EAI-7333 is inference-only), so both assertions now pass → XPASS against the EAI-7052 xfail → reconciliation exits 1 ("bug appears fixed; update expectations.toml").serve-default-engine-inferenceasserts inference. vLLM ready-but-refuses-inference (EAI-7333) means it still fails — so it stays green in reconciliation, but now for a different bug than its entry claims (EAI-7333, not the EAI-7052 lemonade hang). Stale/misleading attribution.
(Pre-existing wrinkle this now exposes: the feature comment at model_serving.feature:64–66 already attributes the xfail to EAI-7333, while expectations.toml says EAI-7052 — the swap makes that mismatch matter.)
Two ways to resolve
- (a) Scope the swap (minimal, behavior-preserving): give
user_serves_default_engineits own model constant that stays lemonade-preferred (or otherwise resolves as before), so onlysetup_gpu_model's explicit-vLLM path takes the 0.5B size win. The default-engine scenarios and their xfail rationale are untouched. - (b) Embrace it and update the matrix: drop the
effective_engine = "vllm"/ EAI-7052 entry forserve-default-engine-working-endpoint(it should now pass), re-attributeserve-default-engine-inferenceto EAI-7333, reconcile the feature comment, and confirm on the MI300X lane. This is arguably better coverage (a real default-vLLM endpoint instead of a permanent lemonade-hang xfail), but it must be done in this PR, not left to a red GPU lane.
🟡 Minor: now-inverted comment at serving_steps.rs:430
The illustrative example (e.g. Qwen2.5-1.5B → a GGUF recipe on lemonade) was accurate for the old model but is now the opposite of what happens (0.5B → vLLM). Update or generalize it.
✅ Good
- The explicit-engine path (
setup_gpu_model) swap is sound: 0.5B is a real catalog entry, vLLM-preferred, safetensors, and already proven vLLM-servable byserve-vllm-default-on-instinct(user_serves_vllm_capable_default). - The model-size policy doc comment is a genuinely useful guardrail and matches the code (vLLM 0.5B / lemonade 0.6B floors; 27B only in
@nightly). All other repo1.5Breferences are unrelated fixtures, correctly left alone.
host_serve_target also feeds the default-engine serve step (no --engine), where the model's own preferred_engines decides which engine runs. Swapping the shared target to the vLLM-preferred 0.5B flipped default-engine resolution on Instinct from lemonade to vLLM, invalidating the EAI-7052 xfail for serve-default-engine-working-endpoint / -inference (they would XPASS and fail reconciliation). Add default_engine_serve_target (stays lemonade-preferred) for that step, keeping the 0.5B size cut only on the explicit --engine vllm path (serve-vllm-inference, serve-readiness-contract). Default-engine resolution is now identical to before the swap; no xfail-matrix change. Signed-off-by: fredespi <fredrik.espinoza@gmail.com>
|
Thanks — confirmed against Went with option (a) — scope the swap ( The now-accurate illustrative comment ( |
rominf
left a comment
There was a problem hiding this comment.
Automated review: Approve.
The blocking concern from the earlier review is resolved at the current head. The model-size change no longer affects default-engine resolution: user_serves_default_engine uses the new default_engine_serve_target, preserving the pre-change 1.5B lemonade path, while host_serve_target now has only the explicit-vLLM setup caller. The 0.5B optimization is therefore scoped to the intended vLLM scenarios.
I also verified the touched model-policy comments against model_catalog.json; they match the catalog.
The non-blocking GPU job is red because existing expected-failure entries XPASSed, with no unexpected failures. The base already exhibited part of this expectation drift, and the default-engine path is unchanged by this PR. Refreshing those expectations belongs in a separate change.
Signed-off-by: Roman Inflianskas <Roman.Inflianskas@amd.com>
|
Post-review update: commit |
Summary
Qwen/Qwen3.5-0.8Bin the shared explicit-vLLM GPU precondition used by the real serve and chat scenarios.--engine vllmpath; no model-catalog entry or CI prewarm change is required.qwen3_5architecture path with the pinned Transformers stack, so the MI300X GPU lane is the authoritative compatibility check.Test plan
cargo fmt --all -- --checkcargo test -p e2e-cucumber --all-targets(23 passed)cargo clippy -p e2e-cucumber --all-targets -- -D warnings