mistralai/Mistral-Large-4-1T-A52B-NVFP4 — Mistral's 1T MoE (52B active), DeepSeek-style
sparse MLA + DSA top-k indexer, cross-layer KV sharing, NoPE layers, embedded DSpark
drafter (k=3), multimodal (Pixtral tower), native 1M context. Weights: 610 GB (568 GiB),
NVFP4 experts + FP8 linears (modelopt MIXED_PRECISION). The NVFP4 repo has no
config.json (only the FP8 checkpoint has one) — Mistral-native "consolidated" format.
Lanes: mistral-large4-nvfp4-8x-vllm, mistral-large4-nvfp4-8x-sglang (8× DGX Spark,
TP8, 512K context, DSpark spec k=3 both). Reports: recipes/<lane>/reports/2026-10-30_*.
Both vendor images ship arm64 variants — no source builds needed (the dsv41-style sm_121a rebuilds were NOT required; kernels JIT where missing):
docker-images/mistral-large4-vllm — thin FROM over
vllm/vllm-openai@sha256:b046d936… (the mistral-large-4 tag, arm64 digest);
ENTRYPOINT ["vllm","serve"], vLLM 0.1.dev23730+g64053a10b, torch 2.14.0+cu130.docker-images/mistral-large4-sglang — thin FROM over
lmsysorg/sglang@sha256:2f0cd825… (mistral-large-4 tag, arm64); NVIDIA wrapper
/opt/nvidia/nvidia_entrypoint.sh + sglang serve CLI; torch 2.14.1+cu130,
mistral_common 1.13.0. One baked patch (patch_barrier_timeout.py): the
post-load monitored_barrier timeout becomes env-tunable
(SGLANG_UNBALANCED_LOAD_TIMEOUT_S, default 480).Recipe entrypoints: the launcher runs --entrypoint <tail[0]> img <tail[1..]>, so the
recipes carry explicit entrypoints (vllm serve / the NVIDIA wrapper + sglang serve).
Gotcha (latent launcher bug): a recipe WITHOUT entrypoint for a positional-model
engine composes --entrypoint <model-id> — broken since the 2026-09-26 command.rs
change (commit ad7069e). Every new recipe must lead the tail with its program.
| Boot | Result | Cause |
|---|---|---|
| 1 | died in ~1 s | containerd snapshotter lazy-unpack race: docker load returns before the rootfs is materialized; docker run 35 s later exec'd a half-unpacked image (stat …: no such file), --rm deleted the evidence, rendezvous hung 30 min. Launcher fix 0.2.5: sync probes exec-readiness per peer (/bin/sh container start, retried ≤2 min) before declaring OK. |
| 2 | head died at ~21 min, logs lost | KV-budget refusal at GMU 0.85 (see below); --rm destroyed the logs — all retries use --keep now. |
| 3 | weights loaded, crash at autotune | default flashinfer MLA route autotunes trtllm fmha — sm100-only ("Unsupported architecture" on GB10/sm_121). |
| 4 | rank 0 loaded (3.5 h), barrier killed ranks 2/5/6/7 | UNBALANCED_MODEL_LOADING_TIMEOUT_S = 480 stock; rank-0 crawl was self-inflicted (my mid-load drop_caches wiped the warm NFS page cache → cold re-read of 71 GB). Barrier now 7200 s via the baked patch. |
| 5 | weights loaded (80 min), crash at backend init | flashinfer_sparse_mla is GLM-DSA-only — the validator refuses any other model_arch. |
| 6 | weights + autotune OK, crash in a warmup forward | NVFP4 MoE auto-routed to the TensorRT-LLM runner on SM12x → 'FusedMoE' object has no attribute 'g1_scale_c' (upstream #41764/#45520: the auto rule compares --quantization, unset for checkpoint-quantized models). |
| 7 | READY | --moe-runner-backend flashinfer_cutlass (the supported NVFP4 MoE runner on SM120/121). |
--tokenizer-mode mistral # NVFP4 has no config.json: AutoTokenizer→AutoConfig
# dies ("couldn't find them in the cached files");
# mistral-common (tekken.json) instead
--attention-backend dsa # DSA backend (MistralLarge4AttentionMLA extends
# DeepseekV2AttentionMLA)
--dsa-prefill-backend tilelang # tilelang JIT-compiles for sm_121; FP8 KV REQUIRES
--dsa-decode-backend tilelang # both backends tilelang (layouts cannot be mixed)
--moe-runner-backend flashinfer_cutlass # NVFP4 MoE on SM120/121
--watchdog-timeout 3600 # boot takes ~80 min
SGLANG_UNBALANCED_LOAD_TIMEOUT_S=7200 # post-load barrier
--config-format mistral --load-format mistral --kv-cache-dtype fp8_ds_mla --dtype
bfloat16 --enable-expert-parallel --enable-prefix-caching --mm-processor-cache-gb 0.0
--tool-call-parser mistral --reasoning-parser mistral --enable-auto-tool-choice
--speculative-config '{"method":"dspark","num_speculative_tokens":3}' + GMU 0.89.
GMU boot-1 lesson: at 0.85 the KV budget after weights (73.8 GiB) + graph profiling (5.0) is 23.63 GiB — a single 512K request needs 25 GiB ("estimated maximum model length is 495296"). 0.89 = +4.9 GiB and still under the GB10 admission ceiling (108.78 GiB free at startup). Explicit cudagraph capture sizes (the dsv41 boot-10 lesson) backfired here: 29 exact sizes ate +3.6 GiB of graph memory — auto sizes win.
The UMA driver's mem_get_info free ≈ MemFree, not MemAvailable — page cache from
the NFS weight reads (~30 GB) counts as unavailable (#48140 behaviour, SGLang side):
GPU-free fell to ~1.6 GiB mid-load with MemAvailable still 31 GB, and a mid-load
drop_caches released ~20 GiB instantly (verified). BUT wiping the warm NFS cache
forces a cold re-read of 71 GB — rank 0's load went 40 min → 3.5 h. Do NOT
drop_caches mid-load; keep the NFS cache warm and let the load converge. The
post-load barrier must be longer than the slowest rank's crawl.
Same model id (mistral-large-4), 512K, DSpark k=3 on both.
| Metric | vLLM (…8x-vllm) |
SGLang (…8x-sglang) |
|---|---|---|
| Quality | 91/100 (174/192) | 91/100 (176/194) |
| Deployability | 70 | 71 |
| Responsiveness (median turn) | 6.9 s | 6.5 s |
| pp2048 @d0 | 1,069 | 897 |
| pp2048 @d0 c2 | 837 | 925 |
| tg @d0 c1/c2 | 24.8 / 33.0 | 31.9 / 41.7 |
| ctx pp4096 @d4096 c1/c2 | 1,204/20.9 · 1,068/29.8 | 1,066/25.0 · 1,001/36.1 |
| pp2048 @d4096 c1/c2 | 1,310/20.9 · 980/30.7 | 1,077/31.6 · 919/43.7 |
| ctx pp8192 @d8192 | 1,286 | 1,117 |
| pp2048 @d8192 c1/c2 | 1,268/22.0 · 984/31.0 | 1,047/32.4 · 804/38.1 |
tool_choice) failed with
finish_reason=length and was excluded (174/192); SGLang's endpoint enforces
tool_choice (176/194) — a real capability difference.Bottom line: for agentic decode-heavy traffic SGLang is the faster engine; for prefill-heavy long-context batch vLLM. Both are production-viable at 512K.