You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Build and publish a self-contained Skippy layer package combining:
the existing Nemotron 3 Super UD-Q4_K_XL target;
NVIDIA's separately released BF16 MTPv2 head;
Daniel Winter-Wijntjes' request-local exact-suffix N-gram proposer; and
package-owned native-MTP, suffix N-gram, and composite MTP+suffix generation strategies.
The intended product strategy is mtp-suffix: native MTP predicts the uncertain prefix, suffix N-gram lookup extends it from earlier request-local prompt/tool history, and the target verifies the combined candidate. The package should download, plan, split, and serve like any other Mesh layer package, without an external draft_model_path and without requantizing the complete 120B target.
Inspection of the published GGUF shards confirms that they contain only blk.0 through blk.87: there are no MTP/NextN tensors or num_nextn_predict_layers metadata. The current package consequently reports layer_count: 88 and generation: null.
NVIDIA now publishes an updated MTP head separately:
nvidia/Nemotron-3-Super-120B-A12B-BF16-MTPv2;
approximately 3B parameters / 5.88 GB BF16;
num_nextn_predict_layers = 1; and
intended to be attached to a compatible Nemotron 3 Super target rather than served as a standalone model.
NVIDIA reports mean accepted-token lengths at draft length 7 of 4.86 for coding and 4.31 overall, compared with 3.78 and 3.45 for the original built-in MTP head. These are acceptance lengths, not direct end-to-end speedup figures, and must be remeasured on the Q4 target and Apple Silicon lab.
Why MTP plus suffix N-gram
The suffix N-gram proposer contributed in #1037 is aimed directly at coding-agent and tool-loop traffic:
file re-emission with localized edits;
repeated structured configuration;
repeated identifiers;
echoed tool output; and
long verbatim prompt regions.
Native MTP and suffix retrieval have complementary roles:
The MTP continuation is read-only lookup context and never enters suffix history until the target commits it. History remains request-local and is never shared between users or sessions. The target remains authoritative for every token.
The package must retain separate mtp and ngram-suffix strategies as controls so the composite result remains attributable.
Why a layer package
A self-contained layer package provides:
one model reference for discovery, download, and serving;
no machine-local MTP sidecar configuration;
package-owned selection of the composite strategy;
automatic native-MTP discovery through model-package.json;
topology and memory planning against the complete artifact set;
placement of the MTP weights only on the final/output stage;
reuse of the target's existing Q4 embedding, final norm, and LM head;
atomic versioning of the target/MTP pairing; and
normal package preflight, materialization, and cache behavior.
Publish this as a new distribution rather than replacing the existing non-MTP package.
This issue is a composition, package-generation, publication, and certification task. It should not introduce another speculative-decoding implementation.
Package shape
The combined model should contain:
88 target trunk blocks: blk.0 through blk.87;
one appended MTP block: blk.88;
nextn_predict_layers = 1;
the existing Q4 target embeddings, final norm, and LM head; and
BF16 MTPv2 tensors initially.
Expected size:
existing target: approximately 84.49 GB;
BF16 MTPv2 addition: approximately 5.88 GB; and
combined package: approximately 90.37 GB before minor packaging overhead.
The package should report 89 logical blocks: 88 target blocks plus the appended MTP block. Suffix N-gram state is request-local runtime state and adds no model-weight artifact.
Composite GGUF construction
Create a reproducible composition workflow that:
Reads all shards of the existing UD-Q4_K_XL GGUF.
Copies every target tensor byte-for-byte, preserving its existing quantization.
Converts NVIDIA's MTPv2 SafeTensors into GGUF tensor form.
Preserves the target tokenizer and chat-template metadata.
Generates the Skippy layer package from the composite model.
The complete 120B BF16 target must not be downloaded, converted, or requantized. Reuse the Q4 target's existing shared tensors, avoiding the approximately 2.15 GB of duplicated BF16 embedding/output tensors required by a standalone MTP sidecar.
Keep GGUF tensor inspection, metadata copying, filtering, and artifact writing in the patched native model-package ABI. Rust owns the package manifest, provenance, topology inputs, and model-storage integration.
Package generation metadata
The package should expose the complete measured strategy menu and select mtp-suffix as its intended default once the benchmark gate passes:
The numeric suffix and verification-window values above are starting candidates, not publication defaults. Tune at least:
native MTP tokens: 1, 3, 5, 7;
suffix ngram_min: 3, 5, 8;
suffix ngram_max: 16, 32, 64;
suffix proposal/extension budget: 8, 16, 32, 48; and
verification window: 4, 8, 16, 32.
Keep pipeline_depth = 1 until this exact package and topology have evidence that a deeper pipeline improves throughput without destabilizing KV/session behavior.
If mtp-suffix does not beat both MTP-only and suffix-only on the coding/tool-loop gate, publish all strategies but select the winning measured strategy as the package default and record why.
Provenance
Record both upstream model components and the runtime proposer provenance:
optionally ngram-cache / mtp-cache as the bounded llama.cpp cache control.
Use coding-agent workloads covering:
short coding completions;
repository-context edits;
file re-emission with localized changes;
repeated structured configuration;
tool-call loops and echoed tool output;
repeated identifiers;
long resident prefixes; and
unique versus repeated prefixes.
Record:
decode and end-to-end tokens/second;
drafted, accepted, and rejected tokens by proposer source;
MTP-prefix acceptance;
suffix-tail acceptance conditional on an accepted MTP prefix;
suffix hit/miss rate and lookup time;
candidate length and accepted length distributions;
MTP proposal and target verification time;
TTFT and TPOT;
peak memory by node;
single-node and two-node split performance; and
deterministic output parity.
Prefix-cache measurements remain separate: resident KV prefix reuse primarily improves repeated-prefix prefill/TTFT, while suffix N-gram is a request-local decode proposer and MTP predicts new decode tokens.
Initial performance hypothesis for single-stream coding on the Apple Silicon lab is approximately 1.5-2.3x target decode throughput for MTP alone, with mtp-suffix potentially improving repetitive coding/tool-loop workloads further. This is not an acceptance gate.
Follow-up quantization
Establish correctness with the BF16 MTP block first. Afterwards, produce package variants with only blk.88 quantized:
Q8 MTP; and
selective Q4 MTP.
Use skippy-quantize, not llama-quantize, for published Mesh artifacts. The existing target tensors must remain byte-identical. Report both TPS and MTP-prefix acceptance degradation for every MTP quantization; suffix-only behavior should remain invariant for the same committed history.
Goal
Build and publish a self-contained Skippy layer package combining:
UD-Q4_K_XLtarget;The intended product strategy is
mtp-suffix: native MTP predicts the uncertain prefix, suffix N-gram lookup extends it from earlier request-local prompt/tool history, and the target verifies the combined candidate. The package should download, plan, split, and serve like any other Mesh layer package, without an externaldraft_model_pathand without requantizing the complete 120B target.Background
The current target is:
unsloth/NVIDIA-Nemotron-3-Super-120B-A12B-GGUF;UD-Q4_K_XL;meshllm/NVIDIA-Nemotron-3-Super-120B-A12B-UD-Q4_K_XL-layers;Inspection of the published GGUF shards confirms that they contain only
blk.0throughblk.87: there are no MTP/NextN tensors ornum_nextn_predict_layersmetadata. The current package consequently reportslayer_count: 88andgeneration: null.NVIDIA now publishes an updated MTP head separately:
nvidia/Nemotron-3-Super-120B-A12B-BF16-MTPv2;num_nextn_predict_layers = 1; andNVIDIA reports mean accepted-token lengths at draft length 7 of 4.86 for coding and 4.31 overall, compared with 3.78 and 3.45 for the original built-in MTP head. These are acceptance lengths, not direct end-to-end speedup figures, and must be remeasured on the Q4 target and Apple Silicon lab.
Why MTP plus suffix N-gram
The suffix N-gram proposer contributed in #1037 is aimed directly at coding-agent and tool-loop traffic:
Native MTP and suffix retrieval have complementary roles:
The MTP continuation is read-only lookup context and never enters suffix history until the target commits it. History remains request-local and is never shared between users or sessions. The target remains authoritative for every token.
The package must retain separate
mtpandngram-suffixstrategies as controls so the composite result remains attributable.Why a layer package
A self-contained layer package provides:
model-package.json;Publish this as a new distribution rather than replacing the existing non-MTP package.
Suggested distribution id:
Existing runtime support
The required generic runtime pieces already exist:
ngram-suffixprovides a request-local exact-seed/suffix index with up to a 64-token match horizon;native-mtp+ngram-suffixcomposition;native-mtp,ngram-suffix, andcompositestrategies; andThis issue is a composition, package-generation, publication, and certification task. It should not introduce another speculative-decoding implementation.
Package shape
The combined model should contain:
blk.0throughblk.87;blk.88;nextn_predict_layers = 1;Expected size:
The package should report 89 logical blocks: 88 target blocks plus the appended MTP block. Suffix N-gram state is request-local runtime state and adds no model-weight artifact.
Composite GGUF construction
Create a reproducible composition workflow that:
UD-Q4_K_XLGGUF.blk.88.blk.88.The complete 120B BF16 target must not be downloaded, converted, or requantized. Reuse the Q4 target's existing shared tensors, avoiding the approximately 2.15 GB of duplicated BF16 embedding/output tensors required by a standalone MTP sidecar.
Keep GGUF tensor inspection, metadata copying, filtering, and artifact writing in the patched native model-package ABI. Rust owns the package manifest, provenance, topology inputs, and model-storage integration.
Package generation metadata
The package should expose the complete measured strategy menu and select
mtp-suffixas its intended default once the benchmark gate passes:{ "generation": { "speculative_decoding": { "default": "mtp-suffix", "proposers": { "mtp": { "type": "native-mtp", "prediction_depth": 1, "layer_indices": [88] }, "suffix": { "type": "ngram-suffix", "ngram_min": 5, "ngram_max": 32, "max_proposal_tokens": 48, "history_scope": "request" } }, "strategies": { "mtp": { "type": "native-mtp", "proposer": "mtp" }, "ngram-suffix": { "type": "ngram-suffix", "proposer": "suffix", "window_policy": { "default": "fixed", "initial_window": 16, "min_window": 1, "max_window": 32, "pipeline_depth": 1 } }, "mtp-suffix": { "type": "composite", "primary": "mtp", "extender": "suffix", "extension_policy": { "max_tokens": 48 }, "window_policy": { "default": "fixed", "initial_window": 16, "min_window": 1, "max_window": 32, "pipeline_depth": 1 } } } } } }The numeric suffix and verification-window values above are starting candidates, not publication defaults. Tune at least:
1, 3, 5, 7;ngram_min:3, 5, 8;ngram_max:16, 32, 64;8, 16, 32, 48; and4, 8, 16, 32.Keep
pipeline_depth = 1until this exact package and topology have evidence that a deeper pipeline improves throughput without destabilizing KV/session behavior.If
mtp-suffixdoes not beat both MTP-only and suffix-only on the coding/tool-loop gate, publish all strategies but select the winning measured strategy as the package default and record why.Provenance
Record both upstream model components and the runtime proposer provenance:
The package manifest currently identifies one source model. Resolve this explicitly by either:
Do not overload the existing single-source fields with ambiguous values.
Validation
Before publication:
ModelInfo.blk.0..87.blk.88.nextn_predict_layers = 1.layer_count = 89.mtp,ngram-suffix, andmtp-suffix.history_scope: requestand passes package preflight.skippy-model-package preflight <package-dir> --stages 2passes.draft_model_path.Benchmark plan
Compare on the same package and topology:
disabled;mtp;ngram-suffix;mtp-suffix; andngram-cache/mtp-cacheas the bounded llama.cpp cache control.Use coding-agent workloads covering:
Record:
Prefix-cache measurements remain separate: resident KV prefix reuse primarily improves repeated-prefix prefill/TTFT, while suffix N-gram is a request-local decode proposer and MTP predicts new decode tokens.
Initial performance hypothesis for single-stream coding on the Apple Silicon lab is approximately 1.5-2.3x target decode throughput for MTP alone, with
mtp-suffixpotentially improving repetitive coding/tool-loop workloads further. This is not an acceptance gate.Follow-up quantization
Establish correctness with the BF16 MTP block first. Afterwards, produce package variants with only
blk.88quantized:Use
skippy-quantize, notllama-quantize, for published Mesh artifacts. The existing target tensors must remain byte-identical. Report both TPS and MTP-prefix acceptance degradation for every MTP quantization; suffix-only behavior should remain invariant for the same committed history.Relationship to #1416
Package construction and single-stream certification can happen before #1416.
After #1416 lands, add every package strategy to the scheduler's concurrency gate:
N=1.The scheduler implementation remains outside this issue.
Non-goals
Deliverables
mtp,ngram-suffix, andmtp-suffixstrategies.Acceptance criteria
mtp,ngram-suffix, andmtp-suffixwithout an external model path.References