Validate Qwen-Image-2.1 serving on Ampere (RTX 3090) and report upstream #1
Open
opened 2026-10-07 18:16:57 -04:00 by anodyine
·
5 comments
ISSUE-1
Clear current reference
main
ISSUE-5
ISSUE-2
pr-6169
codex/shared-stage-payload-transport
release/v0.31.0rc1
dev/vllm-align
debug/qwen3-omni-doc-audio-artifacts
debug/qwen3-tts-failed-speech-audio
debug/cosyvoice-conditioning
debug/cpu-collective-isolation
debug/stage-client-reload-isolation
debug/sana-video-parallel-fixture
debug/qwen25-two-card-fixture
debug/realtime-invalid-fixtures
debug/auxiliary-omni-lifecycle
debug/request-session-preservation
debug/engine-worker-ownership
dev/vllm-align-baseline-v0300
perf/cosyvoice3-hopper-default
perf/cosyvoice3-streaming-hift
docs/repository-owned-review-skill
codex-docs-v0.30.0
release/v0.30.0
fix/qwen3-tts-full-payload-buffer
codex/omni-edge-abstraction
qwen-image-2.1
release/v0.30.0rc1
perf/qwen3-tts-event-driven-default
codex-issue-7035-h100-determinism
frontend/multi-api-server-scaling
codex-hwr-domain-timeout
codex-diffusion-shutdown-escalation
release/v0.29.0rc1
backup/vllm-align-remote-20260915-0ae9bdd8c
perf/moss-local-batched-execution
codex-hwr-memory-diagnostic
codex-hwr-registration-policy
codex-hwr-integrity-policy
codex-hwr-build-admission
codex-hwr-quarantine-cleanup
codex-hwr-capacity-scan
codex/fix-qwen3-omni-moe-backend
codex/fix-offline-profiler-config
codex/fix-hunyuan-image3-expert-mapping
codex/fix-hub-kernel-dependencies
codex-vae-b300-stack-tiling
codex/fix-mot-one-sided-bias
codex-minimax-h3-vendor-callback
codex-api-server-user-guide
release/v0.28.0
test/dots-tts-e2e-coverage
fix/qwen3-tts-codec-eos-guard
revert-5464-test_minicpmo_4_5
codex-6297-topology-aware-diffusion-worker-title-v2
revert-6307-codex/6297-topology-aware-diffusion-worker-title
codex-revert-mammothmoda2
release/v0.28.0rc1
codex-flux2-klein-bf16-hwr
fix/minicpmo45-duplex-context-overflow-signed
codex-dlo-cache-budget-config
revert-6624-fix/hf-snapshot-name-match
codex-dlo-encoder-residency
codex-fix-env-var-ratchet-6217
codex-dlo-lifecycle-optimization
minicpm-challenge
feat/qwen3-tts-deadline-scheduler-signed
feat/qwen3-tts-deadline-scheduler
codex/qwen3-tts-default-chunk-ramp
codex-fix-omni-sleep-wake-resume
revert-6574-revert-6557-fix/wan-dmd-alignment-test
codex/host-weight-post-load-publication
codex/dlo-runtime-cache-phase-b
ci/warmup-full-concurrency-batch
rl-http-interfaces
codex-dlo-fp8-cache-phase1
codex-pr6279-benchmark-assets
codex-harden-x-to-video-audio
codex/dlo-registered-mmap-prototype
codex-dlo-host-weight-plan
codex-split-attention-offload-guides
codex-rank-local-mmap
news_update
codex-vae-spatial-decode-auto
codex-community-docs-refresh
codex-quantization-support-guide
codex-pd-navigation
codex-ltx2-vae-channels-last
codex-fix-pr-6011
codex-consolidate-lingbot-text-to-video
codex-ltx-2-5-diffusers
codex-quantization-consistency
codex/fix-dlo-5954
codex-canonical-image-task-examples
codex-user-guide-feature-alignment
release/v0.27.0rc1
codex-update-cache-dit-1.5.0
codex-precheck-pr-example-policy
codex-fix-lingbot-t2i-save
codex-contributor-agent-skills-docs
codex-qwenimage-vae-spatial-decode-auto
codex-wan-vae-data-movement
codex-request-vae-fastpaths
codex-vae-compile-warmup
codex-fix-rtd-doc-link
copilot/fix-code-review-comment
codex/general-example-docs
codex-docs-quantization-recipes
codex-review-config-provenance
codex/update-architecture-overview
codex-dlo-rank-local-gif
codex/module-design-doc-layout
perf/minimax-h3-lossless-hot-path
codex-dlo-design-docs
codex-design-docs-reorg
perf/minimax-h3-adaln-cache-offload
revert-4958-perf/code-predictor-fuse-qkv-gateup-v2
codex-v0.26.0-docs
release/v0.26.0
fix/tp-local-kv-recv-consensus
fix/cfg-companion-output-race
test/logprobs-sched-026-mocks
revert-5478-BugFixForOmniGPUWorkerBase
release/v0.26.0rc1
agent/daily-pr-labeler-workflow
fix/pr4709-review-followup
feature/refactor-2
lishunyang12/skip-softmax-trtllm-gen
codex/readme-v0.24.0-docs
release/v0.25.0rc1
docs/vllm-0.25-bump
fix/entrypoint-ci-timeouts-main
fix/entrypoint-ci-timeouts
release/v0.24.1
codex/lingbot-dense-latest-main
release/v0.24.0
bugfix/qwen3-tts-batched-seeded-mtp
bugfix/qwen3-tts-remove-default-seed
dev/voxcpm2-unified-graph-followups
bugfix/qwen3-tts-customvoice-asr-escalation
bugfix/qwen3-tts-seed-propagation
dev/voxcpm2-unified-decode-graph
copilot/research-github-issue-4510
codex/update-codeowners-maintainers
release/v0.24.0rc1
revert-2565-fix/ssrf-image-video-url
release/v0.22.0.post1
fix/rebase-pipeline-upload-all-e2e
dev/migrate-MR-v2
release/v0.23.0rc1
codex/fix-diffusion-allrank-rpc
fix/omni-weight-snapshot-prefetch
codex/cleanup-pr-template
readme-update-supported-models
SamitHuang-patch-1
docs/update-v0.22.0-release
feature/precheck-pr-skill
release/v0.22.0
revert-3943-feat/sensenova-u1-fp8-online-mot-gen
feat/diffusion-prefetch-protection
release/v0.20.0
feat/vllm-upgrade
release/v0.22.0rc1
lance-model-support
fix-mot-rmsnorm-vllm021
codex/unskip-fp8-z-image-quality
fix/version-tag-alignment-3858
helios/accuracy-maintained-main
docs/add-new-committers
release/v0.21.0rc1
worktree-enable-twine-upload
khluu/release-docker-images
update-v0200
revert-3304-FusedRMSNorm
copilot/revert-3162-whitelist-optimization-signed
revert-1338-refine-diffusion-loader
revert-3118-voxcpm2-instructions-cfg
copilot/update-documentation-in-pull-request-2972
claude/fix-diffusion-cache-ci-iFBqB
release/v0.18.0.post1
codex-revert-pr-reviewer
pipeline-npu
community-recipes
add-skill
khluu/release3
khluu/release2
release/v0.19.0rc1
update-committers
governance-update
v0.18.0-release-news
khluu/release
release/v0.18.0
dev/rebase-v0.18.0
release/v0.18.0rc1
khluu/fix_ci
ywang96-patch-1
governance
codex/update-readme-slides-link
revert-1255-er-stable-audio-online
dev/rebase-v0170
release/v0.17.0rc1
v016
release/v0.16.0
khluu-patch-2
khluu-patch-1
revert-1431-feature/pr-reviewer-auto-trigger
copilot/rebase-to-upstream-vllm-v0150
release/v0.16.0rc1
copilot/find-opening-prs-excluding-diffusion
release/v0.15.0rc1
release/v0.14.0.post1
dev/rebase-v0.15.0
main-doc
update-doc-to-014
release/v0.14.0
revert-954-handler_fix
release/v0.14.0rc1
copilot/fix-output-issues
copilot/fix-typo-in-documentation
copilot/discuss-issue-823
update-doc
release/v0.12.0rc1
test-ready-label
khluu/ci_pipeline_gen
h100-ci
khluu/ci
docker-doc
dockerfile
raw-image-logo
wzliu_connector_dev
pq_dev
buildkite-2
split-ode-solver
qby_dev/cpu_support
copilot/update-actions-upload-artifact
Clear current reference
v0.31.0rc1
v0.30.0
v0.30.0rc1
v0.29.0rc1
v0.28.0
v0.28.0rc1
v0.27.0rc1
v0.26.0
v0.26.0rc1
v0.25.0rc1
v0.24.1
v0.24.0
v0.24.0rc1
v0.23.0rc1
v0.22.0
v0.22.0rc1
v0.21.0rc2
v0.21.0rc1
v0.20.0
v0.20.0rc1
v0.19.0rc1
v0.18.0
v0.18.0rc1
v0.17.0rc1
v0.16.0
v0.16.0rc1
v0.15.0rc1
v0.14.0
v0.14.0rc1
v0.12.0rc1
v0.11.0rc1
Labels
Clear labels
area/agent-workflow
area/backend
area/docs
area/frontend
area/tests
area/workflow
priority/P0
status/done
status/in-progress
status/needs-info
status/needs-triage
status/ready-for-agent
status/ready-for-human
status/review
status/wontfix
type/architecture
type/bug
type/docs
type/epic
type/feature
type/refactor
type/roadmap
type/test
Agent workflow area
Backend area
Documentation area
Frontend area
Testing area
General workflow area
Exceptional interrupt; not a complete priority taxonomy
Work is complete
Implementation is in progress
Blocked pending more information
Needs initial review and prioritization
Ready for an agent to claim
Ready for human review or action
Implementation is ready for review
Work will not be pursued
Architecture or system-design work
Defect or regression
Documentation work
Epic grouping related work
New behavior or capability
Internal restructuring without behavior change
Canonical repository work queue
Test coverage or test infrastructure
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Blocks
Reference: anodyine/vllm-omni#1
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Context
Qwen-Image-2.1 support merged into vLLM-Omni main via vllm-project/vllm-omni#8099 (2026-10; supersedes the closed #7759). Every published validation is GB200/H200-class; Ampere (sm_86) appears nowhere in their validation history, and their FP8 table marks Ampere "not validated" for this model. We have a 24 GB RTX 3090 sitting idle and digest-verified Diffusers baselines for the exact pinned model snapshot (
Qwen/Qwen-Image-2.1@790c9263) — the ingredients of the missing validation cell, produced with their own instruments.Motivating context in the helper-system repo:
docs/speculative/research/qwen-image-kv-cache-and-reference-capacity.mdand the shortlist's re-check triggers (multi-model-helper-server #162, merged 2026-10-07).Host and environment facts
cachyos-alexanderat192.168.0.39, useranodyine, key-based SSH from the workstation (ssh anodyine@192.168.0.39; no password needed). User lingering is on, sosystemd-run --usertransient units persist. The host may be powered off between sessions; the owner starts it.relayview-inference.service(a vLLM worker that grabs the whole GPU) is disabled — do not re-enable it during this work; it starts at boot if enabled./etc/docker/daemon.json; the CDI spec regenerates at boot). Verified working 2026-10-07.~/Projects/vllm-omni-val/vllm-omni—origin= this mirror (ssh://git@tea.kyle-merritt.com:2222/anodyine/vllm-omni.git),upstream= GitHub. At upstreammain8484d85d1when the environment was built. The mirror carries every upstream branch and all tags (31 at mirror time).~/Projects/vllm-omni-val/venv(the system python is 3.14, which the package refuses; the venv is required). Installed:vllm==0.30.0,torch==2.13.0(cu130 wheel; the upstream runner used cu129 — disclose in the report),transformers==5.14.1, diffusers from git@122b1e11, repo editable. Verified 2026-10-07:torch.cuda.is_available()True, deviceNVIDIA GeForce RTX 3090.~/.local/state/multi-model-helper-server/state/image-service/weights— snapshotQwen/Qwen-Image-2.1revision790c92633540aa0cb11d9abf19eb46d861714758, 27 files. Serve withHF_HOMEset there. If the runtime resolvesmain, pin the cache'srefs/mainto the sealed revision:printf %s 790c92633540aa0cb11d9abf19eb46d861714758 > $HF_HOME/hub/models--Qwen--Qwen-Image-2.1/refs/main.~/.local/share/multi-model-helper-server/data/evaluation/media/image/attempts/— the Q1d baseline is2026-10-05T183523Z-q1d; the reduced-step attempts are2026-10-07T142033Z-q3-20,153628Z-q3-10,161944Z-q3-15,170729Z-q3-4r,183012Z-q3-15-4r. Each directory'ssamples.jsonmaps fixture + seed → output file and sha256. Renders are deterministic (reruns byte-identical), so same-seed comparison is exact.Plan
Environment— done, see Host and environment facts.Weights— located; therefs/mainpin is applied if needed at serve time.RTX 3090 (sm_86)hardware column, numbers, honest failure notes. Owner reviews and posts.Contribution mechanics (for the day there is code)
vllm-project/vllm-omni:main, rebased on current main first.Acceptance Criteria
Out of scope
Environment milestone (2026-10-07, cachyos-alexander): the Python 3.13 venv built cleanly with vllm==0.30.0, torch==2.13.0, transformers==5.14.1, diffusers@122b1e11 (git), repo installed editable at upstream main
8484d85d1. Verified: torch.cuda.is_available() = True on the RTX 3090 (sm_86). Two deltas to disclose in the upstream report: the torch wheel resolved to the cu130 build rather than the runner's cu129 (functionally equivalent on driver 615.71.09 / CUDA 13.4; disclose in the comment), and the first build attempt on Python 3.14 failed on the package's <3.14 constraint. Next: locate and run the runnable Qwen-Image pytest files on the card, then the BF16-eager fixed-seed serve and PSNR A/B.Session-state correction (2026-10-08): the relayview-inference.service note above described the 2026-10-07 session. Its enabled/disabled state is owner-controlled and may differ between sessions — the owner re-enabled it since. Before measurement work: check
ssh anodyine@192.168.0.39 nvidia-smi; if relayview holds the GPU, ask the owner to stop it (sudo systemctl disable --now relayview-inference.service) rather than treating the issue text as current state. Do not stop it yourself. Tooling note:ghis not installed on the workstation — read upstream PRs via web fetch or install gh before drafting the upstream comment.Validation complete — sm_86 results and upstream draft
All four acceptance criteria are met. Evidence lives on
cachyos-alexanderunder~/Projects/vllm-omni-val/issue1/(logs, renders, scripts, PSNR output); the harness scripts are~/Projects/vllm-omni-val/issue1-teapot.sh,issue1-ab.sh,issue1-serve.sh.Environment corrections made during the run (disclosed in the draft)
vllmpackage had to move 0.30.0 → 0.31.0. PyPIvllm==0.30.0fails at import on main8484d85d1(MultiModalProcessingResultmissing fromvllm.multimodal.processing.processor). The repo's owndocker/Dockerfile.cudapinsvllm/vllm-openai:v0.31.0, so 0.31.0 is the intended pairing; upgrading fixed imports without touching torch.assets/qr.png(README asset, not a model file), so therequire_all=Truesnapshot download cannot complete offline. Serving from the snapshot's local path bypasses hub resolution cleanly;refs/mainis pinned to790c9263andHF_HUB_OFFLINE=1set.requirements/common.txtminus thediffusers==0.40.0pin (kept git0.41.0.dev0@122b1e11).Results summary
pytest -q tests/diffusion/models/qwen_image_21/(verbatim PR command)--enforce-eager --enable-cpu-offload(1024², 50 steps, seed 42, BF16)vllm serve … --enforce-eager --enable-cpu-offload+ recipe curlstage_0_gen61.55 s,peak_memory22.0 GiB, queue wait ~0.2 msHousekeeping:
relayview-inference.servicewas found re-enabled at boot and holding 22.7 GB; the owner disabled+stopped it (2026-10-07 ~21:00). It is still disabled — re-enable when this work is closed if wanted.DRAFT — upstream comment for vllm-project/vllm-omni#8099 (owner reviews and posts)
Qwen-Image-2.1 on Ampere (RTX 3090, sm_86, 24 GB) — validated: unit tests pass, BF16 eager serving works with model-level CPU offload, fixed-seed renders sit ~35–47 dB PSNR from same-checkpoint diffusers baselines.
Environment: vllm-omni main
8484d85d1(editable) · vllm 0.31.0 · torch 2.13.0+cu130 · transformers 5.14.1 · diffusers0.41.0.dev0(git122b1e11) · Python 3.13 · RTX 3090 24 GB, driver 615.71.09, CUDA 13.4 · checkpointQwen/Qwen-Image-2.1@790c9263(digest-pinned snapshot, served from a local path withHF_HUB_OFFLINE=1).One setup note: on this commit the base package must be vllm 0.31.0 — PyPI 0.30.0 fails at import (
MultiModalProcessingResultnot invllm.multimodal.processing.processor), consistent withdocker/Dockerfile.cuda'svllm/vllm-openai:v0.31.0base.1. Unit tests — verbatim test-plan command:
→ 91 passed.
2. Offline t2i — recipe Quality Comparison command plus the two 24-GB additions (
--enforce-eager --enable-cpu-offload;--modelis the local snapshot path):3. Online serving — recipe server + verification curl (verbatim except the local model path and the two offload/eager flags):
Weights load: 16.98 GiB in 9.2 s (warm page cache); API ready well under 90 s. Server-reported response metrics:
stage_0_gen61.55 s,peak_memory22.0 GiB,queue_wait~0.2 ms.4. Fixed-seed A/B vs diffusers — same checkpoint (
790c9263), seed 2300, 40 steps,true_cfg_scale=1.0, BF16, ~1MP native aspect ratios, KV cache on both sides. Diffusers reference: torch 2.14.0+cu126, group-offload-disk (recorded wall ~125 s/image on the same card).Same-seed outputs match structurally (same scene/composition; clean renders, no artifacts). Not pixel-exact, as expected across torch builds and the prefix-KV-cache compute path.
Caveats (honest notes):
tests/e2e/online_serving/test_qwen_image_21.pyas-written errors on 24 GB: theOmniServerfixture (--vae-use-tiling --max-num-seqs 2) starts no offload, so the server exits before ready. Expected for its H100 CI tier; flagging for other small-VRAM users.Render images for review are attached to this issue (teapot offline/online, and the market A/B pair vs the Diffusers baseline).
Addendum (2026-10-07, owner-authorized): the review draft below was completed with four additions — same-stack Diffusers A/B, warmup-1 + median-of-3 serving latency with exact API-ready time, FP8 weight-only runs, and LPIPS. This supersedes the earlier draft above. New artifacts on
cachyos-alexanderin~/Projects/vllm-omni-val/issue1/(qwen_image_21_diffusers_rtx3090.png,qwen_image_21_fp8_{all,imgmlp}_rtx3090.png,bench-*.json/txt,fp8-*.log,compare.py).New headline numbers: vLLM-Omni eager vs same-stack Diffusers on the 3090: 48.02 dB PSNR / 0.0017 LPIPS (H200 reference: 47.17 dB) · API ready in 31 s, median-of-3 latency 60.1 s · FP8 weight-only works on sm_86 (coherent renders, 58.6 s, 18.4 GB peak) but
--ignored-layersis silently inert on that path (byte-identical outputs with and without) and fixed-seed PSNR vs BF16 collapses to 7 dB (pure trajectory divergence — different valid composition).FINAL DRAFT — upstream comment for vllm-project/vllm-omni#8099 (complete, supersedes earlier draft)
Qwen-Image-2.1 on Ampere (RTX 3090, sm_86, 24 GB, single GPU): validated. Unit tests pass, BF16 eager serving works (with model-level CPU offload), same-stack parity vs diffusers matches the H200 band (48.0 dB PSNR / 0.0017 LPIPS), and the FP8 weight-only path runs and produces coherent images — with two honest caveats below.
Environment
8484d85d1(editable) · vllm0.31.0· torch2.13.0+cu130· transformers5.14.1· diffusers0.41.0.dev0(git122b1e11) · Python 3.13Qwen/Qwen-Image-2.1@790c9263— digest-pinned snapshot served from a local path,HF_HUB_OFFLINE=1vllm==0.30.0fails at import (MultiModalProcessingResultmissing fromvllm.multimodal.processing.processor), consistent withdocker/Dockerfile.cuda'svllm/vllm-openai:v0.31.0base.1. Unit tests — test-plan command verbatim:
→ 91 passed.
2. Offline t2i + same-stack diffusers A/B — recipe Quality Comparison commands (24 GB additions:
--enforce-eager --enable-cpu-offloadon the vLLM side;enable_model_cpu_offload()instead of.to("cuda")on the diffusers side;--modelis the local snapshot path). Both sides: same card, same torch build, same diffusers commit, teapot prompt, 1024×1024, 50 steps, seed 42, BF16, true_cfg 1.0.3. Online serving — recipe server + verification curl (verbatim except local model path and the offload/eager flags):
API ready 31 s after process start (health-polled; warm page cache; weights: 16.98 GiB in 9.2 s). Warmup 1 + 3 identical requests, server-reported metrics:
4. FP8 on Ampere (weight-only; sm_86 has no FP8 compute → Marlin weight-only) — recipe FP8 command + offload:
--ignored-layers img_mlpTwo findings here, reported plainly:
--ignored-layersis silently inert on the weight-only path: the run log confirmsIgnored layers: ['img_mlp']was parsed and passed, yet outputs with and without it are byte-identical (same md5). Possibly a Marlin-path limitation worth a docs note or an assert.5. Cross-stack A/B vs production diffusers baselines (secondary evidence; diffusers side ran torch 2.14.0+cu126, diffusers
6256aa76, group-offload-disk): 6 prompts, same snapshot, seed 2300, 40 steps, cfg 1.0 → PSNR 34.66–47.49 dB, mean 37.84 dB; vLLM gen ~51 s/image. Same scenes/compositions on visual inspection; drift consistent with the cross-build delta.Caveats
tests/e2e/online_serving/test_qwen_image_21.pyas-written errors on 24 GB: theOmniServerfixture (--vae-use-tiling --max-num-seqs 2) starts no offload, so the server exits before ready. Expected for its H100 CI tier; noting for other small-VRAM users.Correction from issue #2's probe (PR #4, commit
4f5f99d8): reinspecting this issue's FP8 artifacts shows bothqwen_image_21_fp8_all_rtx3090.pngandqwen_image_21_fp8_imgmlp_rtx3090.pngare ~96.5% transparent (opaque fraction 0.035, alpha mean ≈115) — the same structural collapse issue #2 reproduced and isolated to the Marlin-quantized DiT on sm_86 (T2I and edit path alike; transformer-only fp8 also collapses; BF16 on identical requests is fully opaque). The offline fp8 validation here checked rc=0 and image production, not output structure, so any "fp8 works on this card" reading of those runs is retracted — the 18.4 GB capacity measurement stands, the quality implication does not. If the upstream comment draft from this issue mentions the fp8 runs as working, that line should be dropped or corrected before posting. Full isolation matrix:probe/issue-2/FINDINGS.mdin PR #4.