Quark by FirstPrinciples

Quark

Quark is a 9B reasoning model for physics, science and maths, built by FirstPrinciples. The base model is Qwen3.5-9B with additional post-training: supervised fine-tuning on our curated physics, maths and coding mix.

It outperforms the base model on a range of benchmarks, and reaches graduate-level science scores comparable to much larger open models. We also quantized the model weights to 8 bits (Q8_0) for llama.cpp; this Q8_0 version matches bf16 on every benchmark below. On the popular benchmark Hummanity's Last Exam (HLE, text-only) Quark is on the Pareto frontier of performance vs. model size: no model of its size or smaller scores higher.

Quark is the first in a series of small, powerful scientific reasoning models. You can run it locally (see Usage) or on Theo Platform, a research platform for complex problems, where you can use it alongside other frontier models, check its results with Python, Mathematica and Sage, and keep each session as a research graph you can revise one step at a time.

Intended use

Quark is built for researchers working on hard problems in physics, science and maths, where the reasoning matters as much as the answer:

  • Solve your problems: derivations, estimates, calculations, with step by step reasoning.
  • Check your work: a second opinion on a derivation or result. For results that matter, verify the answer independently with TheoVerify on Theo Platform.
  • Private and offline research: the Q8_0 version runs on a 16 GB Mac, so unpublished work and sensitive data stay on your machine.

Results

Accuracy (%), measured with EvalScope and vLLM (the Q8_0 version with llama.cpp): thinking mode, up to 131,072 output tokens, and following the Qwen3.5 model card's sampling settings. AIME 2025 is averaged over 16 samples per problem and GPQA Diamond over 8. HLE (text-only, 2,158 questions) is graded by Qwen3.5-27B as judge.

Benchmark Qwen3.5-9B Quark (bf16) Quark (Q8_0)
GPQA Diamond 81.6 87.4 87.8
AIME 2025 86.9 91.7 94.0
MMLU-Pro Physics 90.7 91.0 91.6
Humanity's Last Exam (HLE), text 15.9 22.7 22.3
HLE, physics subset 8.4 15.8 16.3

All were measured by us with the same setup.

Compared with other open models (scores as reported by each developer):

Model Size GPQA Diamond AIME 2025 HLE
Quark (fp16) 9B 87.4 91.7 22.7
Quark (Q8_0) 9B 87.8 94.0 22.3
Qwen3-8B 8B 59.6 69.3 4.4
Qwen3.5-9B 9B 81.7 โ€” 14.9ยน
NVIDIA Nemotron Nano 9B v2 9B 64.0 72.1 6.5
gpt-oss-20b 21B 71.5 91.7 10.9
Qwen3.5-27B 27B 85.5 โ€” 24.3
Qwen3.8-27B 27B 89.2 โ€” 30.8
gpt-oss-120b 117B 80.1 92.5 14.9
DeepSeek-R1-0528 671B 81.0 87.5 17.7
Kimi K2 Thinking 1T 84.5 94.5 23.9

โ€” = not reported. Sources: each model's official model card; Quark (bf16) and its Q8_0 version measured by us (see above)

ยน Not reported by Qwen; measured by Artificial Analysis (reasoning mode, 2,158 text-only HLE questions).

HLE accuracy against model size

HLE accuracy against total parameters, with the Pareto frontier

HLE (text-only) accuracy against total parameters, log scale. Quark is on the Pareto frontier: no model of its size or smaller scores higher. The next model up the frontier, Qwen3.8 27B, is roughly three times its size.

HLE accuracy of 7โ€“10.5B models

All 37 models of 7โ€“10.5B parameters scored by Artificial Analysis. Quark leads K2 Horizon 7B by 4.5 points.

Quark is measured by us; every other model by Artificial Analysis on the same 2,158 questions with its own grader (data retrieved November 2026). Mixture-of-experts models are plotted at their total size, and models without a published parameter count aren't shown.

Q8_0 version

A Q8_0 version (model weights quantized to 8 bits) for llama.cpp (in GGUF format) is available at FirstPrinciplesLabs/quark_quantized_weight_only-Q8_0. Its accuracy is in the Results table: it matches Quark on all benchmarks. It is also on Ollama as FirstPrinciples/quark-q8 (see Usage).

Throughput

Tokens per second on an NVIDIA H200 and a MacBook Pro, for the original bf16 weights and the Q8_0 version.

llama.cpp

Throughput (token/s) for a single user with llama.cpp, by how much context is already filled.

Hardware Context Q8_0 bf16
NVIDIA H200 empty 216 185
NVIDIA H200 32K 191 167
NVIDIA H200 100K 156 139
MacBook Pro, M4, 16 GB empty 11.2 does not fit (18.4 GB)
MacBook Pro, M4, 16 GB 32K 8.7 does not fit

On the MacBook Pro (M4, 16 GB), with the Q8_0 version serving several requests at once (llama-server --parallel N):

Concurrent requests Throughput per request (token/s)
1 11.2
2 10.5
4 7.1

Training data

Quark was fine-tuned on our curated mix of about 200,000 physics, science, maths and coding problems, each with a worked solution written by Qwen3.8-Flash-Next. Solutions were filtered by rejection sampling, keeping only correct ones. Duplicate questions were removed, and so was any question that shares at least half of a benchmark question's word 13-grams (after lower-casing and keeping only letters and digits). We checked against the full GPQA Diamond, AIME 2025, MATH-500, MMLU-Pro, SuperGPQA and HLE (text-only) sets.

Usage

Quark runs anywhere Qwen3.5-9B does (Transformers, vLLM, SGLang). We recommend an output budget of 131,072 tokens for best performance.

With Transformers (pip install -U transformers accelerate; the bf16 weights need about 20 GB of GPU memory):

from transformers import AutoModelForCausalLM, AutoTokenizer

model_id = "FirstPrinciplesLabs/quark"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, dtype="auto", device_map="auto")

messages = [{"role": "user", "content": (
    "A particle is in the ground state of a 1D infinite square well of width L. The well suddenly expands to "
    "width 2L. What is the probability of finding the particle in the ground state of the new well?"
)}]
inputs = tokenizer.apply_chat_template(
    messages, add_generation_prompt=True, enable_thinking=True, return_tensors="pt", return_dict=True
).to(model.device)

output = model.generate(
    **inputs,
    max_new_tokens=32768,  # hard problems can need up to 131,072
    do_sample=True, temperature=1.0, top_p=0.95, top_k=20,
)
text = tokenizer.decode(output[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)

thinking, finished, answer = text.partition("</think>")
if not finished:
    print("Stopped while still thinking; raise max_new_tokens.")
print(answer.strip())  # expected: 32 / (9 pi^2), about 0.36

To serve it with vLLM:

vllm serve FirstPrinciplesLabs/quark \
  --max-model-len 135168 --reasoning-parser qwen3

Or run it locally with Ollama (BF16 weights, with the recommended sampling settings and a 131,072-token context built in):

ollama run firstprinciples/quark

For the Q8_0 version with Ollama (about 10 GB; the same sampling settings and 131,072-token context built in):

ollama run FirstPrinciples/quark-q8

A 131,072-token context needs about 15 GB of GPU memory. On a 16 GB Mac, lower it inside the chat with /set parameter num_ctx 32768 (longer answers are then cut off).

For the Q8_0 version with llama.cpp:

llama-server -hf FirstPrinciplesLabs/quark_quantized_weight_only-Q8_0 --jinja -c 131072 \
  --temp 1.0 --top-k 20 --top-p 0.95 --presence-penalty 1.5

Recommended sampling (from the Qwen3.5 model card):

Thinking (default) Non-thinking
chat_template_kwargs {"enable_thinking": true} {"enable_thinking": false}
temperature / top_p / top_k 1.0 / 0.95 / 20 1.0 / 1.0 / 40
presence penalty 1.5 2.0
max output tokens up to 131,072 32,768

Example

A hard problem from AIME 2025 (II, problem 15), in thinking mode with the recommended sampling settings:

Let f(x)=(xโˆ’18)(xโˆ’72)(xโˆ’98)(xโˆ’k)xf(x)=\dfrac{(x-18)(x-72)(x-98)(x-k)}{x}. There exist exactly three positive real values of kk such that ff has a minimum at exactly two real values of xx. Find the sum of these three values of kk.

Qwen3.5-9B Quark
Correct, out of 16 attempts 1 10
Most common answer 188 โœ— (14 of 16 attempts) 240 โœ“
Approach Finds no way in and guesses that k must be one of the existing roots: 18 + 72 + 98 = 188 Turns "a minimum at two points" into an equation for k and solves it

How Quark solves it (summarised from its answer):

  1. If the minimum value mm is reached at two points uu and vv, the numerator minus mxmx must be a perfect square:

(xโˆ’18)(xโˆ’72)(xโˆ’98)(xโˆ’k)โˆ’mx=(xโˆ’u)2(xโˆ’v)2. (x-18)(x-72)(x-98)(x-k)-mx=(x-u)^2(x-v)^2 .

  1. Matching coefficients and eliminating uu and vv leaves one equation in kk:

(k2โˆ’376kโˆ’5120)2=8128512โ€‰k. (k^2-376k-5120)^2 = 8128512\,k .

  1. It factors as (kโˆ’8)(kโˆ’32)(kโˆ’200)(kโˆ’512)=0(k-8)(k-32)(k-200)(k-512)=0, and checking the sign before squaring rules out k=512k=512.
  2. So k=8,32,200k = 8, 32, 200, and the answer is 240.

Both models' full written answers (each follows several thousand tokens of reasoning, not shown):

Quark: 240 (correct)

We interpret โ€œ ff has a minimum at exactly two real values of xxโ€ as meaning that the minimum value is attained at exactly two distinct xx-values (the intended interpretation; otherwise ff has no global minimum on all real xโ‰ 0x\neq0).

Let

P(x)=(xโˆ’18)(xโˆ’72)(xโˆ’98)(xโˆ’k). P(x)=(x-18)(x-72)(x-98)(x-k).

First expand P(x)P(x). We have

18+72+98=188, 18+72+98=188,

18โ‹…72+18โ‹…98+72โ‹…98=10116, 18\cdot72+18\cdot98+72\cdot98=10116,

18โ‹…72โ‹…98=127008. 18\cdot72\cdot98=127008.

Thus

P(x)=x4โˆ’(k+188)x3+(10116+188k)x2โˆ’(127008+10116k)x+127008k. P(x)=x^4-(k+188)x^3+(10116+188k)x^2-(127008+10116k)x+127008k.

Suppose the minimum value is mm, attained at two distinct xx-values uโ‰ vu\neq v. Then f(x)โˆ’mf(x)-m has double zeros at uu and vv. Since

x(f(x)โˆ’m)=P(x)โˆ’mx, x(f(x)-m)=P(x)-mx,

we must have

P(x)โˆ’mx=(xโˆ’u)2(xโˆ’v)2. P(x)-mx=(x-u)^2(x-v)^2.

Now expand the right-hand side:

(xโˆ’u)2(xโˆ’v)2=x4โˆ’2(u+v)x3+((u+v)2+2uv)x2โˆ’2uv(u+v)x+u2v2. (x-u)^2(x-v)^2 = x^4-2(u+v)x^3+\bigl((u+v)^2+2uv\bigr)x^2-2uv(u+v)x+u^2v^2.

Matching coefficients gives

2(u+v)=k+188,(1) 2(u+v)=k+188, \tag{1}

(u+v)2+2uv=10116+188k,(2) (u+v)^2+2uv=10116+188k, \tag{2}

u2v2=127008k.(3) u^2v^2=127008k. \tag{3}

Let

r=u+v,s=uv. r=u+v,\qquad s=uv.

Since u,v>0u,v\gt 0, we have r>0r\gt 0 and s>0s\gt 0. From (1),

r=k+1882. r=\frac{k+188}{2}.

From (3),

s=127008k. s=\sqrt{127008k}.

Substitute into (2):

(k+1882)2+2127008k=10116+188k. \left(\frac{k+188}{2}\right)^2+2\sqrt{127008k}=10116+188k.

Simplify:

k24+94k+8836+2127008k=10116+188k, \frac{k^2}{4}+94k+8836+2\sqrt{127008k}=10116+188k,

k24โˆ’94kโˆ’1280=โˆ’2127008k. \frac{k^2}{4}-94k-1280=-2\sqrt{127008k}.

Multiplying by 44,

k2โˆ’376kโˆ’5120=โˆ’8127008k.(4) k^2-376k-5120=-8\sqrt{127008k}. \tag{4}

Now square both sides:

(k2โˆ’376kโˆ’5120)2=64โ‹…127008โ€‰k. (k^2-376k-5120)^2=64\cdot127008\,k.

Since 64โ‹…127008=812851264\cdot127008=8128512,

(k2โˆ’376kโˆ’5120)2โˆ’8128512k=0. (k^2-376k-5120)^2-8128512k=0.

This factors as

(kโˆ’8)(kโˆ’32)(kโˆ’200)(kโˆ’512)=0. (k-8)(k-32)(k-200)(k-512)=0.

But equation (4) requires the left-hand side k2โˆ’376kโˆ’5120k^2-376k-5120 to be negative. Checking the candidates:

k=8:64โˆ’3008โˆ’5120=โˆ’8064,k=32:1024โˆ’12032โˆ’5120=โˆ’16128,k=200:40000โˆ’75200โˆ’5120=โˆ’40320,k=512:262144โˆ’192512โˆ’5120=64512. \begin{aligned} k=8&:\quad 64-3008-5120=-8064,\\ k=32&:\quad 1024-12032-5120=-16128,\\ k=200&:\quad 40000-75200-5120=-40320,\\ k=512&:\quad 262144-192512-5120=64512. \end{aligned}

Thus k=512k=512 is extraneous, while

k=8,โ€…โ€Š32,โ€…โ€Š200 k=8,\;32,\;200

are valid.

Their sum is

8+32+200=240. 8+32+200=240.

240 \boxed{240}

Qwen3.5-9B: 188 (incorrect)

The function is given by f(x)=(xโˆ’18)(xโˆ’72)(xโˆ’98)(xโˆ’k)xf(x)=\frac{(x-18)(x-72)(x-98)(x-k)}{x}.

We are looking for the number of local minima.

Let P(x)=(xโˆ’18)(xโˆ’72)(xโˆ’98)(xโˆ’k)P(x) = (x-18)(x-72)(x-98)(x-k). Then f(x)=P(x)/xf(x) = P(x)/x.

The critical points of f(x)f(x) are given by fโ€ฒ(x)=0f'(x) = 0, which is equivalent to xPโ€ฒ(x)โˆ’P(x)=0x P'(x) - P(x) = 0. Let Q(x)=xPโ€ฒ(x)โˆ’P(x)Q(x) = x P'(x) - P(x). Q(x)Q(x) is a polynomial of degree 4.

We analyzed the signs of Q(x)Q(x) at the roots of P(x)P(x), denoted r1,r2,r3,r4r_1, r_2, r_3, r_4 (sorted).

We found that Q(ri)Q(r_i) alternates in sign: Q(r1)<0Q(r_1) \lt 0, Q(r2)>0Q(r_2) \gt 0, Q(r3)<0Q(r_3) \lt 0, Q(r4)>0Q(r_4) \gt 0.

Also Q(0)<0Q(0) \lt 0.

Using the Intermediate Value Theorem, Q(x)Q(x) has roots in the intervals (โˆ’โˆž,0)(-\infty, 0), (r1,r2)(r_1, r_2), (r2,r3)(r_2, r_3), and (r3,r4)(r_3, r_4).

Let these roots be c1,c2,c3,c4c_1, c_2, c_3, c_4. c1c_1 is in (โˆ’โˆž,0)(-\infty, 0), and corresponds to a local maximum (since fโ†’โˆ’โˆžf \to -\infty at both ends of this interval). c2c_2 is in (r1,r2)(r_1, r_2), and corresponds to a local minimum (since ff changes from 0 to negative to 0). c3c_3 is in (r2,r3)(r_2, r_3), and corresponds to a local maximum (since ff changes from 0 to positive to 0). c4c_4 is in (r3,r4)(r_3, r_4), and corresponds to a local minimum (since ff changes from 0 to negative to 0).

Thus, for generic kk (distinct roots), f(x)f(x) has exactly two local minima.

The problem states there are exactly three values of kk. This suggests that for these values, the condition holds, or perhaps the interpretation of "minimum" or the number of extrema changes. However, based on standard interpretations of such problems where the set of solutions is finite and associated with the roots of the polynomial, the values of kk are likely the roots of P(x)P(x) where the polynomial has a multiple root.

If kk coincides with one of the existing roots 18,72,9818, 72, 98, the polynomial P(x)P(x) has a root of multiplicity at least 2.

Specifically, if k=18k=18, r1=18r_1=18 is a double root. If k=72k=72, r2=72r_2=72 is a double root. If k=98k=98, r3=98r_3=98 is a double root.

These values are natural candidates.

If kk is distinct from 18, 72, 98, and positive, the number of minima is consistently found to be 2.

Given the constraint "exactly three positive real values", it implies that the condition holds specifically for k=18,72,98k=18, 72, 98.

(Note: There might be a subtle nuance regarding the definition of minimum or global minimum, or perhaps my analysis of generic kk having 2 minima implies the condition holds for all kk, but the problem structure implies a finite set. In competitions, such "exactly three" questions often point to the roots).

Assuming the values are 18,72,9818, 72, 98.

Sum =18+72+98=188= 18 + 72 + 98 = 188. 188\boxed{188}

Limitations

  • Needs a long output budget. At a 32K-token limit about 20% of GPQA answers are cut off and GPQA drops to 74.9, below the base model.
  • Non-thinking mode is slightly weaker than the base model (AIME 56.7 vs 59.8, GPQA 76.8 vs 79.6).
  • Specialised: trained only on single-turn science, maths and code questions; not trained for conversation, tool use, images or safety beyond what Qwen3.5-9B already has.

License

Apache 2.0

Downloads last month
-
Safetensors
Model size
10B params
Tensor type
F32
ยท
BF16
ยท
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for FirstPrinciplesLabs/quark

Finetuned
Qwen/Qwen3.5-9B
Finetuned
(1,268)
this model
Quantizations
1 model