Views
No views yet
mtp.* tensors — a full multi-token-prediction block inherited from Qwen3.6-35B-A3B. llm-compressor drops them. It loads the model through a class that never instantiates the MTP layers, so they are not quantized badly, they simply never reach the output. A first pass gave me a checkpoint with zero MTP tensors and no speculative decoding at all.quantization_config.ignore. They are deliberately not quantized — a drafter with degraded numerics produces bad drafts and tanks the acceptance rate, which costs you more than the 1.6 GiB it saves.mtp.* tensors before you conclude MTP "doesn't work" on it.vllm/vllm-openai:nightly-aarch64, vLLM 0.26.1rc1.| File | Size |
|---|---|
model.safetensors | 23.32 GiB |
config.json, tokenizer, chat_template.jinja, processor_config.json | small |
recipe.yaml, NVFP4_QUANT_RECEIPT.txt | exact quant parameters, so you can reproduce it |
U8 with F8_E4M3 group scales, and everything I deliberately left alone (vision tower, router, embeddings, MTP block) still BF16.1docker run -d --name vllm-frontis --gpus all --network host \
2 --ipc=host --shm-size=16g -v /path/to/models:/models \
3 -e CUTE_DSL_ARCH=sm_121a \
4 vllm/vllm-openai:nightly-aarch64 \
5 /models/Frontis-MA1-35B-NVFP4 \
6 --served-model-name frontis-ma1-35b --port 8000 --trust-remote-code \
7 --max-model-len 65536 --max-num-seqs 2 \
8 --gpu-memory-utilization 0.38 --kv-cache-dtype fp8 \
9 --speculative-config '{"method":"mtp","num_speculative_tokens":2}'["vllm","serve"]. The first argument is the model path. Pass the word serve and you get vllm serve serve /models/..., which fails in a way that looks like a broken checkpoint. It isn't."method":"mtp". qwen3_next_mtp still works but logs a deprecation. When it loads correctly you'll see Resolved architecture: Qwen3_5MoeMTP in the startup log — that line is your confirmation the graft took.--kv-cache-dtype fp8 at serve time. I could not bake kv_cache_scheme into the checkpoint: this model nests its text settings under text_config, so there is no top-level num_attention_heads and llm-compressor's KV path fails looking for it (ValueError: Cannot determine num_attention_heads from config). The flag does the same job at runtime.content. At 512 max_tokens I got cut off mid-thought with no answer, which looks exactly like a broken quant. Use 1500+.max_num_seqs 2, 256-token generations, nonce-prefixed prompts so nothing came from the prefix cache. Servers warmed before measuring. Medians of 3–4 runs.| tok/s | |
|---|---|
| NVFP4 + MTP | 57.36 |
| NVFP4, no MTP | 42.49 |
| Speedup | 1.35× |
| MTP acceptance rate | 73.9% (572 accepted / 774 drafted) |
--speculative-config is passed. The no-MTP runs were very tight (42.3, 42.3, 42.6, 42.6), so this is a real delta, not noise.17*23 → 391, capital of Japan → Tokyo, and a 256-token freeform explanation of mixture-of-experts that came back as clean coherent English. That last one matters more than it sounds — a badly quantized MoE loads fine and then emits repetition or token soup, so "it loaded" proves nothing.visual.* tensors deliberately excluded and still BF16 — so image input should work. I never exercised it. Everything I verified was text. Upstream is explicit that their own post-training and evaluations are text/code-only, so treat vision here as inherited, not validated.1from llmcompressor.modifiers.quantization import QuantizationModifier
2from llmcompressor import oneshot
3
4recipe = QuantizationModifier(
5 targets="Linear", scheme="NVFP4",
6 ignore=[
7 "re:.*lm_head",
8 "re:visual.*", "re:model.visual.*",
9 "re:.*mlp.gate$", # the MoE ROUTER — not the experts' gate_proj
10 "re:.*embed_tokens$",
11 "re:.*shared_expert_gate$",
12 "re:.*linear_attn.*",
13 "re:.*router.*",
14 ],
15)
16oneshot(model=model, recipe=recipe, dataset=calibration, # 256 samples @ 2048 tokens
17 pipeline="sequential", moe_calibrate_all_experts=True)mlp.gate) or the embeddings and the model still loads clean and then talks nonsense — that's the classic MoE quantization failure and it's very easy to ship by accident. moe_calibrate_all_experts=True is also not optional: with 256 experts and 8 active per token, a calibration pass that doesn't force every expert to see data leaves most of them with garbage scales.base_model in the metadata above; all model weights,
licences and capabilities are theirs. This repository contributes quantisation and
measurement only.