This document is relevant for: Trn2, Trn3
Qwen3-32B Model Recipe#
Introduction#
Qwen3-32B is a dense decoder-only language model from the Qwen family. In vLLM Neuron, the dense 32B path supports the published BF16 checkpoint and a native MXFP8 path for compressed-tensors checkpoints on Trn3.
Qwen3-32B is supported for inference serving with
vLLM Neuron Plugin using the
Neuron SDK on AWS Trainium2 (trn2) and Trainium3 (trn3) hardware.
Compatible model checkpoints:
Model |
Checkpoint |
Hardware |
Quantization |
|---|---|---|---|
Qwen3-32B |
Trn2, Trn3 |
BF16 |
|
Qwen3-32B (native MXFP8) |
Built locally from |
Trn3 |
MXFP8 |
The repository includes
run.pyfor the BF16 path andbuild_mxfp8_checkpoint.pyplusrun_mxfp8.pyfor the native MXFP8 path. MXFP8 is Trn3-only.
Features#
Per-model feature availability for Qwen3-32B dense. See the features guide for configuration details.
Category |
Feature |
Status |
|---|---|---|
Inputs |
Text |
✅ |
Quantization |
BF16 |
✅ |
MXFP8 weights (Trn3) |
✅ |
|
KV cache FP8 — packed swizzled layout (Trn3, MXFP8) |
✅ (V1) |
|
Parallelism |
Tensor parallelism (TP) |
✅ |
Replica data parallelism (DP) |
✅ |
|
Pipeline parallelism (PP) |
❌ |
|
Sequence parallelism (SP) — prefill |
✅ |
|
Performance |
Continuous batching |
✅ |
Segmented prefill |
✅ |
|
Prefix caching (APC) |
✅ |
|
On-device sampling (greedy, top-k, top-p) |
✅ |
|
Async scheduling |
✅ |
|
Serving |
Structured outputs / tool-calling enforcement |
✅ (V1) |
Disaggregated inference (DI), MXFP8 packed FP8 KV |
✅ (V1) |
|
EAGLE3 speculative decoding, single server |
✅ (V1) |
|
Compilation |
torch.compile (native |
✅ |
CPU mode (testing) |
✅ |
Status legend:
✅ Supported: integrated and tested for Qwen3-32B dense
✅ (V1) Supported: requires Model Runner V1 (MRv1) in this release
❌ Not supported: may be considered for future releases
The plugin selects one model runner per server from the complete configuration. By default, it automatically selects MRv1 for the rows marked (V1). Common features, such as TP, continuous batching, and async scheduling, also work on MRv1.
The DI configuration in this recipe uses MRv1 on both the prefill and decode
servers because it uses packed FP8 KV. CPU tests with enforce_eager also
select MRv1. Feature support does not guarantee support for every combination.
See the runner selection guide
and the validated deployment configurations.
Deployment configurations#
Use the deployment tutorial to prepare a checkpoint and launch a TP8 single server. The tutorial also describes a packed-FP8-KV 1P1D deployment with TP4/LNC2 prefill and TP8/LNC1 decode at bs64.
Weight format |
Hardware |
Checkpoint |
|---|---|---|
BF16 |
Trn2, Trn3 |
|
Native MXFP8 |
Trn3 |
Convert the BF16 source with |
Checkpoint provenance#
Pin the BF16 checkpoint to an immutable Hugging Face revision. For MXFP8,
record the source revision, converter commit, conversion options, dependency
versions, and checksums. Keep lm_head in BF16. The
tutorial
shows the download, conversion, and checksum commands.
Tensor parallelism and KV cache#
BF16 weights use BF16 KV. The BF16 baseline uses TP8, and BF16 examples and accuracy
tests cover TP8, TP16, and TP32. MXFP8 weights are validated with both BF16 KV and packed FP8 KV.
MXFP8 tests cover TP8 single-server inference and
TP4/LNC2 prefill → TP8/LNC1 decode through real NIXL transfer. The native MXFP8
example (run_mxfp8.py) uses tensor_parallel_size=8, max_model_len=16384, and
num_batched_tokens_buckets=[8192].
The MXFP8 performance grid includes TP4/DP16, TP8/DP8, TP16/DP4, and TP32/DP2. The DI target uses TP4 for prefill and TP8 for decode, with packed FP8 KV on both roles. Prefill uses O2; decode uses O3, block size 128, and a pinned 5232-block cache.
Use the same backend, TP/DP, LNC, optimization level, context buckets, and KV dtype when comparing accuracy or performance. Keep per-replica batch and node concurrency distinct when sizing a DP deployment.
Component data parallelism also selects MRv1. See the runner selection guide for details.
Accuracy Evaluation#
Logit checks compare greedy device output with a Hugging Face reference. GSM8K and LongBench-v2 provide task-level checks. The table lists the existing CI coverage and acceptance floors. These floors are test criteria, not measured accuracy scores.
Evaluation |
Existing coverage |
CI floor |
|---|---|---|
BF16 GSM8K |
TP8/16/32, bs8, 50 examples, max length 10,240 |
0.85 |
MXFP8 GSM8K |
TP8/DP1, 200 examples. Packed FP8 KV: bs8 at 32k, bs64/128 at 10,240. BF16 KV: bs8 at 32k |
0.94 |
BF16 LongBench-v2 |
TP8, bs8, 32k |
0.378 |
MXFP8 LongBench-v2 |
TP8, bs8, 32k, BF16 KV |
0.378 |
Greedy logits |
BF16 TP8/16/32; MXFP8 TP8 with BF16 and packed FP8 KV; MXFP8 DI |
Per-target numerical tolerances |
Mixed-LNC DI accuracy measurements#
These measurements use MXFP8, TP4/LNC2 prefill, TP8/LNC1 decode, packed FP8 KV,
and real NIXL transfer. GSM8K evaluates 200 examples with flexible-extract scoring.
Evaluation |
Native |
XLA |
Method |
|---|---|---|---|
Greedy logits |
Pass |
Pass |
Device logits compared with the Hugging Face reference |
GSM8K |
98.0% |
97.0% |
200 examples; 94% acceptance floor |
The logit and GSM8K measurements use pre-release builds of the Neuron 2.33 vLLM Neuron plugin. These are measured accuracy snapshots. Use the same checkpoint and serving settings to reproduce these measurements.
Both evaluations use a maximum sequence count of 64, the 5232-block cache allocation, and a maximum model length of 10,240.
When reporting a measured score, include the dataset revision, sample count, scoring method, checkpoint identity, and software versions. Record the backend, TP/DP, LNC, batch, context length, and KV dtype with the result.
Common Issues#
Issue |
Cause |
Resolution |
|---|---|---|
Native MXFP8 TP64 is not supported |
The native MXFP8 MLP scale layout requires |
Use TP8, TP16, or TP32 for native MXFP8. The BF16 path does not have this specific restriction. |
No published Qwen3-32B MXFP8 checkpoint |
The dense MXFP8 path serves a self-quantized compressed-tensors checkpoint rather than a public upstream MXFP8 release. |
Generate the checkpoint locally with |
Native MXFP8 on Trn2 is not supported |
The native MXFP8 path depends on Trn3 support. |
Use BF16 on Trn2, or move the MXFP8 deployment to Trn3. |