DEV Community

Cover image for How to Run LiquidAI d1-3B Locally (It's a Vision Model That Can't Talk)
Alan West
Alan West

Posted on Originally published at blog.authon.dev

How to Run LiquidAI d1-3B Locally (It's a Vision Model That Can't Talk)

LiquidAI d1-3B is a 3B image-text model that has picked up 10,843 downloads since its October 7 release, and plenty of those people will be surprised when they load it. There is no way to ask it for a caption. It has no text output at all, and every response reports "output_tokens": 0.

Liquid calls d1-3B a "decision model". It reads text, JSON and images, then answers questions you define up front (yes/no, pick one, or score on a scale) in a single forward pass. It never writes a sentence. If you came looking for a pocket Qwen-VL or Gemma to caption your camera roll, this is the wrong download. If you've ever spent a 7B chat model's tokens on a yes/no question, it might be exactly what you need.

What d1-3B actually is

Liquid AI released Open d1 on October 7, 2026. There are two models: d1-3B (text + image) and d1-omni-600M (text + image or text + audio, labelled experimental).

The specs from the model card:

d1-3B
Parameters 3.12B
Vision encoder SigLIP2 NaFlex shape-optimized, 400M
Context length 32,768 tokens
Vocabulary 128,000
Weights Safetensors, BF16
Base model LFM2.5-VL-3B (text backbone averaged with LFM2.5-2.6B)
License lfm1.0 (LFM Open License)

The architecture is LFM2.5-VL-3B's. The difference from earlier LFMs is what Liquid did to the weights and what comes out the other end. According to the blog post, they averaged LFM2.5-2.6B's weights with the VL model's text backbone, fine-tuned several checkpoints with different seeds and data mixes, and merged them. Liquid's own takeaway is pleasantly unglamorous: training on long inputs, shuffling answer options and fixing data shortcuts mattered more than any clever technique.

Three question types, zero output tokens

You ask questions, and each one has a type:

Type What you get back
noul P(yes)
choice chosen option, confidence, per-option probabilities
score expected level on a 2–10 step ordinal scale, confidence, probabilities

Several named questions can share one "state" (your ticket, document, image) and get answered in the same pass. The return shape is {"answers": {...}, "usage": {"input_tokens": n, "output_tokens": 0}}.

For a router, a moderation filter or an agent guardrail, this is the API I actually wanted. You get probabilities back and never have to parse a malformed JSON blob from a chat model that decided to add "Sure! Here's your answer:" in front. The model card calls the answers "calibrated". Whether they are well calibrated is another matter: Liquid doesn't publish calibration error for d1, and one review names calibration error as the obvious open question, one you'll have to measure yourself.

Benchmarks: where Qwen-VL and Gemma are missing

I went looking for d1-3B vs Qwen2.5-VL-3B or Gemma at the same size. Liquid doesn't publish one. It compares d1-3B against other decision models and against its own backbone.

On the Decision Index v0.2.1 (public split), d1-3B scores 48.57. That's the top sub-10B result in their table, behind Winnow-12B (50.02) and ahead of Decider 35B-A3B (47.11). The other rows come from the public leaderboard, but Liquid ran the official scorer on d1-3B itself instead of submitting it, so read it accordingly.

Text tasks, from the blog:

Benchmark d1-3B Decider 4B Decider 2B
SQuAD 2.0 85.3 76.0 67.7
Civil Comments 93.0 92.8 93.6
MASSIVE intent 87.3 88.3 81.1
PubMedQA 66.0 63.3 65.7
BoolQ 86.7 89.0 87.3
XNLI 85.0 88.6 85.0
PAWS-X 76.9 69.8 59.5
Mean 82.9 81.1 77.1

The 4B model wins BoolQ, XNLI and MASSIVE. The model card's version of this table adds HelpSteer2, where d1-3B scores 36.7 to Decider 4B's 42.0, and with that row included the means shrink to 77.1 vs 76.2, which is a narrow win. The Knowledge category on the Decision Index is a weak 23.8, so don't expect it to know facts; it judges what you hand it.

The vision numbers are a bit awkward. Across 11 image benchmarks the card reports a mean of 74.1 for d1-3B vs 73.9 for LFM2.5-VL-3B, so turning the model into a decision engine barely moved average vision quality. The per-benchmark breakdown is uneven, though:

Benchmark d1-3B LFM2.5-VL-3B
VL-RewardBench 65.0 50.9
MMVP 77.0 73.7
CV-Bench 82.1 87.6
VisualWebBench 71.4 78.3
POPE 88.5 90.1

It's much better as a visual judge (+14.1 on VL-RewardBench) and noticeably worse at spatial reasoning and reading web screenshots. If your plan was "check whether this UI screenshot shows an error dialog", the 6.9-point drop on VisualWebBench should give you pause. Liquid's blog says it validated vision on standard public benchmarks, and that the Decision Index v0.3 private vision split is not reported in this release.

I don't think leaving out Qwen-VL and Gemma is an attempt to hide something. Those are generative models and the comparison doesn't map cleanly. It does leave you to figure out yourself whether a 3B classifier beats prompting a VLM you already run. Build a 200-example eval from your own data before switching.

The license says "open". Read the fine print

The blog says you can download, fine-tune and deploy "without restrictions". The Hugging Face tag says lfm1.0, which is the LFM Open License v1.0. It's based on Apache 2.0 with one big change: commercial rights end once your company's annual revenue passes $10 million USD, after which you need a paid license from Liquid. That limit also applies to fine-tuned derivatives. There's no copyleft, so your fine-tunes can stay closed.

For indie devs and most startups this is a non-issue. For anyone at a company of real size, "without restrictions" is the wrong phrase, and I wish Liquid had skipped it.

GGUF sizes and latency: RTX 4090, M5 Pro, Jetson

Liquid doesn't publish RAM or VRAM numbers. The official GGUF repo gives you file sizes, which are a decent lower bound:

Quant Size
Q4_K_M 1.67 GB
Q8_0 2.87 GB
BF16 / F16 5.4 GB

Q4_K_M fits comfortably on a laptop and, on paper, on a recent phone. Note that Liquid's own speed table has no phone in it.

Published latency (single request):

Device 1 question 384px image Packed throughput
RTX 4090 (bf16) 8 ms 17 ms 475 states/s
Apple M5 Pro (MPS) 30 ms 62 ms 78 states/s
Jetson AGX Orin 64GB 26 ms 83 ms 110 states/s
Jetson Orin Nano 50 ms 202 ms 38 states/s

The 4090's 8 ms figure assumes model.compile(mode="reduce-overhead"); without it the card says 16 ms. A 3.4k-token state takes 640 ms on the M5 Pro and 1,640 ms on the Orin Nano, so long documents cost real time even with no decoding.

How to run d1-3B locally

Transformers

You need 5.14 or newer and trust_remote_code=True:

pip install "transformers>=5.14" torch torchvision pillow
Enter fullscreen mode Exit fullscreen mode
import torch
from transformers import AutoModel

device = "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu"
dtype = torch.float32 if device == "cpu" else torch.bfloat16

model = AutoModel.from_pretrained("LiquidAI/d1-3B", trust_remote_code=True, dtype=dtype).to(device)
# then: model.system_one(state, questions, images=None)
# or:   model.system_one_batch([(state, questions[, images]), ...])
Enter fullscreen mode Exit fullscreen mode

llama.cpp

Liquid claims day-one support. The GGUF card's quick start pulls the Q8_0 file; swap the tag for Q4_K_M if you want the 1.67 GB one:

llama-server -hf LiquidAI/d1-3B-GGUF:Q8_0
Enter fullscreen mode Exit fullscreen mode

Then POST to /v1/systemone with state (or null for image-only), optional base64 images, and a questions object. The text example from the card:

curl http://127.0.0.1:8080/v1/systemone -H "Content-Type: application/json" -d '{
  "state": "I was charged twice this month, please refund one of them.",
  "questions": {
    "refund":  {"type": "noul", "instructions": "Is the customer asking for a refund?"},
    "team":    {"type": "choice", "instructions": "Which team should handle this?",
                "criteria": {"billing": "Charges, refunds, invoices", "technical": "App or site faults",
                             "fraud": "Suspected unauthorised use"}},
    "urgency": {"type": "score", "instructions": "How urgent is this?",
                "criteria": ["Can wait", "Today", "Blocking the customer now"]}
  }
}'
Enter fullscreen mode Exit fullscreen mode

This isn't /v1/chat/completions, so your existing OpenAI-client code won't just work. The GGUF page doesn't say which llama.cpp build you need, so update first.

vLLM, SGLang, Docker

Hugging Face's "Use this model" panel offers vLLM, SGLang and docker model run hf.co/LiquidAI/d1-3B snippets, but those are generated by the Hub. Neither the model card nor the blog mentions them, and given the custom system_one API I'd test before trusting them.

MLX

The model card, GGUF card and blog don't mention MLX at all. On a Mac today, your options are PyTorch on MPS (where Liquid's M5 Pro numbers come from) or llama.cpp with Metal.

Who should actually download it

Grab it if you're building a router, a content filter, an agent guardrail, a reranker, or a camera pipeline that needs a yes/no on every frame. Skip it if you need captions, OCR output, or anything you'd show to a user as text. For those, a generative VLM is still the tool, and nothing Liquid published says d1-3B competes there.

I think "a vision model that can't talk" is the most useful thing Liquid has shipped this year, because most production VLM calls I've seen are classifiers dressed up as chat. What would you build with a 3B vision model that runs fully offline and only answers the questions you give it? And would you trust its confidence scores without calibrating them yourself first?

Sources

Top comments (0)