expXa

Research

Dense models across three engines

expXa’s work targets MoE models. Does it cost anything on dense models that fit entirely on the GPU, and how does PXA 4 compare?

Finding

expXa costs nothing here: it stays within 2% of PXA 3.1 on both models and produces identical text. PXA 4 is 11–15% faster on the 0.8B, mainly because it decodes about 20% faster. On the 9B, all three engines are within 1% of each other.

Qwen3.5-0.8B Q8_0

Three rounds per cell, 128 output tokens. Times in seconds; range is observed min–max.
EngineInputPrefill tok/sDecode tok/sFirst tokenRequestRange
PXA 3.15127,175.0275.80.0740.5370.536–0.544
PXA 4.0.15127,420.0336.00.0710.4560.451–0.458
expXa5127,093.5273.00.0760.5460.538–0.546
PXA 3.12,0488,055.7276.50.2580.7210.719–0.724
PXA 4.0.12,0488,373.0333.20.2490.6320.632–0.635
expXa2,0488,041.8275.40.2590.7240.723–0.729
PXA 3.13,5847,956.4274.00.4580.9270.925–0.929
PXA 4.0.13,5848,288.5329.90.4390.8280.826–0.828
expXa3,5847,936.0273.40.4580.9270.926–0.927

All three engines produced the same text at every length and in every round.

Qwen3.5-9B Q4_K_M

Three rounds per cell, 128 output tokens. Times in seconds; range is observed min–max.
EngineInputPrefill tok/sDecode tok/sFirst tokenRequestRange
PXA 3.15122,232.199.70.2571.5421.540–1.544
PXA 4.0.15122,187.999.40.2561.5421.538–1.558
expXa5122,212.099.40.2601.5481.542–1.550
PXA 3.12,0483,419.898.90.6311.9241.924–1.926
PXA 4.0.12,0483,387.998.90.6391.9341.931–1.952
expXa2,0483,428.198.90.6301.9251.924–1.932
PXA 3.16,1443,816.097.81.6392.9492.947–2.955
PXA 4.0.16,1443,768.497.61.6622.9752.972–2.984
expXa6,1443,808.597.61.6422.9562.952–2.960

PXA 4 produced different text from the other two at 512 and 2,048 tokens, consistently across rounds. PXA 3.1 and expXa matched each other everywhere, and all three matched at 6,144. On forced-length synthetic continuations a text difference isn’t a correctness failure, but it means PXA 4 isn’t output-equivalent here.

Correctness and recovery

  • Four short chat checks per arm (arithmetic, grounding in supplied context, field extraction, negation), with natural stopping: 72 of 72 passed.
  • Each arm then cancelled a long request, confirmed the slot was released, and answered the arithmetic check twice more: 18 of 18 recovered with matching answers.
  • These are sanity checks. They don’t measure reasoning quality or long-context reliability.

Method

  • Identical model files, token fixtures and settings for every engine: one slot, Q8_0 KV cache, Flash Attention, all layers on GPU, no speculation.
  • 9B: 8,192 context, layers split evenly across both GPUs, 4 generation and 8 batch threads. 0.8B: 4,096 context on one GPU, 2 and 2 threads.
  • Three rounds rotating engine, model and length order. Each arm started a fresh server with an unscored warmup.
  • Prompt cache off, exactly 128 output tokens at greedy sampling, token counts verified. First-token time is the first non-empty streamed chunk seen by the client.
  • No expXa MoE-specific profiles were enabled.

Limits

  • The 9B was tested with a reduced context split across two GPUs. Single-GPU, full-context behaviour wasn’t measured.
  • One synthetic prompt family, three rounds, one shared host. Small differences shouldn’t be read as general gains.