AREX-2: a 27B agent model that serves like Qwen3.8-27B
BAAI's Apache-2.0 AREX-2 shares Qwen3.8-27B's architecture. What our base-model sglang runs say about its VRAM, quants and GPUs, and what is untested.
BAAI released AREX-2 on 29 September: a 27B model trained to work on a problem for a long time, in rounds. Propose a solution, measure it, reflect, revise, repeat. Apache 2.0, not gated, 54.7 GB of BF16 weights.
The part that caught my eye is not the benchmark table. It is the first line of its config.json: Qwen3_5ForConditionalGeneration, the same class as Qwen3.8-27B. On 4 October, the same day AREX-2 showed up in our feed, we had been serving base Qwen3.8-27B with sglang on three GPUs: two that served and one that ran out of memory in warmup. Same architecture means most of that work transfers. Most, not all, and the gaps are where this post spends its time.
To be clear up front: we have not run AREX-2. Every tokens/s number we measured is from base Qwen3.8-27B, used as an architecture proxy. The only AREX-2 throughput figures below are third-party, and labeled as such. That is why this sits in news and not research.
What AREX-2 is
From the model card and the paper (arXiv 2609.38288, "AREX-2: Advancing Self-Improving Agents through Long-Horizon Reflective Tasks"):
- A dense, 27B, Qwen3.8-compatible multimodal model, fine-tuned from
Qwen/Qwen3.8-27B. The card tags itimage-text-to-text. - 262,144 tokens of native context.
- Trained on synthesized long-horizon improvement trajectories from ML engineering and algorithmic programming tasks, where the feedback can be checked. The paper says the behavior transfers to deep research and keeps improving as you give it more rounds.
- Apache 2.0, with a note to also follow the terms of the Qwen base model (which is Apache 2.0 as well). Commercial use is on the table.
I spotted it in the AI Search news roundup of 4 October (around 38:20), which calls it "a pretty tiny 27 billion parameter model based off of Qwen" that "learns to repeatedly improve its own answer". Tiny is relative: it is still 55 GB in BF16.
Same chassis as Qwen3.8-27B, checked
I diffed AREX-2's config.json against Qwen3.8-27B's. The only differences are the transformers_version (5.2.0 vs 5.8.0.dev0) and two redundant top-level keys. Everything that decides memory and kernels is identical:
| Field | Value (both models) |
|---|---|
| Architecture | Qwen3_5ForConditionalGeneration, dense, no MoE fields |
| Layers | 64: 48 linear attention + 16 full attention (one full every 4) |
| Hidden / intermediate | 5120 / 17408 |
| Full attention | 24 heads, 4 KV heads, head dim 256 |
| Linear attention | 16 key heads, 48 value heads |
| Context | 262,144 max positions, rope theta 10,000,000 |
| Vocab | 248,320 |
| Vision tower | 27 layers |
The quants we ran of the base model (RedHatAI INT4, RadixArk NVFP4, Qwen's own FP8) use the same class and the same 64-layer, 16 full + 48 linear layout. The chat_template.jinja is byte-identical too, tool call handling included.
Two differences that matter later:
- No MTP head. The config says
mtp_num_hidden_layers: 1, but the safetensors index has zeromtptensors. Base Qwen3.8-27B ships 15 of them and about 425M more parameters in total. Built-in MTP speculative decoding has nothing to load. - The tokenizer config differs. Not the template, but
tokenizer_config.json, and a community repack notes that AREX-2's pre-tokenizer and decoder settings differ from Qwen3.8. Probably harmless for serving, but it is exactly the kind of thing that turns "same architecture" into a weird bug at 2 a.m.
Pick a weight file for your card
Here is what exists on Hugging Face today, with the sizes measured from the repos. These are weights only: KV cache and the linear attention state come on top.
| Variant | Format | Weights on disk | Notes |
|---|---|---|---|
| BAAI/AREX-2 | BF16 | 54.7 GB | 11 shards, 27.36B params |
| prithivMLmods/AREX-2-FP8 | FP8 dynamic W8A8 | 35.9 GB | linear attention, vision, embeddings and lm head left unquantized |
| cyankiwi/AREX-2-AWQ-INT4 | INT4, asymmetric, group 32 | 20.2 GB | calibrated on a "STEM and Agentic" set |
| numsu/AREX-2-27B-INT4-W4A16 | INT4 W4A16, symmetric, group 128 | 18.6 GB | round to nearest, no calibration |
How much the rest costs: on our base-model INT4 run (RTX A6000, 1M context through YARN), sglang used about 46 GB in total: 17.8 GB of weights, 11.5 GB of Mamba-style state for the linear attention layers and 12.8 GB of KV cache. Same layer layout, so expect the same overhead shape on AREX-2 at the same context. Weights are the cheap part of a long context.
So, card by card, as estimates and not measurements:
- One 80 GB card (A100, H100) in BF16. 54.7 GB of weights leaves room for a useful KV budget. Plausible, but neither we nor BAAI have documented it. Our internal model catalog estimates about 66 GB with overhead, which is an estimate too. For scale, the A100 SXM 80 GB was $1.79/h in our catalog on 18 September, when we recorded the demo for our last post. Check the current price before you budget.
- One 48 GB card in INT4. This is the configuration closest to what we actually ran on the base model, long context included.
- One 24 GB card in INT4. 18.6 to 20.2 GB of weights fit, but the only published INT4 deployment used two RTX 3090s (tensor parallel 2, 16,784 MiB per GPU after short probes) with an FP8 KV cache and 28 GiB of KV offloaded to CPU. A single 24 GB card would likely need a much shorter context; we have not tried it, and nobody has published that run.
Which quant for which GPU generation
This is where the base-model runs earn their keep. All of them: sglang 0.5.21, base Qwen3.8-27B, single GPU, on an A6000 and RTX Blackwell cards, not an A100 or H100. Anything below about the A100 is an extrapolation from the A6000, since both are Ampere.
| GPU | Quant | Speculative | Context | Decode |
|---|---|---|---|---|
| RTX A6000 48 GB (Ampere) | FP8 (Qwen/Qwen3.8-27B-FP8) | none | 1M (YARN) | 24 tok/s |
| RTX A6000 48 GB (Ampere) | INT4 W4A16 (RedHatAI) | none | 1M (YARN) | 41 tok/s |
| RTX PRO 5000 48 GB (Blackwell) | INT4 W4A16 (RedHatAI) | none | 1M (YARN) | 68 tok/s |
| RTX PRO 5000 48 GB (Blackwell) | NVFP4 (RadixArk) | DFlash2, 8 draft tokens | 256K native | 115 to 136 tok/s, accept length 3.1 to 4.5 |
| RTX 5090 32 GB (Blackwell) | NVFP4 (RadixArk) | DFlash2 | 256K native | failed: OOM in warmup, needs about 44 to 47 GB |
What I take from it:
- FP8 on Ampere is a trap. The A6000 has no native FP8, so sglang runs it weight-only through Marlin and you get 24 tok/s. The FP8 AREX-2 card says the same thing in its own words: full speed needs Hopper, Ada or newer. On an A100, same family, I would not bother with FP8.
- INT4 is the sane floor on Ampere. 41 vs 24 tok/s on the same card, with the long context intact.
- NVFP4 plus speculative decoding is the Blackwell move, and it needs a CUDA 13 pod: with our default CUDA 12.4 image sglang dies with
SM 12.x requires CUDA>=12.9. The catch for AREX-2: nobody has published an NVFP4 quant of it yet, as of today.
The command we used, and what changes for AREX-2
This is the fast base-model config, verbatim (RTX PRO 5000, CUDA 13 pod):
sglang serve --trust-remote-code \
--model-path RadixArk/Qwen3.8-27B-NVFP4 \
--tp-size 1 --context-length 262144 \
--kv-cache-dtype fp8_e4m3 --attention-backend flashinfer \
--mamba-ssm-dtype bfloat16 --mamba-radix-cache-strategy extra_buffer_lazy \
--chunked-prefill-size 4096 --max-prefill-tokens 8192 \
--max-running-requests 8 --mem-fraction-static 0.90 \
--speculative-algorithm DFLASH \
--speculative-draft-model-path z-lab/Qwen3.8-27B-DFlash2 \
--speculative-num-draft-tokens 8 \
--reasoning-parser qwen3 --tool-call-parser qwen3_coder \
--host 0.0.0.0 --port 30000
On InferenceKey we also raised the worker's patience, because the first warmup is long and the supervisor would otherwise kill it: INFERENCEKEY_HEALTH_POLL_SECS=30, INFERENCEKEY_HEALTH_MISS_THRESHOLD=40, INFERENCEKEY_SGLANG_READY_TIMEOUT_SECS=1800. The pod image was the RunPod CUDA 13 template runpod/pytorch:1.0.7-cu1300-torch291-ubuntu2404-cluster.
For AREX-2 you cannot paste that and walk away:
- There is no AREX-2 NVFP4, so
--model-pathbecomes one of the four files above. - The drafter is for the wrong model. z-lab/Qwen3.8-27B-DFlash2 lists base Qwen3.8-27B as its base model. A fine-tune shifts the token distribution, so its acceptance rate on AREX-2 is unknown. The numsu INT4 card reports decode with an external DFlash2 drafter on its 2x3090 setup (225.6 tok/s median at 1K prompt and 512 output tokens, 42.6 tok/s at 128K prompt), but no acceptance length, so those numbers do not answer the question.
- Built-in MTP is out (no MTP tensors). There is a community attempt, numsu/AREX-2-27B-INT8-W8A16-MTP: an MTP module started from Qwen3.8's weights and trained on 1,228 AREX-2-generated sequences on one RTX 3090. It reports offline acceptance of 87.4% at position 1, 79.7% at 2 and 74.8% at 3, about 2.88 accepted draft tokens per step. Its own card says that is offline, not an end-to-end speed test, and it needs a vLLM build with draft vocabulary support (stock vLLM can fail on
draft_lm_head). - The 1M context trick and speculative decoding do not mix. 1M is a YARN override on top of the native 262,144 (in short,
--json-model-override-argssetting YARN with a factor of 4.0, plus--context-length 1000000; that is a summary of our recipe, not a copy-paste flag). On the base model, DFlash2 refused to work with that override, so it was 1M without speculation or 256K with it. We did not retest this on AREX-2, but nothing in the config suggests it changes. - The parsers are inferred.
--reasoning-parser qwen3and--tool-call-parser qwen3_codershould apply, because the chat template is byte-identical. Should. The tokenizer config differs and no one has published an sglang run of AREX-2. - One detail in our flags: AREX-2's config sets
mamba_ssm_dtypeto float32; our base command overrode it to bfloat16. Fine for Qwen3.8 in our runs, untested on a model trained for long reflective trajectories.
If I had an 80 GB card this afternoon, my first attempt would be the boring one: BAAI/AREX-2 in BF16, the 256K native context, no speculative flags, the same parsers, and a long agent task to see whether tool calls parse. Then add one thing at a time. Same as a soundcheck: kick drum first, then the rest of the kit.
The benchmarks, with their asterisks
The card's numbers are strong for a 27B:
| Benchmark | AREX-2 (27B) | For comparison, from the same card |
|---|---|---|
| Frontier-CS (188-task Agent Track) | 70.7 | GPT-5.5 72.1, Claude Opus 4.8 74.5, GPT-5.6 Sol 76.4, DeepSeek-V4-Pro 44.7 |
| MLE-Lite (Any Medal, 3 seeds) | 81.8 | GPT-5.5 68.2, Claude Opus 4.8 63.6, GPT-5.6 Sol 72.7, Kimi-K3 72.7 |
| BrowseComp | 84.0 | GPT-5.5 84.4, Claude Opus 4.8 84.3, Kimi-K3 91.2 |
| HLE (text-only subset) | 52.6 | |
| GAIA | 92.2 | |
| DeepSearchQA | 93.8 |
Now the asterisks. These are self-reported and the card says they "follow the protocols reported in the AREX-2 paper". I found no independent reproduction. The evaluation repo shows what that protocol costs: the research profile allows up to 10 outer rounds and up to 1,500 model calls per case, 240,000 tokens of context with a refresh at 128,000, a 24-hour timeout per case, and an external judge model. The HLE number is the text-only subset, not full HLE.
That is not cheating, it is the point of the model: it gets better the longer you let it iterate. But it means a fair comparison is "AREX-2 with a big round budget" against "a frontier model with whatever budget it got", and the practical question becomes how many GPU hours one case eats. Paying per GPU hour instead of per token only wins if you keep the GPU busy, for example by running several cases in parallel; the evaluation repo's research profile runs one case at a time with a 24-hour timeout, which is close to the opposite.
What this does and does not tell you
Limits, plainly:
- We have not served AREX-2. All throughput and VRAM numbers we measured are from base Qwen3.8-27B on an A6000 and an RTX PRO 5000 (the RTX 5090 ran out of memory in warmup and gave us no numbers).
- The model card's only inference recipe is Transformers (
AutoModelForMultimodalLM, BF16,device_map="auto"). No vLLM or sglang command from BAAI. The GitHub repo holds evaluation runners that talk to any OpenAI-compatible endpoint, not serving code. - The community quants are lightly tested. numsu's INT4 was validated on 2x RTX 3090 with a pinned vLLM 0.29.0, up to 128K prompt tokens, with no quality or multimodal eval (only a weight reconstruction error, 0.12). cyankiwi's AWQ and the FP8 repack publish no measurements of their own.
- Speculative decoding on AREX-2 is unmeasured end to end, by anyone, as far as I can find.
- The benchmarks are the authors' own, under their own protocol.
What it does tell you: if you already serve Qwen3.8-27B, AREX-2 should fit the same memory budget and the same kernels, and probably the same flags, until a real run says otherwise. The weight file choice follows the GPU you have: BF16 on 80 GB, INT4 on 48 GB, INT4 on 24 GB only with a short context and still unproven, FP8 only on Ada, Hopper or newer, and save NVFP4 plus speculation for when someone ships an AREX-2 NVFP4 and a drafter trained on it. A real AREX-2 run, with its own numbers, is next on the setlist.
Sources: model card, paper, evaluation repo, config.json.