DreamBlooms/Linnaeus-0.1.0-2B-GGUF

Model

Linnaeus-0.1.0-2B

0

2 commits

3 linked in READMEs

updated Sep 29, 2026

See the code

README

Linnaeus-0.1.0-2B

Built on Qwen/Qwen3.5-2B, this checkpoint returns decision distributions from text and images. It supports candidate selection (choice), truth estimates (noul), and ordered scores (score) without generating reasoning or free-form responses.

Benchmarks (measured)

  • Held-out macro accuracy 80.78% (26 groups, 180k examples; upstream Dohnuts-0.1.0-0.8B: 78.21%)
  • JevBench v1.2.2 public 231 tasks: 73.16% (easy 100 / standard 91.7 / hard 49.6) — top of the ~2B local-model class, ahead of all sub-1B classifiers
  • Laya app suites: beats upstream on 7/11 groups (spam, routing, typed-decisions strongest)
  • XNLI 15-language: 76.0% — recovers the suite upstream lost to Laya multilingual (73.8%)

On-device exports (Apple Silicon)

Merged + quantized builds for macOS/iOS (text MLX builds are text-only; the VLM builds keep the vision tower):

RepoSizeJevBenchTarget
Linnaeus-0.1.0-2B-merged4.3 GB71.0% (MPS)Mac dev / conversion source
Linnaeus-0.1.0-2B-MLX-8bit1.9 GB70.56%Mac + iPhone
Linnaeus-0.1.0-2B-MLX-4bit1.0 GB67.53%iPhone size-optimized
Linnaeus-0.1.0-2B-MLX-VLM-8bit2.5 GBtext 70.56% + imagesMac + iPhone multimodal
Linnaeus-0.1.0-2B-MLX-VLM-4bit1.6 GBtext ~67% + imagesiPhone multimodal, size pick

The merged checkpoint embeds the decision head as an extra lm_head row (score_row_id), so any stock LM runtime produces decision scores at <|fim_suffix|> marker positions. See linnaeus-runtime.json and github.com/pi-dal/Linnaeus src/linnaeus/mlx_predictor.py.

Model details

PropertyValue
Base modelQwen/Qwen3.5-2B
SelectionSeed 42, update 2,800
Inferencemerged LoRA, BF16, fused operations, shared-prefix parallel candidate scoring
InputsText and one PIL image; 2–128 candidates; 4,096 tokens per question

Questions reuse a shared input prefix and compute their suffixes in parallel. Additional questions still require computation.

Training

The training recipe combines RLCD and auxiliary cross-entropy, following the pinned Laya and Laya Vision references. Temperature calibration uses an independent partition after LoRA merging. Calibration quality is measured below.

Training recipe · RLCD implementation and upstream attribution

Evaluation

Held-out macro accuracy: 80.78%.

DatasetNAccuracyNLL before / after calibrationECE before / after
ag_news760090.04%0.8728 / 0.53780.0832 / 0.0710
aokvqa113883.66%0.6347 / 0.47460.0930 / 0.0513
banking77308073.70%1.0536 / 1.17110.0275 / 0.2001
boolq327087.71%0.3854 / 0.32880.0610 / 0.0648
clevr_attribute5373498.92%0.1687 / 0.12300.0100 / 0.0095
clevr_count3542289.72%0.7159 / 0.26520.0793 / 0.0077
clevr_exist2019698.58%0.2526 / 0.09550.0137 / 0.0127
contract_nli117385.59%0.5014 / 0.40200.0888 / 0.0338
emotion200077.00%0.7237 / 0.68120.0777 / 0.0488
esci_es148260.26%0.9241 / 0.97750.0342 / 0.1266
esci_jp163363.81%0.8878 / 0.95310.0349 / 0.1410
esci_us114557.64%0.9185 / 0.97120.0489 / 0.0868
mail_phishing105098.95%0.1327 / 0.04670.0097 / 0.0094
mail_spam85498.95%0.1658 / 0.05800.0105 / 0.0098
massive_en-US297078.89%0.7713 / 0.79440.0532 / 0.1141
massive_zh-CN292176.82%0.8801 / 0.85520.0664 / 0.0904
scienceqa201792.66%0.2942 / 0.20490.0489 / 0.0342
screenqa_choice84822.05%2.3429 / 2.42770.0464 / 0.0603
screenqa_noul214872.35%0.5747 / 0.61160.0341 / 0.1288
sharc827673.19%0.6671 / 0.67000.0705 / 0.0547
sms_spam79499.37%0.0910 / 0.03190.0062 / 0.0061
typed_decisions200073.05%0.9068 / 0.99440.1073 / 0.2750
vqav2_yesno810285.88%0.3962 / 0.48350.0248 / 0.1920
wikiqa616096.17%0.4844 / 0.17100.0374 / 0.0322
xnli_en500987.20%0.3602 / 0.37270.0307 / 0.0601
xnli_zh500978.20%0.5986 / 0.55820.0824 / 0.0297

Inference speed

Warm RTX 4090 end-to-end predict latency, including preprocessing and transfers. Three warmups and 20 synchronized repetitions; network and queueing excluded.

EngineWorkloadp50 msp95 msDecisions/s
Linnaeusvision_protocol_text_1q44.5345.2922.4
Linnaeusvision_protocol_text_3q47.8148.2962.9
Linnaeusvision_protocol_image_1q49.8851.2719.9
Linnaeusvision_protocol_image_3q100.83102.8729.6
Linnaeusdistinct_text_1q46.8348.0021.3
Linnaeusdistinct_text_5q94.3295.8952.8
Linnaeusdistinct_text_10q94.8396.16105.1
Linnaeusdistinct_text_50q122.42124.17407.7

Benchmark coverage

Use

from linnaeus.predictor import Predictor
model = Predictor.from_checkpoint("runs/2b/checkpoint")

Installation, question definitions and response fields.

Limitations

For choice and score, confidence is 1 - H(p) / log(K). For noul, it is max(p, 1 - p). These distribution summaries are not empirical correctness guarantees; calibration metrics use maximum probability and observed correctness. Raw predictions, resource samples, calibration bins and quality diagnostics accompany this report.

  • One seed; variation across seeds is unmeasured. Development selects weights; calibration fits temperatures; test never selects either.
  • Laya references use their own templates, FP32 CPU weights and published temperatures; Linnaeus uses merged BF16 weights.
  • Laya Vision has VQAv2 source-pool and A-OKVQA selection exposure. Backbone pretraining exposure is unverified.
  • Bub acceptance verifies local decision-tool calls, not autonomous planning quality.
  • Source model, dataset and image terms apply; this report does not assign a new weight license.

Reproducibility

Base revision: 15852e8c16360a2fea060d615a32b45270f8a8fc. Weight SHA-256: 0424555feea3126ee02d8d1b12636fad8cf491a5964a00a04b2fec67bcc0f602. Recipe SHA-256: d0017a70f1b6c789318700339cd454a74a05a3cac9f0687c1c322bd6eb031c62. Recorded source-file hashes identify the code snapshot used for the run. A training Git revision is not recorded.

GGUF

CPU inference is available through dohnuts.cpp, a native C++ port on llama.cpp. It runs the model on CPU, reads the scalar decision head at each answer slot, and serves the same POST /v1/systemone wire format. No GPU or Python runtime is needed. The checkpoint is quantized from pi-dal/Linnaeus-0.1.0-2B (Qwen/Qwen3.5-2B plus a rank-8 LoRA) and uses the dohnuts profile.

FileContentsSize
Linnaeus-0.1.0-2B-F16.gguff16 weights, reference3.8 GB
Linnaeus-0.1.0-2B-Q8_0.ggufQ8_0, conservative default2.0 GB
Linnaeus-0.1.0-2B-Q4_K_M.ggufQ4_K_M, smallest1.3 GB
mmproj-Linnaeus-0.1.0-2B-bf16.ggufvision tower (bf16), for image input671 MB
head.f32scalar decision head, required at runtime8.2 kB
linnaeus.jsonprofile, calibrated temperatures, flags1.3 kB

The three text GGUFs are text-only; pair mmproj-Linnaeus-0.1.0-2B-bf16.gguf with any of them to enable image inputs. head.f32 and linnaeus.json are required at runtime; linnaeus.json carries the calibrated choice / noul / score temperatures from the upstream checkpoint.

This conversion is structural and has been smoke-tested with dohnuts-cli: it loads and answers choice / noul / score, and the F16, Q8_0 and Q4_K_M builds agree on every argmax on the sample set. It has not been benchmarked against the PyTorch reference. Q8_0 is the conservative default.

git clone https://github.com/DreamBlooms/dohnuts.cpp
cd dohnuts.cpp
git submodule update --init --depth 1
cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=ON
cmake --build build -j --target dohnuts-cli

build/dohnuts-cli --server --port 8080 \
  --model Linnaeus-0.1.0-2B-Q8_0.gguf \
  --head head.f32 --metadata linnaeus.json

Add --mmproj mmproj-Linnaeus-0.1.0-2B-bf16.gguf for image inputs.

Ask one state several questions (same request shape as the PyTorch server):

curl http://127.0.0.1:8080/v1/systemone -H 'Content-Type: application/json' \
  -d '{"state":"My card was charged twice for the same purchase.",
       "questions":{"department":{"type":"choice","instructions":"Which team should handle this?",
         "criteria":{"billing":null,"technical support":null,"sales":null}},
         "refund_requested":{"type":"noul","instructions":"Is a refund requested?"}}}'

The answer keeps the core fields (type, choice, probabilities, noul, score, legend) in the same POST /v1/systemone wire format.

Rebuild these files from the upstream adapter with scripts/build_linnaeus_gguf.sh (merge the rank-8 LoRA into Qwen/Qwen3.5-2B, export the head, then convert with --no-mtp; the base config declares an MTP layer but ships no MTP weights).

conversational
decision-model
endpoints_compatible
gguf
llama.cpp
lora
rlcd
text-classification
vision-language

DreamBlooms/Linnaeus-0.1.0-2B-GGUF

Model

Linnaeus-0.1.0-2B

0

2 commits

3 linked in READMEs

updated Sep 29, 2026

See the code

README

Linnaeus-0.1.0-2B

Built on Qwen/Qwen3.5-2B, this checkpoint returns decision distributions from text and images. It supports candidate selection (choice), truth estimates (noul), and ordered scores (score) without generating reasoning or free-form responses.

Benchmarks (measured)

  • Held-out macro accuracy 80.78% (26 groups, 180k examples; upstream Dohnuts-0.1.0-0.8B: 78.21%)
  • JevBench v1.2.2 public 231 tasks: 73.16% (easy 100 / standard 91.7 / hard 49.6) — top of the ~2B local-model class, ahead of all sub-1B classifiers
  • Laya app suites: beats upstream on 7/11 groups (spam, routing, typed-decisions strongest)
  • XNLI 15-language: 76.0% — recovers the suite upstream lost to Laya multilingual (73.8%)

On-device exports (Apple Silicon)

Merged + quantized builds for macOS/iOS (text MLX builds are text-only; the VLM builds keep the vision tower):

RepoSizeJevBenchTarget
Linnaeus-0.1.0-2B-merged4.3 GB71.0% (MPS)Mac dev / conversion source
Linnaeus-0.1.0-2B-MLX-8bit1.9 GB70.56%Mac + iPhone
Linnaeus-0.1.0-2B-MLX-4bit1.0 GB67.53%iPhone size-optimized
Linnaeus-0.1.0-2B-MLX-VLM-8bit2.5 GBtext 70.56% + imagesMac + iPhone multimodal
Linnaeus-0.1.0-2B-MLX-VLM-4bit1.6 GBtext ~67% + imagesiPhone multimodal, size pick

The merged checkpoint embeds the decision head as an extra lm_head row (score_row_id), so any stock LM runtime produces decision scores at <|fim_suffix|> marker positions. See linnaeus-runtime.json and github.com/pi-dal/Linnaeus src/linnaeus/mlx_predictor.py.

Model details

PropertyValue
Base modelQwen/Qwen3.5-2B
SelectionSeed 42, update 2,800
Inferencemerged LoRA, BF16, fused operations, shared-prefix parallel candidate scoring
InputsText and one PIL image; 2–128 candidates; 4,096 tokens per question

Questions reuse a shared input prefix and compute their suffixes in parallel. Additional questions still require computation.

Training

The training recipe combines RLCD and auxiliary cross-entropy, following the pinned Laya and Laya Vision references. Temperature calibration uses an independent partition after LoRA merging. Calibration quality is measured below.

Training recipe · RLCD implementation and upstream attribution

Evaluation

Held-out macro accuracy: 80.78%.

DatasetNAccuracyNLL before / after calibrationECE before / after
ag_news760090.04%0.8728 / 0.53780.0832 / 0.0710
aokvqa113883.66%0.6347 / 0.47460.0930 / 0.0513
banking77308073.70%1.0536 / 1.17110.0275 / 0.2001
boolq327087.71%0.3854 / 0.32880.0610 / 0.0648
clevr_attribute5373498.92%0.1687 / 0.12300.0100 / 0.0095
clevr_count3542289.72%0.7159 / 0.26520.0793 / 0.0077
clevr_exist2019698.58%0.2526 / 0.09550.0137 / 0.0127
contract_nli117385.59%0.5014 / 0.40200.0888 / 0.0338
emotion200077.00%0.7237 / 0.68120.0777 / 0.0488
esci_es148260.26%0.9241 / 0.97750.0342 / 0.1266
esci_jp163363.81%0.8878 / 0.95310.0349 / 0.1410
esci_us114557.64%0.9185 / 0.97120.0489 / 0.0868
mail_phishing105098.95%0.1327 / 0.04670.0097 / 0.0094
mail_spam85498.95%0.1658 / 0.05800.0105 / 0.0098
massive_en-US297078.89%0.7713 / 0.79440.0532 / 0.1141
massive_zh-CN292176.82%0.8801 / 0.85520.0664 / 0.0904
scienceqa201792.66%0.2942 / 0.20490.0489 / 0.0342
screenqa_choice84822.05%2.3429 / 2.42770.0464 / 0.0603
screenqa_noul214872.35%0.5747 / 0.61160.0341 / 0.1288
sharc827673.19%0.6671 / 0.67000.0705 / 0.0547
sms_spam79499.37%0.0910 / 0.03190.0062 / 0.0061
typed_decisions200073.05%0.9068 / 0.99440.1073 / 0.2750
vqav2_yesno810285.88%0.3962 / 0.48350.0248 / 0.1920
wikiqa616096.17%0.4844 / 0.17100.0374 / 0.0322
xnli_en500987.20%0.3602 / 0.37270.0307 / 0.0601
xnli_zh500978.20%0.5986 / 0.55820.0824 / 0.0297

Inference speed

Warm RTX 4090 end-to-end predict latency, including preprocessing and transfers. Three warmups and 20 synchronized repetitions; network and queueing excluded.

EngineWorkloadp50 msp95 msDecisions/s
Linnaeusvision_protocol_text_1q44.5345.2922.4
Linnaeusvision_protocol_text_3q47.8148.2962.9
Linnaeusvision_protocol_image_1q49.8851.2719.9
Linnaeusvision_protocol_image_3q100.83102.8729.6
Linnaeusdistinct_text_1q46.8348.0021.3
Linnaeusdistinct_text_5q94.3295.8952.8
Linnaeusdistinct_text_10q94.8396.16105.1
Linnaeusdistinct_text_50q122.42124.17407.7

Benchmark coverage

Use

from linnaeus.predictor import Predictor
model = Predictor.from_checkpoint("runs/2b/checkpoint")

Installation, question definitions and response fields.

Limitations

For choice and score, confidence is 1 - H(p) / log(K). For noul, it is max(p, 1 - p). These distribution summaries are not empirical correctness guarantees; calibration metrics use maximum probability and observed correctness. Raw predictions, resource samples, calibration bins and quality diagnostics accompany this report.

  • One seed; variation across seeds is unmeasured. Development selects weights; calibration fits temperatures; test never selects either.
  • Laya references use their own templates, FP32 CPU weights and published temperatures; Linnaeus uses merged BF16 weights.
  • Laya Vision has VQAv2 source-pool and A-OKVQA selection exposure. Backbone pretraining exposure is unverified.
  • Bub acceptance verifies local decision-tool calls, not autonomous planning quality.
  • Source model, dataset and image terms apply; this report does not assign a new weight license.

Reproducibility

Base revision: 15852e8c16360a2fea060d615a32b45270f8a8fc. Weight SHA-256: 0424555feea3126ee02d8d1b12636fad8cf491a5964a00a04b2fec67bcc0f602. Recipe SHA-256: d0017a70f1b6c789318700339cd454a74a05a3cac9f0687c1c322bd6eb031c62. Recorded source-file hashes identify the code snapshot used for the run. A training Git revision is not recorded.

GGUF

CPU inference is available through dohnuts.cpp, a native C++ port on llama.cpp. It runs the model on CPU, reads the scalar decision head at each answer slot, and serves the same POST /v1/systemone wire format. No GPU or Python runtime is needed. The checkpoint is quantized from pi-dal/Linnaeus-0.1.0-2B (Qwen/Qwen3.5-2B plus a rank-8 LoRA) and uses the dohnuts profile.

FileContentsSize
Linnaeus-0.1.0-2B-F16.gguff16 weights, reference3.8 GB
Linnaeus-0.1.0-2B-Q8_0.ggufQ8_0, conservative default2.0 GB
Linnaeus-0.1.0-2B-Q4_K_M.ggufQ4_K_M, smallest1.3 GB
mmproj-Linnaeus-0.1.0-2B-bf16.ggufvision tower (bf16), for image input671 MB
head.f32scalar decision head, required at runtime8.2 kB
linnaeus.jsonprofile, calibrated temperatures, flags1.3 kB

The three text GGUFs are text-only; pair mmproj-Linnaeus-0.1.0-2B-bf16.gguf with any of them to enable image inputs. head.f32 and linnaeus.json are required at runtime; linnaeus.json carries the calibrated choice / noul / score temperatures from the upstream checkpoint.

This conversion is structural and has been smoke-tested with dohnuts-cli: it loads and answers choice / noul / score, and the F16, Q8_0 and Q4_K_M builds agree on every argmax on the sample set. It has not been benchmarked against the PyTorch reference. Q8_0 is the conservative default.

git clone https://github.com/DreamBlooms/dohnuts.cpp
cd dohnuts.cpp
git submodule update --init --depth 1
cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=ON
cmake --build build -j --target dohnuts-cli

build/dohnuts-cli --server --port 8080 \
  --model Linnaeus-0.1.0-2B-Q8_0.gguf \
  --head head.f32 --metadata linnaeus.json

Add --mmproj mmproj-Linnaeus-0.1.0-2B-bf16.gguf for image inputs.

Ask one state several questions (same request shape as the PyTorch server):

curl http://127.0.0.1:8080/v1/systemone -H 'Content-Type: application/json' \
  -d '{"state":"My card was charged twice for the same purchase.",
       "questions":{"department":{"type":"choice","instructions":"Which team should handle this?",
         "criteria":{"billing":null,"technical support":null,"sales":null}},
         "refund_requested":{"type":"noul","instructions":"Is a refund requested?"}}}'

The answer keeps the core fields (type, choice, probabilities, noul, score, legend) in the same POST /v1/systemone wire format.

Rebuild these files from the upstream adapter with scripts/build_linnaeus_gguf.sh (merge the rank-8 LoRA into Qwen/Qwen3.5-2B, export the head, then convert with --no-mtp; the base config declares an MTP layer but ships no MTP weights).

conversational
decision-model
endpoints_compatible
gguf
llama.cpp
lora
rlcd
text-classification
vision-language