Ornith-1.5-35B-A3B ยท M3TiS ยท RTX 3090

Ornith 1.5 35B-A3B at ~545 tokens/s for code and ~400 for chat, with the full 262K-token context, on one 24 GB RTX 3090.

M3TiS is a series of builds tuned for the RTX 3090. This second release is a new quantization of Ornith-1.5-35B-A3B (we call it R1s) plus a server built from TensorFold's native Zig engine. Everything is in this repo: 15 GB of weights and a 10 MB server.

  • The experts are 3-bit, the rest 4-bit. All 40 layers' routed experts are 3-bit, which is what makes the model 15 GB. The always-on parts (attention, linear attention, shared expert) are 4-bit, rounded with an importance-weighted search instead of plain rounding. That cut the damage measured against the original by 12% at no cost in size or speed (below).
  • Drafting uses Ornith's own built-in draft head (MTP), so there's no second model to download. The 35B checks every guess, so the output is the same as without it.

Quick start

pip install -U huggingface_hub            # for `hf download`
hf download CanadaApollo6/Ornith-1.5-35B-A3B-M3TiS-3090 --local-dir m3tis-ornith
cd m3tis-ornith && chmod +x m3tis-serve.sh bin/tensorfold-native
./m3tis-serve.sh

It serves an OpenAI-compatible API at http://127.0.0.1:8080/v1 (/chat/completions, /completions, /models). PORT=โ€ฆ and CONTEXT=โ€ฆ change the port and window, and extra flags pass through to tensorfold-native serve (--no-thinking, --temperature, --api-key, โ€ฆ).

Measured on one RTX 3090 (2026-10-13)

These numbers come from the files in this repo, started with ./m3tis-serve.sh: the 262K window, a single user, and 256-token replies. Each figure is the median of 3 runs.

Tokens/s Greedy Sampled (T=1.0)
Code (write a Fibonacci function) 545 480
Chat (explain GPUs, no thinking) 403 367
Long prompts Read Reply speed
21K tokens 3.7 s (5,590 tokens/s)
45K tokens 9.8 s 274 tokens/s drafted, 186 without drafts
52K tokens 12.2 s (4,300 tokens/s)
199K tokens 95 s (2,080 tokens/s)
  • First token: 17โ€“25 ms on short prompts.
  • Recall: every long prompt hid a number in its middle, and the model found it each time, including at 199K.
  • Memory: the card peaked at 17.2 GB with the full 262K window, including ~1.3 GB used by the desktop. The server wants ~21.3 GiB free at the 262K window (weights, its working space and a 1 GiB reserve), or ~18.8 GiB at CONTEXT=131072. If other programs use the card, it says how much is missing and suggests a smaller window.
  • Measured on a desktop in use, so expect a few percent more on an idle machine.

Is it still the same model?

The draft head and other users change nothing. Every output token is checked by the 35B. One user, drafts off, and three users at once all give the same replies. Short and long (14K, 40K, 45K) prompts give the same replies with and without drafts.

The quantization is the lossy part. Here is how much it costs, measured in several ways:

  • Next-token predictions vs the original (bf16). This is KL divergence over the full vocabulary. It was scored on 287K positions the model wrote itself (thinking, answers and tool calls) in 57 recorded agent conversations.

    Build KL vs bf16 (lower is better)
    Swapping kernels on bf16 itself (noise floor) ~0.04
    This build (R1s) 0.229
    Same experts with the always-on parts plainly rounded at 4-bit 0.260
    Ornith's MLX 4-bit, everything 4-bit (smaller sample: 6 conversations) ~0.22

    Plainly rounding only the always-on parts costs about as much as the 3-bit experts. Our search recovers most of the gap to an all-4-bit build without its extra 4 GB.

  • Agent tasks. Terminal-Bench 2 (20 tasks, of which 19 are scorable) ran under the pi harness, 3 attempts each. This build solved 10.0 of 19 on average, against 10.3 for Ornith's official Q8_0. The task-by-task difference is not significant (p = 1.0). Its solved runs used 1.28ร— Q8_0's tokens (95% CI 0.92โ€“1.86).

  • Under Claude Code. On 10 DeepSWE tasks with one attempt each, it solved 2, against 1 for bf16. On all 89 Terminal-Bench 2 tasks it solved 33 under Claude Code, 35 under prime_agent and 40 under pi.

The agent evals ran these weights on TensorFold's Python engine. The Zig server in this repo runs the same weights with a different summation order. On our test prompts, greedy replies drift apart after 13 to 63 tokens. That kind of difference measures at the ~0.04 noise floor above.

Requirements

  • An NVIDIA RTX 3090 (sm_86, 24 GB). Other sm_86 cards with 24 GB should work but are untested.
  • Linux x86-64 with glibc 2.28 or newer and an AVX2 CPU (Intel 2013+, AMD 2015+).
  • An NVIDIA driver with CUDA 13 support (R580 or newer, expected). Tested on 615.71.09.
  • No CUDA toolkit, Python or PyTorch: the server is self-contained, and its kernels are compiled in.

How the weights were made

The starting point is the bf16 Ornith-1.5-35B-A3B. The weights use MLX's affine format with group size 64:

Part Bits How
Routed experts (gate, up, down; all 40 layers) 3 Importance-weighted search
Attention, linear attention, shared expert 4 Importance-weighted search
Embeddings, lm_head, MTP draft head 4 From Ornith's MLX 4-bit, unchanged
Routers 8 From Ornith's MLX 4-bit, unchanged
Norms, convolutions 16 Unchanged

The search picks each group's scale and offset to minimize error, weighted by how much each input channel is used on real text. Those weights come from bartowski's importance matrix. quantize-report.json lists each expert tensor's error next to plain rounding. The search's error is about a third lower (median 0.69ร—, best 0.47ร—).

What's different from upstream TensorFold

The server is built from TensorFold PR #608's Zig engine. It carries the first M3TiS release's RTX 3090 changes plus these, which add this model family to the engine (source: SOURCE.md):

  • 3-bit and 4-bit expert kernels, with the MTP draft head drafting 3 tokens ahead.
  • CUDA graphs for one-user rounds, and a faster word pick and expert router for long prompts.
  • A sliding window for the draft head's own memory, so drafting stays cheap at long contexts.

Files

Path What
m3tis-serve.sh Starts the server on the weights in this folder
bin/tensorfold-native The server (10 MB, static except libc; loads libcuda at run time)
config.json, model-*.safetensors, mtp-4bit.safetensors, tokenizer files The weights (15 GB, MLX affine format)
quantize-report.json Each expert tensor's error, ours vs plain rounding
LICENSE, NOTICE, THIRD_PARTY_NOTICES.md, LICENSES/ TensorFold's licenses for the server (Apache-2.0)

Credits and license

The weights are MIT, as is Ornith-1.5-35B-A3B by Ornith AI. The server is Apache-2.0, as is TensorFold by its authors. The importance matrix is by bartowski. M3TiS is an independent build by CanadaApollo6 and is not affiliated with any of them.

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

Model tree for CanadaApollo6/Ornith-1.5-35B-A3B-M3TiS-3090

Quantized
(205)
this model