Row: ENG-EXPERT-STREAM-DEVICE
Replaces #1124, which the tracker no longer resolves. gh issue view 1124 returns
GraphQL: Could not resolve to an issue or pull request with the number of 1124, not a
closed state. The row's own spec still points at it as the live tracking handle
(.agents/specs/expert-stream-device-slots.md:1344: "Tracking issue: #1124, which stays
OPEN"), so the capability below currently has no owner a reader can reach.
The description is recovered verbatim from the retired index
(.agents/completed/issue-index.md:343) and then re-grounded against origin/main
23ac6f1a7, because that record is weeks old and three of its four pieces have moved.
Recovered text (verbatim, .agents/completed/issue-index.md:343)
--device cuda still cannot SERVE a larger-than-pool GGUF after #1123; it refuses by
name instead of dying mid-stream. The missing capability is a DEVICE expert slot store,
and it is four pieces: HostExpertSlotStore is the only production ExpertSlotStore
(include/vllm/model_executor/host_expert_slot_store.h:28, the only other subclass
being a test double) while include/vllm/model_executor/expert_streamer.h:8-9,30-31
claims "the production destination is a contiguous device-side slot array" and is FALSE
today; the interface has no device-capable read, because KqExpertSlice reads back
through HostExpertSlotStore::Slot(), the CONCRETE class (qwen3_5.cpp:5258,5314); the
filler is pread-into-host, since SlotForWrite is handed straight to ::pread
(expert_streamer.cpp:76-94); and the consumer is device-gated by is_cpu() at
qwen3_5.cpp:5578. Sized: 2790 slices per token at 2,490,368 B is 6.95 GB per token
against a 119.631 GiB pool already holding the dense remainder.
Grounding verdict: STILL REAL, and it is now piece 2 alone
Piece by piece against today's tree. Two of the four are fixed, and saying so is the point
of re-filing rather than copying.
Piece 1 — half fixed. DeviceExpertSlotStore now EXISTS
(include/vllm/model_executor/device_expert_slot_store.h:61, implemented in
src/vllm/model_executor/device_expert_slot_store.cpp). Nothing in production constructs
one: git grep -n 'DeviceExpertSlotStore' -- src include returns only its own declaration
and definition plus one comment. So the class landed and nothing selects it. The false
comment the record complains about is also gone — expert_streamer.h:18 now says the
opposite.
Piece 2 — STILL REAL, verbatim, and this is the whole issue now. ExpertSlotStore
declares six virtuals and none of them is a read:
virtual ~ExpertSlotStore() = default;
virtual size_t slot_bytes() const = 0;
virtual int32_t slot_count() const = 0;
virtual void WriteSlot(int32_t slot, const uint8_t* src, size_t bytes) = 0;
virtual uint8_t* SlotForWrite(int32_t slot) = 0;
virtual void CommitSlot(int32_t slot, size_t bytes) = 0;
and the seam still holds the CONCRETE host type, so it cannot be swapped:
include/vllm/model_executor/expert_stream_seam.h:153 — std::unique_ptr<HostExpertSlotStore> store_;
src/vllm/model_executor/expert_stream_seam.cpp:343 — store_ = std::make_unique<HostExpertSlotStore>(slots, slot_bytes);
src/vllm/model_executor/expert_stream_seam.cpp:163 and :219 — return store_->Slot(r.slot);
HostExpertSlotStore::Slot is not on the interface, which is exactly why store_ cannot
become a base pointer.
Piece 3 — FIXED. CommitSlot is on the interface (above) and ExpertStreamer calls
it, so the filler is no longer pread-into-host by construction.
Piece 4 — FIXED for unified parts, still real for discrete. The is_cpu() guard moved
out of qwen3_5.cpp and widened to
if (cpu || p.host_memory_is_device_addressable()) in
src/vllm/model_executor/expert_stream_seam.cpp:419-431. A discrete device still falls
through.
So what is owed
One thing: a virtual read on ExpertSlotStore, and ExpertStreamLane::store_ holding
the base rather than HostExpertSlotStore. The row's spec already calls this W2 and
already says W1 landed unreached because of it
(.agents/specs/expert-stream-device-slots.md:1344). This issue exists so that statement
points at a handle that resolves.
Anchors in the recovered text that have DRIFTED — do not chase them
qwen3_5.cpp:5258, :5314, :5578 and expert_streamer.cpp:76-94 are all stale.
KqExpertSlice is now a three-line forwarder to ::vllm::expert_stream::ExpertSlice.
Ground by symbol.
Row:
ENG-EXPERT-STREAM-DEVICEReplaces #1124, which the tracker no longer resolves.
gh issue view 1124returnsGraphQL: Could not resolve to an issue or pull request with the number of 1124, not aclosed state. The row's own spec still points at it as the live tracking handle
(
.agents/specs/expert-stream-device-slots.md:1344: "Tracking issue: #1124, which staysOPEN"), so the capability below currently has no owner a reader can reach.
The description is recovered verbatim from the retired index
(
.agents/completed/issue-index.md:343) and then re-grounded againstorigin/main23ac6f1a7, because that record is weeks old and three of its four pieces have moved.Recovered text (verbatim,
.agents/completed/issue-index.md:343)Grounding verdict: STILL REAL, and it is now piece 2 alone
Piece by piece against today's tree. Two of the four are fixed, and saying so is the point
of re-filing rather than copying.
Piece 1 — half fixed.
DeviceExpertSlotStorenow EXISTS(
include/vllm/model_executor/device_expert_slot_store.h:61, implemented insrc/vllm/model_executor/device_expert_slot_store.cpp). Nothing in production constructsone:
git grep -n 'DeviceExpertSlotStore' -- src includereturns only its own declarationand definition plus one comment. So the class landed and nothing selects it. The false
comment the record complains about is also gone —
expert_streamer.h:18now says theopposite.
Piece 2 — STILL REAL, verbatim, and this is the whole issue now.
ExpertSlotStoredeclares six virtuals and none of them is a read:
and the seam still holds the CONCRETE host type, so it cannot be swapped:
include/vllm/model_executor/expert_stream_seam.h:153—std::unique_ptr<HostExpertSlotStore> store_;src/vllm/model_executor/expert_stream_seam.cpp:343—store_ = std::make_unique<HostExpertSlotStore>(slots, slot_bytes);src/vllm/model_executor/expert_stream_seam.cpp:163and:219—return store_->Slot(r.slot);HostExpertSlotStore::Slotis not on the interface, which is exactly whystore_cannotbecome a base pointer.
Piece 3 — FIXED.
CommitSlotis on the interface (above) andExpertStreamercallsit, so the filler is no longer
pread-into-host by construction.Piece 4 — FIXED for unified parts, still real for discrete. The
is_cpu()guard movedout of
qwen3_5.cppand widened toif (cpu || p.host_memory_is_device_addressable())insrc/vllm/model_executor/expert_stream_seam.cpp:419-431. A discrete device still fallsthrough.
So what is owed
One thing: a virtual read on
ExpertSlotStore, andExpertStreamLane::store_holdingthe base rather than
HostExpertSlotStore. The row's spec already calls this W2 andalready says W1 landed unreached because of it
(
.agents/specs/expert-stream-device-slots.md:1344). This issue exists so that statementpoints at a handle that resolves.
Anchors in the recovered text that have DRIFTED — do not chase them
qwen3_5.cpp:5258,:5314,:5578andexpert_streamer.cpp:76-94are all stale.KqExpertSliceis now a three-line forwarder to::vllm::expert_stream::ExpertSlice.Ground by symbol.