fix(gpu,render): quiet the foreign-VRAM warning on the display card, pin pooled krea2/LTX-2.5 CLIP+VAE off it - #479
Merged
Conversation
…pin pooled krea2/LTX-2.5 CLIP+VAE off it Two defects reported by the operator against PR #469 and the 2026-09-24 MultiGPU archival A/B (multigpu-archival-actions-2026-09-24.md): 1. gpu_foreign.go: the foreign-GPU-memory warning fired on ordinary desktop apps (Code.exe, chrome.exe, SnippingTool.exe, explorer.exe, ...) sitting on the Qube's DISPLAY card, not a work card. Fixed: raised the per-process floor 64 -> 512 MiB (configurable via foreign_gpu_min_mib), grew the OS shell/ desktop denylist (csrss, explorer, shell-experience hosts), and — the real multi-card fix — a resident whose every known GPU is a display card (gpuprobe.DisplayCardUUIDs, cross-referenced against nvidia-smi compute-apps' gpu_uuid per pid) is dropped, but only on a box that has a non-display card to actually score. A single-GPU box (its only card is also its display) still warns on a Resolve-class hog. 2. render/wf-krea2.mjs, render/wf-ltx25-i2v.mjs: the stock CLIPLoader/VAELoader nodes' "device" input only offers "default"/"cpu" — "default" is ComfyUI's own fastest-first pick, independent of the pool keys, and on the 3x16 reference tier that IS the display card. Every pooled krea2 render put the ~12 GiB Qwen3-VL-4B text encoder there regardless of imagegen_pool_compute/ _donor. Fixed: when pooled, the text encoder and VAE(s) now load through ComfyUI-MultiGPU's CLIPLoaderMultiGPU/VAELoaderMultiGPU pinned to the pool's donor device. Unpooled builds are unchanged. render/comfy-nodes.mjs and internal/mediacap/routeneeds.go updated so `doctor`/MISSING_NODE name the two new classes. Tests: gpu_foreign_test.go gets Qube-shaped (3 cards, desktop on the display card -> no warning; Resolve on a work card -> warning) and OptiPlex-shaped (1 card = display -> still warns) cases, plus effectiveForeignMinMiB coverage. wf-krea2.test.mjs / wf-ltx25-i2v.test.mjs get pooled-CLIP/VAE-device assertions and a generic "no loader left on ComfyUI's default device in a pooled graph" gate. routeneeds_test.go covers the new node-class lists. Every new guard was broken once (red) and restored, live in this session. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…_min_mib key go generate ./... (cmd/genexample) after adding config.Config.ForeignGPUMinMiB — TestConfigExampleCarriesEveryKey caught the missing key, flagged independently by the pr-review-toolkit:code-reviewer pass on this branch. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
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.
Summary
Two operator-reported defects, one PR (clean-ship).
Foreign-GPU-memory warning too noisy (PR fix(gpu): strict FIFO lease queue, fair seat admission, clear-every-resident unload, foreign VRAM warning #469 follow-up).
gpu status/gpu reserve's"foreign GPU memory holders" warning fired on ordinary desktop apps (Code.exe, PAIR.exe,
chrome.exe, SnippingTool.exe, msedgewebview2.exe, explorer.exe, csrss.exe, opera.exe) sitting
on the Qube's DISPLAY card (nvidia-smi index 1) — not a WORK card. Fixed:
foreign_gpu_min_mib)box that also has a non-display card to score — a single-GPU box (its only card is also its
display) still warns. Correlation is best-effort: PDH's per-process MiB (no per-card
identity) cross-referenced against nvidia-smi compute-apps' per-pid
gpu_uuid(reported evenwhen
used_memoryis[N/A]on Windows/WDDM) and the existinggpuprobe.DisplayCardUUIDs.Pooled krea2/LTX-2.5 text encoder loads onto the display card. Measured A/B
(
multigpu-archival-actions-2026-09-24.md): the stockCLIPLoader/VAELoadernodes'deviceinput only offers"default"/"cpu"—"default"is ComfyUI's own fastest-firstpick, independent of
imagegen_pool_compute/imagegen_pool_donor, and on the 3x16 referencetier that IS the display card. Every pooled krea2 render put the ~12 GiB Qwen3-VL-4B text
encoder there regardless of which two (non-display) cards the pool keys named. Fixed in
render/wf-krea2.mjsandrender/wf-ltx25-i2v.mjs: when pooled, the text encoder and VAE(s)now load through ComfyUI-MultiGPU's
CLIPLoaderMultiGPU/VAELoaderMultiGPU, pinned to thepool's donor device (verified against the actually-installed plugin source on the Qube,
C:\ComfyUI\custom_nodes\ComfyUI-MultiGPU\{__init__,wrappers}.py) — never the unnameddefault. Unpooled builds are unchanged.
render/comfy-nodes.mjsandinternal/mediacap/routeneeds.goupdated sodoctor/MISSING_NODEname the two new classes.How tested
go build ./...,go test ./...— all green (root package,internal/config,internal/mediacap, everything else).node --test render/*.test.mjs— 443/443 green, including new pooled-CLIP/VAE-deviceassertions in
wf-krea2.test.mjs/wf-ltx25-i2v.test.mjs.a work card -> warning) and OptiPlex-shaped (1 card = display -> Resolve still warns) cases in
gpu_foreign_test.go, pluseffectiveForeignMinMiBcoverage.in
classifyForeign(removing it un-suppressed Code.exe on the Qube-shaped fixture) and thepooled-CLIP device pin in
wf-krea2.mjs(reverting it re-failed both new JS assertions).config.example.jsonregenerated (go generate ./cmd/genexample) for the newforeign_gpu_min_mibkey — caught byTestConfigExampleCarriesEveryKey, itself caught by thepr-review-toolkit:code-reviewerpass on this branch (its only finding; fixed).pr-review-toolkit:code-reviewer(Sonnet) review of the whole branch: verified concurrency/timeout budget in
gpu_foreign.go, the pid/GPU-UUID correlation edge cases, config wiringacross all three
gpu_cmd.gocall sites, and consistency between the Go and JS node-packtables. No other findings.
Risk
Low.
gpu status/gpu reserve's warning is advisory-only (never gates a lease). The renderchange is behind
poolVvramGb > 0(an explicit opt-in) and leaves unpooled builds byte-identical— confirmed by tests. Neither path is exercised by CI hardware, so behavior is proven by unit
tests against the fixtures/measured values above, not a live render in CI.
🤖 Generated with Claude Code