Running Mistral Small 4 119B NVFP4 on NVIDIA DGX Spark (GB10)

Running Mistral Small 4 119B NVFP4 on NVIDIA DGX Spark (GB10)

Status: Working as of 2026-03-17
Hardware: ASUS Ascent GX10 / NVIDIA GB10 Grace Blackwell Superchip
GPU: Blackwell SM 12.1a (NVFP4 capable)
RAM: 128GB LPDDR5x unified memory
OS: Ubuntu 24.04 ARM64

To my knowledge, this is the first confirmed working configuration for Mistral Small 4 119B NVFP4 on the DGX Spark platform. The model was released March 16, 2026 and was confirmed running the next day. Community reports at the time indicated nobody else had it working, and the model author (eugr) himself said “hope vLLM will run it soon.”


The Problem

mistralai/Mistral-Small-4-119B-2603-NVFP4 uses a Multi-head Latent Attention (MLA) architecture with:

  • kv_lora_rank=256

  • qk_nope_head_dim=64

  • qk_rope_head_dim=64

  • v_head_dim=128

  • Effective KV head size = kv_lora_rank + qk_rope_head_dim = 320

Standard vLLM MLA backends (Flash Attention, XFormers, etc.) reject head_size=320. The Triton MLA backend claims to support all compute capabilities but in practice still rejects this head size. This means native MLA cannot be used on SM 12.1a as of this writing.

Failed Approaches

Attempt Result
avarok v23 (stock) FAIL — tekken.json tokenizer v15 not in mistral_common (tops out at v13)
avarok v23 + pip install --upgrade mistral_common FAIL — head_size=320, use_mla=True → no valid MLA backend on SM121
pip install triton (3.6.0 already present) FAIL — Triton MLA still rejects head_size=320
hellohal2064/vllm-dgx-spark-gb10:latest FAIL — glibc TLS crash in subprocess (dl-tls.c: _dl_add_to_slotinfo: Assertion 'idx == 0' failed), incompatible with Ubuntu 24.04 ARM host
vLLM 0.17.2rc1 built from source FAIL — host torch (custom NVIDIA build) lacks cutlass_scaled_mm_supports_fp8
max_model_len=65536 with VLLM_MLA_DISABLE=1 FAIL — KV cache requires ~36GB, only ~23GB available after model weights
max_model_len=42000 with VLLM_MLA_DISABLE=1 FAIL — ~100MB too short (23.07GB needed, 22.96GB available)

The Solution

Disable MLA entirely (VLLM_MLA_DISABLE=1) and use standard attention with FLASH_ATTN + MARLIN NvFp4 MoE backend. This bypasses the head_size=320 problem by falling back to standard attention (head_size=128). The tradeoff is a larger KV cache footprint, which is why --max-model-len must be capped at 40000.

You also need to upgrade mistral_common inside the avarok v23 container to add tokenizer v15 support.


Prerequisites

  • NVIDIA DGX Spark / GB10 with 128GB unified memory

  • Docker with NVIDIA runtime

  • avarok/dgx-vllm-nvfp4-kernel:v23 image pulled

  • Model downloaded to a local path (e.g. ~/models/mistralai/Mistral-Small-4-119B-2603-NVFP4/)

  • Qwen3-80B (or other large model) stopped — not enough RAM to run both simultaneously

Download the model

pip install huggingface_hub
huggingface-cli download mistralai/Mistral-Small-4-119B-2603-NVFP4 \
    --local-dir ~/models/mistralai/Mistral-Small-4-119B-2603-NVFP4

Build the custom image

avarok v23 needs mistral_common upgraded for tokenizer v15 support:

FROM avarok/dgx-vllm-nvfp4-kernel:v23
RUN /opt/venv/bin/pip install --upgrade mistral_common

docker build -t avarok-mistral-small4:v1 - < Dockerfile


Working Docker Run Command

docker run -d \
  --name mistral-small-4 \
  --gpus all \
  --runtime nvidia \
  --shm-size=16g \
  --ipc=host \
  --entrypoint '' \
  -v ~/models/mistralai/Mistral-Small-4-119B-2603-NVFP4:/model \
  -e VLLM_MLA_DISABLE=1 \
  -e VLLM_NVFP4_GEMM_BACKEND=marlin \
  -e VLLM_USE_FLASHINFER_MOE_FP4=0 \
  -e VLLM_TEST_FORCE_FP8_MARLIN=1 \
  -e VLLM_ENGINE_CORE_STARTUP_TIMEOUT=300 \
  -p 8002:8002 \
  avarok-mistral-small4:v1 \
  /bin/bash -c 'vllm serve --model /model \
    --served-model-name mistral-small-4 \
    --tokenizer-mode mistral \
    --config-format mistral \
    --load-format mistral \
    --host 0.0.0.0 --port 8002 \
    --tensor-parallel-size 1 \
    --gpu-memory-utilization 0.75 \
    --max-model-len 40000 \
    --tool-call-parser mistral \
    --enable-auto-tool-choice 2>&1'


Key Parameters Explained

Parameter Value Why
VLLM_MLA_DISABLE=1 1 Critical — disables MLA, falls back to standard attention. Without this, all MLA backends reject head_size=320.
VLLM_NVFP4_GEMM_BACKEND=marlin marlin Use MARLIN NvFp4 MoE GEMM kernel — required for NVFP4 weight quantization
VLLM_USE_FLASHINFER_MOE_FP4 0 Disable FlashInfer MoE FP4 (use MARLIN instead)
VLLM_TEST_FORCE_FP8_MARLIN 1 Force MARLIN path for FP8/NVFP4 operations
--tokenizer-mode mistral mistral Use Mistral-native tokenizer (required for tekken.json v15)
--config-format mistral mistral Use Mistral config format
--load-format mistral mistral Use Mistral weight loading
--max-model-len 40000 40000 Maximum safe value — 42000+ causes OOM on KV cache init with 128GB unified memory and model loaded
--gpu-memory-utilization 0.75 0.75 Leaves headroom for system + model weights
--tool-call-parser mistral mistral Enable Mistral-format tool calling
--enable-auto-tool-choice Required for function/tool calling

Startup Time & RAM Usage

  • Weight loading: ~7-8 minutes (13 safetensors shards, ~34s each)

  • RAM after startup: ~99GB used (model weights ~66GB + KV cache + system)

  • Free RAM: ~22GB with model loaded at 40k context

  • Throughput: ~27 tok/s sustained


Verification

# Check startup complete
docker logs mistral-small-4 2>&1 | grep "startup complete"

# Test API
curl -s http://localhost:8002/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "mistral-small-4",
    "messages": [{"role": "user", "content": "Say hello."}],
    "max_tokens": 50
  }' | python3 -c "import sys,json; print(json.load(sys.stdin)['choices'][0]['message']['content'])"


Limitations

  • Context window hard-capped at 40,000 tokens — cannot be increased without exceeding available KV cache RAM

  • Max input ~28,000 tokens (40k minus 12k output reserve)

  • Cannot run simultaneously with Qwen3-80B — not enough unified memory for both

  • MLA disabled — running standard attention, not the intended MLA mode. Performance/quality may differ slightly from the model’s designed operation. Proper MLA support awaiting upstream vLLM kernel work.

  • Health check may show “unhealthy” — Docker health check can be overly strict; model responds correctly regardless


Notes on MLA

The root cause of MLA failure was investigated thoroughly. PixtralForConditionalGeneration in vLLM’s pixtral.py (used for both Pixtral vision models and Mistral Small 4) has no MLA wiring — it delegates to MistralAttention which uses standard head sizes. The DeepSeek V3 MLA delegation path that avarok uses was architecturally correct, but the Triton MLA backend’s support for head_size=320 on SM 12.1a was not functional at time of writing.

Once vLLM adds proper head_size=320 MLA support, VLLM_MLA_DISABLE=1 can be removed and --max-model-len can potentially be increased, since MLA significantly reduces KV cache size.


Tested on ASUS Ascent GX10 (GB10 Grace Blackwell), Ubuntu 24.04 ARM64, 2026-03-17

Can you try our community docker? I haven’t had a chance to test it yet, but if something has a chance to work with it out of the box, it’s that. Please try without disabling MLA as it uses the most recent vLLM build.

@eugr testing .. just added mistral common to the last pip and now its building - i report back if it works or not

worst case we could always ask patrik from mistral as he maintains the vllm aspects for them

(EngineCore_DP0 pid=169) ValueError: No valid attention backend found for cuda with AttentionSelectorConfig(head_size=320, dtype=torch.bfloat16, kv_cache_dtype=auto, block_size=None, use_mla=True, has_sink=False, use_sparse=False, use_mm_prefix=False, use_per_head_quant_scales=False, attn_type=AttentionType.DECODER). Reasons: {FLASH_ATTN_MLA: [head_size not supported, compute capability not supported, FlashAttention MLA not supported on this device], FLASHMLA: [head_size not supported, compute capability not supported, vllm._flashmla_C is not available, likely was not compiled due to insufficient nvcc version or a supported arch was not in the list of target arches to compile for.], FLASHINFER_MLA: [head_size not supported, compute capability not supported, FlashInfer MLA kernel requires qk_nope_head_dim == 128, but got 64], TRITON_MLA: [head_size not supported], FLASHMLA_SPARSE: [head_size not supported, non-sparse not supported, compute capability not supported]}.
``` ya thats a no for the time beeing trying to start it with mla

Thanks! I’ll have a look into that when I have time.

 cat result.txt
=================================================================
  MISTRAL-SMALL-4 119B NVFP4 — DGX SPARK (GB10) BENCHMARK
=================================================================

Configuration:
  Model:            Mistral-Small-4-119B-2603-NVFP4
  GPU:              NVIDIA GB10 (SM 12.1, 128GB)
  vLLM:             v0.17.2rc1.dev57 (built from main 2026-03-18)
  Attention:        TRITON_MLA (native MLA)
  Quantization:     NVFP4 (compressed-tensors)
  MoE backend:      FLASHINFER_CUTLASS
  max_model_len:    65536
  gpu_mem_util:     0.85
  max_batched_tok:  16384
  max_num_seqs:     128
  tensor_parallel:  1

-----------------------------------------------------------------
  SINGLE REQUEST — VARYING CONTEXT LENGTH
-----------------------------------------------------------------

  Context                   Prefill   Prefill tp     Gen tp    Total
  ______________________      (est)      (tok/s)    (tok/s)    (sec)
  2K INPUT + 256 OUT           5.4s        2600       33.2    13.1s
  8K INPUT + 256 OUT           5.4s        2600       33.0    13.1s
  32K INPUT + 256 OUT         10.7s        2600       31.7    18.8s
  60K INPUT + 256 OUT         21.5s        2600       17.7    36.0s

-----------------------------------------------------------------
  CONCURRENT THROUGHPUT — 10 SIMULTANEOUS REQUESTS
-----------------------------------------------------------------

  Requests:           10
  Total tokens gen:   2000
  Wall-clock time:    19.9s
  Aggregate tp:       100.3 tok/s
  Per-request avg:    10.0 tok/s

=================================================================
  Generated: 2026-03-18
=================================================================
```

so far soo good ..

Nice that you got it running.
It’s been only a day, but I would say just stick with Qwen3.5 or others.
How has your experience been with it?

@eugr @wj.lee1

I built the container image and update the mistral-common package but hit this error.

400: Kwargs [‘reasoning_effort’] are not supported by `MistralCommonTokenizer.apply_chat_template

vllm serve mistralai/Mistral-Small-4-119B-2603-NVFP4
–max-model-len 150000
–tool-call-parser mistral
–tokenizer-mode mistral
–config-format mistral
–enable-auto-tool-choice
–reasoning-parser mistral
–max_num_batched_tokens 16384
–max_num_seqs 8
–gpu_memory_utilization 0.9

Any recommendations?

Got the same error. We will need Mistrals PR which is not yet in the main branch:

git clone --branch fix_mistral_parsing https://github.com/juliendenize/vllm.git

I failed to use that as it doesn’t have all the custom patches for sm121 / GB10 needed to run NVFP4 properly. For the full blown model with 242 GB of weights even two Sparks won’t be enough.

So I will wait until their PR has been pulled before retrying.

If you’re just trying to get it running, did you try their own vLLM container which I presume includes that fix?

I have not, I was using @eugr ‘s community edition since it seemed DGX Spark centric. I have had my spark for less than 24 hours, so still trying to get the lay of the land. I love mistral models though so it was the first thing I tried.

I noticed that their is a apply vllm pr flag ./build-and-copy.sh --apply-vllm-pr 37083 but unfortunately still hitting the same error. First time I ran it there was an error in fetching. I need to confirm if the PR was actually applied.

Oh sorry, I thought you meant you were building vLLM :-)

Not sure if it’s the issue, but the PR number you referenced here seems different to the PR that was linked above (37081). The one you referenced seems to be test-related and not Mistral-related?

Those are only x86 not arm64. I asked them already on X that a arm64 build would be nice. May be when their team is back from GTC. That docker image comes from a personal account of a Mistral employee.

Ahhh, doh! I keep getting bitten by this on other containers and still keep forgetting about it 😄

NVIDIA has only to sponsor them (Mistral) one or ten Sparks may be… ;-)

As Mistral is part of the “NVIDIA Nemotron Coalition” they should get some IMHO.

For anyone on DGX Spark (arm64): the mistralllm/vllm-ms4:latest image is x86-only — no arm64 build yet. I reached out to Mistral about it and they’re aware; looks like it may get attention after GTC.

The juliendenize fork with PR #37081 is also a dead end for us — it’s missing the SM121/GB10 patches needed to run NVFP4 weights, so it won’t work on Spark hardware regardless.

For now, stick with eugr’s spark-vllm-docker as the base — it has the hardware-specific patches and nightly wheels. See the original post for the full working Docker command and Dockerfile. Once the Mistral parsing fix lands in an arm64-compatible build, I’ll update this post.

Hey @chuckchambersdev how about a refresh exactly how yours is working, because it doesn’t seem like I can recreate your setup. Or are you saying that you are also blocked by the chat template error?

Öhm. The original post referenced the avarok/dgx-vllm-nvfp4-kernel:v23 as base image.

So you did a re-run with eugr’s container with the same env/commands/mistral_common upgrade like with the avarok image and succeeded, too?

@DannyTup when I’m not sure if a container is available for Spark first I run docker manifest inspect <container_name> to avoid no matching manifest for linux/arm64/v8 in the manifest list entries when pulling an image.

elsaco@spark1:~$ docker manifest inspect mistralllm/vllm-ms4:latest
{
   "schemaVersion": 2,
   "mediaType": "application/vnd.oci.image.index.v1+json",
   "manifests": [
      {
         "mediaType": "application/vnd.oci.image.manifest.v1+json",
         "size": 6791,
         "digest": "sha256:22f056875019cad0c852f99be064be8d5d10bf95a75f956df63c909fc93fa8a0",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.oci.image.manifest.v1+json",
         "size": 566,
         "digest": "sha256:39dddc8c3ed09c74ac34d97dfacccc7360bce43a760b14d13c3ae861aa90e2f5",
         "platform": {
            "architecture": "unknown",
            "os": "unknown"
         }
      }
   ]
}