Issue 41 · Project 06 HF model AI / ML trending #9 ✓ read
LiquidAI/d1-3B
Hugging Face ↗ ·♥ 357 ·↓ 11,866·other ·created 2026-10-05 ·3 min read
TL;DR: d1-3B is Liquid AI's 3B multimodal "decision model": you hand it a state (text, JSON, images) and a dictionary of typed questions (yes/no, choice, score), and it returns calibrated probability distributions for all of them in a single forward pass with zero output tokens — 8 ms per decision on a 4090, 30 ms on an M5 Pro, usable on a Jetson Orin Nano. The interesting part isn't the benchmark numbers; it's the interface, which replaces generate-then-parse-JSON with a direct calibrated readout and is a deployment pattern that could spread fast.
What it is
d1-3B is LFM2.5-VL-3B (SigLIP2 NaFlex 400M vision encoder, 32k context) post-trained so that decisions are read out during prefill rather than decoded. Three question types, following their "Decision Index" schema:
noul— yes/no, returns P(yes)choice— one of N named options, returns the pick plus a full probability vectorscore— 2–10 ordered levels, returns an expected value over the levels plus probabilities
Multiple named questions ride on a single state encoding: the model reads the state (and its images) once and answers everything in one pass. Three questions cost 21 ms vs 8 ms for one on a 4090 — not 3×. There's also a padding-free batched call that hits 475 states/s on a 4090 and 1,106/s on an MI325X.
The card doesn't describe the training recipe or the exact readout mechanism (presumably distributions over answer positions, calibrated during post-training), and the model ships custom code — this is not a standard generate() workflow.
Evidence
The headline claim is best "decision model" under 10B on Decision Index 0.2.1: 48.57, ahead of Decider 35B-A3B (47.11) and all 4B/9B entries, behind only a 12B. Caveat: this leaderboard and its competitors (Winnow, Decider, JPT, Jet) are not names I can independently place — this looks like a young benchmark ecosystem that's hard to externally sanity-check, and Liquid's score is self-reported ("official scorer, not a leaderboard submission").
More interpretable: on classic classification benchmarks framed as decisions it averages 77.1 (SQuAD 2.0 85.3, BoolQ 86.7, XNLI 85.0), beating Decider 4B's 76.2 — though it loses on several individual rows (HelpSteer2, XNLI, BoolQ, MASSIVE). Vision is preserved from the base model: 74.1 mean over 11 image benchmarks vs 73.9 for LFM2.5-VL-3B, with a nice ablation — removing the images drops the same questions to 45.1, so it's actually looking.
The glaring omission: no calibration metrics (ECE, reliability curves) despite "calibrated" being the core claim, and no head-to-head against a prompted generative VLM doing the same tasks via constrained decoding. The latter is the comparison that matters for anyone deciding whether to adopt this.
What's actually there and what to expect
Safetensors weights, custom modeling code (trust_remote_code=True required, transformers>=5.14), a HF Space collection ("Open d1 Arcade", 10 demos), and a blog post. Multilingual (en/zh/ar/fr/de tags). License is "other" — likely Liquid's LFM license with commercial restrictions; check before production use. It is explicitly not a chat model — it cannot generate text at all, so no rationales, no extraction of free-form fields. Scores are capped at 10 ordered levels. 3.1B params in bf16 means ~6.5 GB, fine for edge.
The real significance: half the LLM calls in production pipelines are classification wearing a generation costume — routing, moderation, judging, guardrails, reranking — paying for autoregressive decoding and brittle JSON parsing to get one label. A single-pass readout with native probabilities is strictly better for those if accuracy holds, and 262 decisions/s on a Jetson Thor makes real-time multimodal triage on-device plausible. Whether the calibration claim survives contact with your distribution is the open question; the README gives you no ECE numbers to lean on.
Try it
pip install "transformers>=5.14" torch torchvision pillow
from transformers import AutoModel
model = AutoModel.from_pretrained("LiquidAI/d1-3B", trust_remote_code=True).to("cuda")
out = model.system_one(
"I was charged twice this month, please refund one of them.",
{"refund": {"type": "noul", "instructions": "Is the customer asking for a refund?"}},
)
print(out["answers"]["refund"]) # P(yes), 0 output tokens
Or poke the zero-setup demos first: the Open d1 Arcade Space collection linked from the model card.