Supported models
These models run on SGLang-JAX's TT backend and libtt. Matmul weights, including the LM head, are stored in BFP8, Tenstorrent's 8-bit block floating point format, in which each group of 16 values shares an exponent. The mixture-of-experts models' experts are the exception: TTNN's fused MoE kernel stores them in BFP4, with 4 bits per value. Everything else (embeddings, norm weights, activations and the KV cache) is BF16.
decode tokens per second for a single request without speculative decoding, higher is better
first token milliseconds to the first token of a 215-token prompt, lower is better
| Model | Metric | 1 chip | 2 chips | 4 chips |
|---|---|---|---|---|
| Qwen3-8Bdense | decode | 45.4 | 79.8 | 123.4 |
| first token | 120 | 80 | 58 | |
| Qwen3-14Bdense | decode | 26.4 | 48.8 | 84.0 |
| first token | 187 | 115 | 80 | |
| Qwen3-32Bdense | decode | — | 22.4 | 40.8 |
| first token | — | 237 | 154 | |
| Qwen3.5-9Bhybrid | decode | 40.8 | 67.5 | 104.2 |
| first token | 169 | 117 | 86 | |
| Qwen3.8-27Bhybrid | decode | — | 24.7 | 41.6 |
| first token | — | 292 | 203 | |
| Qwen3-30B-A3BMoE | decode | — | 105.4 | 129.4 |
| first token | — | 98 | 75 | |
| Qwen3.5-35B-A3BMoE | decode | — | 77.4 | 95.0 |
| first token | — | 151 | 115 | |
| Qwen3.8-Flash-NextMoE | decode | — | — | 39.6 |
| first token | — | — | 818 |
A dash means the model doesn't fit on one chip or we haven't run that configuration yet. Dense models use full attention in every layer; the hybrid models (Qwen3.5, Qwen3.8) mix gated DeltaNet layers with full attention. The mixture-of-experts (MoE) models run each token through a few of their experts, with the experts split over the chips. Qwen3-30B-A3B and Qwen3.5-35B-A3B use 8 of 128 and 256 experts, about 3B active parameters, and need at least two chips; Qwen3.8-Flash-Next uses 10 of 512 and needs four. Qwen3.5-35B-A3B and Qwen3.8-Flash-Next are also hybrid.
Measured on a QuietBox 2 with libtt a1a7d51 and SGLang-JAX e1db2ea (30a60ce for Qwen3.8-Flash-Next, see Run a model), using the inference recipe with --tp-size set to the chip count and overlap scheduling on: remove --disable-overlap-schedule from the launch command. Each number is greedy decoding of 128 tokens, one request at a time and without speculative decoding, taking the median of five runs after two warmups.
Batched throughput
Decode throughput on four chips with several requests in flight. Each request sends a 19-token code prompt and generates 128 tokens.
total tokens per second across all running requests
per user tokens per second for each request
| Model | Metric | 1 request | 4 requests | 8 requests | 16 requests |
|---|---|---|---|---|---|
| Qwen3-8Bdense | total | 120 | 409 | 728 | 1120 |
| per user | 123.6 | 107.9 | 98.3 | 80.8 | |
| Qwen3-14Bdense | total | 82 | 286 | 522 | 898 |
| per user | 83.9 | 75.1 | 70.0 | 63.6 | |
| Qwen3-32Bdense | total | 40 | 141 | 266 | 472 |
| per user | 40.7 | 37.2 | 36.1 | 32.8 | |
| Qwen3.5-9Bhybrid | total | 100 | 344 | 573 | 875 |
| per user | 104.1 | 91.1 | 77.3 | 61.6 | |
| Qwen3.8-27Bhybrid | total | 40 | 141 | 249 | 389 |
| per user | 41.6 | 37.1 | 33.6 | 26.6 | |
| Qwen3-30B-A3BMoE | total | 123 | 384 | 672 | 998 |
| per user | 128.4 | 103.2 | 92.5 | 74.2 | |
| Qwen3.5-35B-A3BMoE | total | 91 | 302 | 493 | 721 |
| per user | 94.8 | 80.4 | 67.0 | 51.2 | |
| Qwen3.8-Flash-NextMoE | total | 36 | 92 | 136 | 161 |
| per user | 39.0 | 25.4 | 20.0 | 11.0 |
To serve more requests at once, raise --max-running-requests and --max-total-tokens in the launch command (we used 16 and 4096). For Qwen3.5 and Qwen3.8, also set --max-recurrent-state-size to the same value as --max-running-requests; otherwise SGLang-JAX keeps a quarter of the recurrent state slots in reserve and runs at most 12 of 16 requests at once.
These batched numbers also use overlap scheduling, with libtt a1a7d51 and SGLang-JAX e1db2ea (30a60ce for Qwen3.8-Flash-Next).
Speculative decoding
DFlash speculative decoding works on one chip with Qwen3 models. Here is Qwen3-8B with the z-lab/Qwen3-8B-DFlash-b16 draft model, in tokens per second:
| Prompt | Without draft | With draft | Speedup |
|---|---|---|---|
| 19-token code request | 43.1 | 126.4 | 2.9× |
| 215-token summarization request | 42.2 | 57.9 | 1.4× |
To turn it on, add these flags to the launch command:
--speculative-algorithm DFLASH \
--speculative-draft-model-path z-lab/Qwen3-8B-DFlash-b16 \
--speculative-num-steps 1 \
--speculative-eagle-topk 1 \
--grammar-backend none \
--max-total-tokens 4096Keep --disable-overlap-schedule from the recipe with these flags: SGLang-JAX only runs DFlash with overlap scheduling when --speculative-num-draft-tokens is one more than --speculative-num-steps. We measured the numbers above with --disable-overlap-schedule, libtt a1a7d51 and SGLang-JAX e1db2ea.
Run a model
Start from the multi-chip command in the inference recipe and change --model-path and --tp-size. The mixture-of-experts models also need --moe-backend fused. Qwen3.5 and Qwen3.8 also need CPU builds of PyTorch and torchvision; add --with "torch" --with "torchvision" --index "https://download.pytorch.org/whl/cpu" --index-strategy unsafe-best-match.
Qwen3.8-Flash-Next also needs safetensors with pull request #862 until it is merged, so that its weights stay in the memory-mapped checkpoint instead of being copied into RAM. SGLang-JAX pins an older safetensors, which uv run can't override, so install everything into an environment with the override instead (building safetensors from source needs a Rust toolchain):
echo 'safetensors @ git+https://github.com/pcmoritz/safetensors.git@numpy-zero-copy#subdirectory=bindings/python' > overrides.txt
uv venv --python 3.12 flash-next
uv pip install --python flash-next/bin/python \
"sglang-jax @ git+https://github.com/relativity-project/sglang-jax.git#subdirectory=python" \
"jax-tt-plugin" "jax==0.11.1" "jaxlib==0.11.1" "torch" "torchvision" \
--index "https://download.pytorch.org/whl/cpu" \
--index-strategy unsafe-best-match \
--override overrides.txtThen run the multi-chip command with flash-next/bin/python -m sgl_jax.launch_server in place of uv run ... -m sgl_jax.launch_server, with --model-path Qwen/Qwen3.8-Flash-Next and --tp-size 4.
Known gaps
- DFlash doesn't compile on more than one chip yet, and doesn't support Qwen3-14B, Qwen3.5 or Qwen3.8 drafts.
- To use a single chip of a QuietBox, you need a single-chip mesh descriptor in
TT_MESH_GRAPH_DESC_PATH. - Qwen3.8-Flash-Next's first request after a start takes about two minutes, while its weights are read from the checkpoint and prepared on the chips.
- Qwen3.8-Flash-Next's QSA layers attend densely, which matches the model only while a request's context is at most 2,051 tokens.