mstar.engine.resources.base#
Functions
|
Classes
A resource a layer stack calls per layer, under one plan label. |
|
|
|
|
|
|
How much of a walk's input a resource already holds for |
|
What the engine has to offer a resource at build time. |
|
A keyed label's walks, as a resource's prefix cache takes them: the walks whose writes are keyed, and the growth walks whose sampled ids extend the keys. |
|
- class mstar.engine.resources.base.AttentionResource[source]#
Bases:
ResourceA resource a layer stack calls per layer, under one plan label.
Adds the label / layer-index cursors: a caller running the whole stack sets them once instead of threading them through every call, and an explicit argument still supersedes. Class-level defaults so a subclass picks them up without touching its __init__; subclasses that read them clear them in plan, so a step that never binds cannot inherit the previous step’s.
The KV, attention and cross-attention resources; not the sampler or the position resource, which are called once per step rather than per layer.
- class mstar.engine.resources.base.CGSlotKey(bucket: 'BucketKey', slot: 'int', label: 'str')[source]#
Bases:
object
- class mstar.engine.resources.base.CGSlotSpec(bucket: 'BucketKey', slot: 'int', config: 'AcceleratorGraphConfig | PiecewiseAcceleratorGraphConfig', config_idx: 'int | None' = None)[source]#
Bases:
object- Parameters:
bucket (BucketKey)
slot (int)
config (AcceleratorGraphConfig | PiecewiseAcceleratorGraphConfig)
config_idx (int | None)
- property bs#
- property num_tokens#
- class mstar.engine.resources.base.CachedPrefix(label, tokens, position)[source]#
Bases:
NamedTupleHow much of a walk’s input a resource already holds for
label.tokenscounts the walk’s leading inputs held, andpositionis the stream’s position counter once they are skipped.
- class mstar.engine.resources.base.EngineResourceInfo(device, joint_comm_group=None, transfer_engine_info=None, kv_dtype=torch.bfloat16, needs_remote_transfer=True, dependencies=<factory>, max_rows_in_combined=<factory>)[source]#
Bases:
objectWhat the engine has to offer a resource at build time.
One struct rather than per-kind keyword arguments: a resource takes what it needs and ignores the rest, and a name that does not exist here is a TypeError rather than something silently swallowed by a
**kwargs.- Parameters:
device (torch.device)
joint_comm_group (JointGroups | None)
transfer_engine_info (TransferEngineInfo | None)
kv_dtype (torch.dtype)
needs_remote_transfer (bool)
dependencies (Mapping[str, NodeResourceSpec])
- dependencies: Mapping[str, NodeResourceSpec]#
- device: torch.device#
- kv_dtype: torch.dtype = torch.bfloat16#
- class mstar.engine.resources.base.KeyedWalks(writes, growth=())[source]#
Bases:
NamedTupleA keyed label’s walks, as a resource’s prefix cache takes them: the walks whose writes are keyed, and the growth walks whose sampled ids extend the keys.
- class mstar.engine.resources.base.PublishedInfo[source]#
Bases:
ABC- abstractmethod clone()[source]#
Return independent publication metadata for deferred sending.
- Return type:
- abstractmethod update(other)[source]#
- Parameters:
other (PublishedInfo)
- Return type:
None
- class mstar.engine.resources.base.Resource[source]#
Bases:
ABC- admit(step, ctx)[source]#
Reserve space for the given step. In the case where requests in a batch must be executed sequentially, this may be called for all requests in a loop before the per-request plan -> forward -> commit cycle.
- Parameters:
step (ResourceStep)
ctx (StepContext)
- Return type:
- admit_retrieve(rid, node_name, graph_walk, published)[source]#
Takes the output of publish, possibly from another device, and kicks of a retrieval if needed (e.g., PD disaggregation KV transfer). Returns whether the retrieve has completed.
- Parameters:
rid (str)
node_name (str)
graph_walk (str)
published (PublishedInfo | None)
- Return type:
- adopt_cached_prefix(rid, node_name, graph_walk, pages, caught_up)[source]#
On a TP follower, lease
pagesas rank 0 did. False until this rank holds them too, and raises if it still lacks them oncecaught_up.
- apply_cached_prefix(rid, node_name, graph_walk, inputs, prefix)[source]#
Take on the prefix every resource agreed to skip, or None if there is none.
The inputs are untrimmed, so a resource that needs the tokens being skipped can still read them.
- Parameters:
rid (str)
node_name (str)
graph_walk (str)
inputs (Any)
prefix (CachedPrefix | None)
- Return type:
None
- abstractmethod classmethod build(spec, info)[source]#
- Parameters:
spec (NodeResourceSpec)
info (EngineResourceInfo)
- Return type:
- build_accelerator_graph_buffers(slots, max_bs, max_seq_len)[source]#
Size whatever the captured replays will read.
Called once per runner that captures against this node — the whole forward’s, and one per piecewise region — so it must tolerate repeated calls: grow to the largest shape asked for, never clobber what an earlier call already sized.
- Parameters:
slots (list[CGSlotSpec])
max_bs (int)
max_seq_len (int)
- Return type:
None
- can_reload(rid)[source]#
Whether the request can be reloaded. If this is False, the Engine will not attempt to reload. If True, it will attempt to reload but still check that the reload was successful.
- commit(step, ctx)[source]#
record step consumption
- Parameters:
step (ResourceStep)
ctx (StepContext)
- Return type:
None
- complete_cached_walk(rid, node_name, graph_walk)[source]#
Called for a walk the cache served whole, since that walk never admits or commits.
- enable_prefix_cache(root, walks=None)[source]#
Open whatever this resource keeps across requests, under
root; True if anything opened.- Parameters:
root (bytes)
walks (dict[str, KeyedWalks] | None)
- Return type:
- extend_prefix_chain(rid, node_name, graph_walk, outputs)[source]#
Take this step’s sampled tokens, so what was generated can be keyed.
- fingerprint()[source]#
What this resource contributes to the prefix cache’s root.
Everything a stored page depends on beyond its own tokens. None leaves the resource out of the root, which is right only where it cannot change what a page holds.
- Return type:
bytes | None
- property force_double_buffer#
Whether this resource needs double-buffering even off the pre-plan path.
A resource that stages a step’s layout into a reused host buffer and issues a non-blocking H2D into a graph-read device buffer has a race the moment the CPU runs ahead of the GPU: plan(N+1) can overwrite the buffer before step N’s DMA has retired, and the replay attends with N+1’s data. The buffer need not be ours — FlashInfer’s
planholds one per wrapper, which is why the attention managers key theirs per slot. The main runner already double-buffers whenever a resourcesupports_preplan; this flag extends that to a runner that has no pre-plan path but still replays such a resource — notably the piecewise runner — and makes_exec_per_requestfence before it reuses a slot, since its sub-steps all run inside one step. Off by default; a resource opts in only if it has this hazard.
- get_offload_priority(rid)[source]#
How much this resource wants
ridgone, higher being more.Only consulted under a PRIORITY eviction policy, which names the resource to ask; LRU never calls it.
- ingest_capture_row(rid)[source]#
Open a CUDA graph capture padding row; by default, as a request.
- Parameters:
rid (str)
- ingest_request(rid, overrides)[source]#
Must be idempotent: the conductor sends one NewRequest per partition, so a worker serving several partitions of a request ingests it once for each, possibly after a node has already run a step for it.
- Parameters:
rid (str)
overrides (ResourceReqConfig | None)
- property keys_prefix_chains: bool#
Whether
extend_prefix_chaincan do anything right now (a prefix cache is open). The runner skips the per-request sweep otherwise. A resource that overridesextend_prefix_chainbut not this is swept every step.
- lease_cached_prefix(rid, node_name, graph_walk)[source]#
On rank 0 of a TP node, lease the request’s cached prefix as its step is sent and return the pages, or None.
- page_trail()[source]#
How many page allocations this resource has made and a hash of their pages in order, for a TP follower to check against rank 0’s. None where it keeps no trail.
- plan(step, ctx)[source]#
ret is immutable and opaque to runner; only gives to ctx.plan_results
- Parameters:
step (ResourceStep)
ctx (StepContext)
- Return type:
- post_warmup_validate()[source]#
For, e.g., the KV cache to check that num_free_pages is identical across TP ranks after cuda graph capture.
Raises an error (fails loudly) if invalid.
- publish(request_id)[source]#
- Parameters:
request_id (str)
- Return type:
PublishedInfo | None
- publish_after_stop(request_id, node_name, graph_walk)[source]#
Publish state that is useful only when a dynamic loop stops.
- Parameters:
- Return type:
PublishedInfo | None
- publish_for_step(request_id, node_name, graph_walk)[source]#
Publish after one node step, with context for selective exporters.
Existing resources remain compatible through
publish; resources that need node/walk context can override this method.- Parameters:
- Return type:
PublishedInfo | None
- publish_from_snapshot(request_id, snapshot, node_name, graph_walk)[source]#
Finish a
publish_snapshot_for_steprecord into the published info.- Parameters:
- Return type:
PublishedInfo | None
- publish_snapshot_batch(request_ids, node_name, graph_walk)[source]#
publish_snapshot_for_stepfor every request of a step, one entry per request in order (None for nothing to publish). A resource with per-request locking or lookups overrides this to do them once.
- publish_snapshot_for_step(request_id, node_name, graph_walk)[source]#
A cheap record of what
publish_for_stepwould export right now.The worker finishes it with
publish_from_snapshotonly for the requests whose frame or completion carries the publication, which in a steady decode loop is none of them. The default takes the eager publication itself, so a resource is correct without overriding; one whose publish builds something per request (a page list, a transfer descriptor) overrides both to record a few scalars here instead.
- reclaimable(rid)[source]#
What offload would free, in whatever this resource counts.
0 means the request holds nothing worth taking, so it is not an eviction candidate however cold it is. Distinct from get_offload_priority, which orders candidates rather than sizing them.
- release_cached_prefix(rid, node_name, graph_walk)[source]#
Give back what lease_cached_prefix or adopt_cached_prefix took, for a step that will not run.
- resolve_cached_prefix(rid, node_name, graph_walk, inputs)[source]#
How much of this walk’s leading inputs this resource already holds.
None leaves the answer to other resources; 0 tokens means nothing can be skipped.
- Parameters:
- Return type:
CachedPrefix | None
- rollback_admit(step, ctx)[source]#
Give back whatever the live reservation for this step took.
Called on a refused admit, for every resource the step reached including the one that refused.
Only what was freshly taken. A page retained from a shared prefix, or a lease converted onto a stream, belongs to whoever else holds it.
- Parameters:
step (ResourceStep)
ctx (StepContext)
- Return type:
None
- property supports_eviction#
- property supports_preplan#
- mstar.engine.resources.base.build_resource(spec, info)[source]#
- Parameters:
spec (NodeResourceSpec)
info (EngineResourceInfo)
- Return type: