Provenance, Evidence, Resolved¶
Three methods say what a kernel rests on. Provenance lists
every value in scope and where each came from. Evidence counts how many rest on
evidence. Resolved reports the configuration it priced, including every request
the engine would not honor. This page lists what each can contain.
Provenance¶
Each entry is a kernel.CoefficientOrigin: a name, the set it came from, the method that
produced it, and its scope. Most entries are registry coefficients: every entry of the
scenario's sets whose scope covers this chip and model, whether or not this deployment's
steps use it. Their set is the registry set that supplied them, such as
cost-model-primitives. Their scope names the deployment's part, the model where the entry is
scoped to one, and, for a copied entry, the scope it was copied from: DeepSeek-V4.1's eager
launch cost on h100 reads hardware: h100, model: deepseek-v4.1-flash; copied from
hardware=h200,model=deepseek-v4.1-flash. The registry's
documentation describes each set and method.
Entries the kernel supplied itself carry the set blis-latency-kernel (the constant
KernelAssumptionSet) and the method assumed. Their scope holds the value used and the
reason. They are of two kinds.
Engine settings the kernel filled in¶
| Name | Recorded when |
|---|---|
attention_prefill_<kind> |
A measured prefill family for an attention kind (sparse_mla) or a scorer's role (block_index_scores) is only partly in the scenario's sets, so it is not used, and prefill is priced as without it. Value fallback. |
async_scheduling_spec |
The deployment speculates and the engine rules carry no async-compatible draft list, so the draft method is taken as leaving async scheduling on. |
block_size |
The deployment states no block size. 64 for a DSA sparse-attention model, whose indexer accepts only 64; for a DeepSeek-V4-family model the one kernel block its sparse backends accept on the part (for DeepSeek-V4.1 64 on SM90 and 128 on SM100; for DeepSeek-V4 256 on every part); otherwise vLLM's default of 16. |
cache_record |
A graph states a cache with no record listed under the cache data type that runs, so the cache is sized at its base record. |
compute_rate_<kind> |
A GEMM's weights are in a format whose rate the catalog does not state: FP32 weights run at the TF32 rate, taken as half the dense BF16 peak. |
compute_capability |
The catalog states no compute capability for the chip, so its generation is inferred from its native-format peaks and name where it decides kernel selection. |
cudagraph_mode |
No CUDA graph mode is stated. vLLM's default, FULL_AND_PIECEWISE. |
deepep_v2_mode |
The MoE dispatch runs DeepEP v2, whose path vLLM picks from enforce_eager, which a deployment cannot state: a resolved cudagraph_mode of NONE is read as it. Value deepep_v2_eager or deepep_v2_graph. |
dcp_comm_backend |
Decode-context parallelism is on and no combine backend is stated: the stock ag_rs. Also when one is stated but the engine rules give no list to check it against. |
engine_version |
The scenario declares a vLLM release other than the one whose behavior the kernel prices (v0.31.0). |
engram_cpu_offload |
A graph states an Engram table and the deployment does not say where it lives: the release's cpu_offload default. |
engram_dp_shared_memory |
An Engram table under data parallelism, with dp_shared_memory unstated: resolved as the engine resolves it. |
gemm_eps_max_<kind> |
A weight-only kernel (Marlin W8A16 MXFP8, W4A16 grouped) has no efficiency ramp in the registry for the part, so it is priced on the BF16 ramp at the BF16 peak it computes at. |
host_gather_rate_uva |
A table lookup reads a host-resident table (an Engram table under cpu_offload) and the registry has no rate for that gather, so its rows are read at the host link's rate. |
hybrid_kv_cache_manager |
A graph states window caches and the deployment runs a KV connector, which can turn the hybrid KV cache manager off and the window rings into full-length caches. |
kv_cache_grouping |
A graph states its caches and the rules pack cannot group them into the engine's shared block pool, so each cache is sized at its own page rather than in whole pool blocks. The reason names what the pack does not model. |
mamba_cache_mode |
A model with recurrent layers states no recurrent cache mode: align with prefix caching on, none with it off. |
max_cudagraph_capture_size |
Any CUDA graph is captured and the deployment states neither max_cudagraph_capture_size nor cudagraph_capture_sizes: vLLM's default ceiling, above which a step runs with no graph. |
max_model_len |
The deployment states no context length, or states auto: the bound is the model's context window from the graph (for auto, the most the engine can fit it to). |
max_num_batched_tokens |
No token budget per step is stated. vLLM's default for the chip's memory size. |
max_num_seqs |
No limit on concurrent requests is stated. vLLM's default for the chip's memory size. |
modality |
The graph prices the text decoder of a multimodal model; its vision or audio tower is not priced. |
mhc |
Only one of the mHC pre and post forms resolves, so neither is used. Value fallback. |
moe_a2a_<kind> |
A DeepEP backend (deepep_high_throughput, deepep_low_latency, deepep_v2_eager, deepep_v2_graph) runs the MoE dispatch but has no measured price for the part and expert width, or the expert group spans nodes, so it is priced as the generic routed all-to-all. |
mhc_<kind> |
An mHC component's rate (pre or post) is in the scenario's sets without its floor, so the measured mHC form is not used. Value fallback. |
mla_context_chunk |
Decode-context parallelism is on for a latent-attention model and no context length is stated, so the chunk in which a prefill gathers its cached context is taken at its largest. |
num_spec_tokens |
The deployment drafts a different number of tokens a step from the graph's speculator, so what the graph sizes at its own count is taken as stated. |
recurrent_prefill_rate_<kind> |
A recurrent mixer has no measured prefill form, so its prefill tokens are priced as the chunked scan's FLOPs on the BF16 ramp rather than at the decode scan's rate. |
sparse_mla_backend |
A DSA sparse-attention model on Hopper selects FlashInfer's sparse MLA backend, which needs a FlashInfer release the kernel cannot see installed. |
sparse_read_per_query |
A speculating deployment of a sparse-attention model: each verify token is charged its own window-and-top-k read, as vLLM gathers them, though the registry's rate was fitted on single-token decode and the sharing between a request's tokens was never measured. |
speculator |
The deployment speculates and the graph states no speculator, so draft passes are not priced; or the deployment names a different method from the graph's speculator, which is the one priced. |
Optional coefficients that were missing¶
When a coefficient the kernel can price without is absent from the scenario's sets, and the
deployment needs it, the entry is named for the coefficient, its value is absent, and its
reason says what was priced without it. These are the coefficients it can apply to; a
per-kind name ends in the kind it covers, such as _mla or _kda, and is needed only where
the model has a layer of that kind.
| Coefficient | Without it |
|---|---|
attention_decode_floor, attention_decode_rate |
No measured decode attention: the KV read is charged at memory bandwidth and the per-layer floor is not charged |
attention_decode_rate_<kind> |
The chip-wide attention pair is used for that kind; for a scorer named by its role, its attention kind's pair |
attention_decode_floor_<kind> |
A scorer with its own rate inherits the part-wide attention floor |
attention_prefill_floor, attention_prefill_work_scale |
Prefill attention is charged on the plain efficiency ramp, with no floor |
attention_prefill_rate_<kind> |
Prefill of that attention kind (sparse_mla) or scorer role (block_index_scores) is priced with the part-wide prefill pair on its FLOPs, not with its own measured floor, per-request, per-token and byte terms |
mhc_rate_<kind> |
The mHC nodes running that component (pre, post) are charged their stated bytes at memory bandwidth, and, without the pre form, the hc_*fn GEMMs on the dense ramp |
recurrent_decode_floor_<kind>, recurrent_decode_rate_<kind> |
The recurrent mixer's decode term is not charged |
recurrent_prefill_floor_<kind> |
A recurrent mixer with a measured prefill rate is charged no prefill floor |
moe_routing_imbalance_median |
Experts are priced as evenly loaded |
host_link_bandwidth |
An offload transfer is not capped at the host link's rate |
host_step_per_request |
The scheduler's per-request CPU cost is charged at zero; with it, a step without async scheduling carries it in series and one with async scheduling shows only its excess over the device work |
host_admission_per_token, host_admission_per_request, host_output_token, host_completion, host_launch_eager_per_layer, host_launch_per_kernel, host_replay_graph_per_step |
That host cost is charged at zero |
The eager launch cost is read as host_launch_eager_per_kernel where a set carries it, and as
host_launch_eager_per_layer otherwise; both are charged per kernel. A model-scoped entry
under either name is taken over a part-wide one.
Evidence¶
Evidence() returns three things: how many entries of Provenance rest on evidence (method
measured, literature or vendor_spec), how many there are in all, and the names of those
whose method is assumed. The last includes the kernel's own entries above and any registry
coefficient recorded as assumed. Entries with the methods copied and not_charged are in
the total and in neither of the other two.
Refuse, assume, override shows a worked
example.
Resolved¶
Resolved() returns a kernel.Resolution: the tensor-, data- and expert-parallel widths the
layout resolved to, the all-reduce backend that will run, whether asynchronous scheduling,
cascade attention and sequence-parallel MoE are on, and a list of overrides. Each
override names the field, what was requested, what was resolved, and why. The kernel records
these:
| Field | When |
|---|---|
all2all_backend |
An MoE dispatch backend is stated for an expert-parallel layout that runs no dispatch: dp 1, pcp 1 and no sequence-parallel MoE input, where vLLM's use_all2all_kernels is false. The experts run on the replicated tokens and the tensor-parallel all-reduce combines them, so the backend is resolved as none and every backend prices the same step. |
allreduce_backend |
The custom all-reduce was requested at a tensor-parallel width it does not support, or across nodes on a chip without multi-node NVLink. NCCL runs instead. |
cache_dtype |
A sparse-attention model's KV cache is stored in a packed format its backend chooses, such as fp8_ds_mla for a stated fp8 on Hopper, or DeepSeek-V4.1's nvfp4_ds_mla for a stated fp8 on SM100. |
cp_kv_cache_interleave_size |
Decode-context parallelism is on, the interleave is unstated, the block size is above one, and a NIXL connector is configured, so vLLM sets the interleave to the block size. |
cudagraph_capture_sizes |
Stated capture sizes above max_num_batched_tokens, which vLLM drops. |
cudagraph_mode |
DeepEP high-throughput with dp above one, or MoonEP where its all-to-all runs: the engine cannot capture the dispatch and runs with no CUDA graphs. |
mamba_cache_mode |
A hybrid model states none with prefix caching on, which vLLM runs as align. |
max_cudagraph_capture_size |
A stated maximum that vLLM lowers: capped at max_num_batched_tokens, or off the sizes it captures (1, 2, 4, every 8 below 256, every 16 from it). The largest size that runs is the ceiling. |
The two context-parallel widths are not yet fields of kernel.Resolution. Until blis-schemas
adds them, read them from DecodeContextParallelWidth() and PrefillContextParallelWidth().