models
Models that fit on a phone with ~8GiB RAM — what they are, what each one is good for, what to pay, and how to compare them. This page exists because I keep hitting this wall: every model is a number with a marketing deck, and none of the numbers agree. So this is the honest version, maintained by hand and updated periodically rather than streamed live.
Data checked 2026-11-08. Where a number is vendor-reported it’s marked †; where I couldn’t verify it says UNVERIFIED rather than being filled with a plausible-looking lie. Benchmarks don’t transfer across vendors, so treat the “Measured” column as one signal, never the signal.
the short version
- A model is a file of weights + a bit of plumbing. No internet, no account, no subscription needed to run one.
- Rule of thumb: RAM ≈ parameters × bytes-per-parameter. At int4 (4-bit) quantisation that’s ~0.55 GB per billion parameters, plus runtime overhead and plus KV-cache growth with context (cheap at short context; several GB extra at full ctx).
- 8 GiB usable ⇒ a realistic int4 weight budget of 4–5 GB ⇒ comfortably ≤4B parameter dense models (or ~8B models with very tight KV at short context; not “load it at 256K ctx” territory).
- Everything listed here fits that envelope with int4 quantisation — the largest are Gemma-4-E4B-class (~2.5 GB effective weights). Everything runs fully offline.
the types of model you’re choosing between
- General LLM — text in → text out. The “assistant” or the brains of the app: summarising, organising, answering, calling tools.
- VLM (vision / multimodal) — pixels or frames in → text out. OCR, document parsing, photo tagging, captioning, frame-sampled video understanding. A few add audio input or even speech output (see LFM3-Omni).
- STT (speech-to-text) — audio in → tokens out. Transcription, dictation, live captions, voice commands.
- Speaker / diarization — audio in → who spoke when. Not a vocabulary; these are segmentation + embedding + clustering models. Genuine low-latency “who is talking right now” open-weight is very new — see the table.
- Reasoning models — not a separate species, an LLM post-trained to emit a long private chain-of-thought before the answer. Usually slower per answer, much better at maths/code/multi-step planning. Nearly always also toggleable (marked
opt).
A few things the table does not tell you, because nobody can: how a model feels in your actual conversation flow (that’s a week with a good and a bad prompt), or how its chat template handles your system prompt (read the card).
the table
Search, filter by type, click a header to sort. † = vendor-reported; UNVERIFIED = could not be confirmed from source.
| Type | In → Out | Think | Measured | License | Best for | Status | |||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Qwen3-0.6BAlibaba | 2025-04 | LLM | 0.6B | ~0.3 GB | 32K | text → text | ± | MMLU 52.8 | Apache-2.0 | tiniest reasoner; offline chat | superseded |
| Qwen3-1.7BAlibaba | 2025-04 | LLM | 1.7B | ~0.9 GB | 32K | text → text | ± | MMLU 62.6 | Apache-2.0 | small reasoning; on-device chat | superseded |
| Qwen3-4BAlibaba | 2025-04 | LLM | 4B | ~2.2 GB | 32K (128K YaRN) | text → text | ± | MMLU 73.0 | Apache-2.0 | best ≤4B 2025 reasoner (pre-3.5) | superseded |
| Llama-3.2-1B-InstructMeta | 2024-09 | LLM | 1.23B | ~0.7 GB | 128K | text → text | — | MMLU 49.3 | Llama 3.2 Community | weakest Llama; do not expect miracles | current |
| Llama-3.2-3B-InstructMeta | 2024-09 | LLM | 3.2B | ~1.8 GB | 128K | text → text | — | MMLU 63.4 | Llama 3.2 Community | safe cross-HW default; 128K ctx | current |
| Gemma-3-1B-itGoogle | 2025-03 | LLM | 1B | ~0.5 GB | 32K | text → text | — | HellaSwag 62.3 (10-shot) | Gemma terms | tiny English-centric tasks | superseded |
| SmolLM3-3BHugging Face | 2025-07 | LLM | 3B | ~1.7 GB | 64K (128K YaRN) | text → text | ± | AIME'25 36.7 † · Global MMLU 64.1 | Apache-2.0 | reasoning + no-think chat in one model | current |
| Phi-4-mini-instructMicrosoft | 2025-02 | LLM | 3.8B | ~2.1 GB | 128K | text → text | — | MMLU 67.3 | MIT | strong bench-per-GB; English-first | current |
| Phi-4-mini-reasoningMicrosoft | 2025-04 | LLM | 3.8B | ~2.1 GB | 128K | text → text | — | AIME'24 57.5 | MIT | math-grade chain-of-thought on phone | current |
| DeepSeek-R1-Distill-Qwen-1.5BDeepSeek | 2025-01 | LLM | 1.5B | ~0.8 GB | 128K* | text → text | — | AIME'24 28.9 · MATH-500 83.9 | MIT | long CoT at 0.8 GB; no toggle | current |
| MiniCPM5-2BOpenBMB | 2026-09 | LLM | 2B | ~1.4 GB | 128K | text → text | ± | AIME'25 86.5 † | Apache-2.0 | 2026 small reasoner; EN/ZH | current |
| LFM3-1.7BLiquid AI | 2026-10 | LLM | 1.73B | ~1.0 GB | 256K | text → text | ± | LiveCodeBench 73.5 † · GPQA 63.4 † | LFM Open License v1.0 (<$10M rev) | edge optimised; hybrid fast path | current |
| Qwen3-VL-2B-InstructAlibaba | 2025-10 | VLM | 2.1B | ~1.2 GB | 256K | text · image · video → text | ± | MMMU 53.4 · DocVQA 93.3 | Apache-2.0 | best 2025 sub-2B multimodal | current |
| Qwen3-VL-4B-InstructAlibaba | 2025-10 | VLM | 4.4B | ~2.4 GB | 256K | text · image · video → text | ± | MMMU 67.4 · DocVQA 95.3 · Video-MME 69.3 | Apache-2.0 | video LLM for 8 GiB phones | current |
| Qwen3.5-0.8BAlibaba | 2026-02 | VLM | 0.8B | ~0.5 GB | 256K | text · image · video → text | ± | MMLU-Pro 42.3 (T) / 29.7 (NT) | Apache-2.0 | smallest native multimodal | current |
| Qwen3.5-2BAlibaba | 2026-02 | VLM | 2.3B | ~1.3 GB | 256K | text · image · video → text | ± | MMLU-Pro 66.5 (T) · MMMU 64.2 | Apache-2.0 | recommended small VLM, 2026 line | current |
| Qwen3.5-4BAlibaba | 2026-02 | VLM | 4.7B | ~2.6 GB | 256K (1M YaRN) | text · image · video → text | ± | MMLU-Pro 79.1 (T) · MMMU 77.6 | Apache-2.0 | strongest ≤4B multimodal, thinking | current |
| Gemma-3-4B-itGoogle | 2025-03 | VLM | 4.3B | ~2.4 GB | 128K | text · image → text | — | MMLU 59.6 (PT, 5-shot) | Gemma terms | hosted cheap ($0.05/$0.10/M) else skip | superseded |
| Gemma-3n-E2B-itGoogle | 2025-06 | VLM | 2B eff (5.1 w/ emb) | ~1.1 GB eff (~3.0 full) | 32K | text · image · video · audio → text | — | MMLU (0-shot) 60.1 | Gemma terms | omni on-device: image+audio in | current |
| Gemma-3n-E4B-itGoogle | 2025-06 | VLM | 4B eff (7.9 w/ emb) | ~2.2 GB eff (~4.3 full) | 32K | text · image · video · audio → text | — | MMLU (0-shot) 64.9 | Gemma terms | omni with better quality than E2B | current |
| Gemma-4-E2B-itGoogle | 2026-04 | VLM | 2.3B eff (5.1 w/ emb) | ~1.3 GB eff (~2.8 full) | 128K | text · image · video · audio → text | ± | MMLU-Pro 60.0 · MMMU-Pro 44.2 | Apache-2.0 | omni open Apache on-device 2026 | current |
| Gemma-4-E4B-itGoogle | 2026-04 | VLM | 4.5B eff (8.0 w/ emb) | ~2.5 GB eff (~4.4 full) | 128K | text · image · video · audio → text | ± | MMLU-Pro 69.4 · MMMU-Pro 52.6 | Apache-2.0 | omni for capable phones; E2B tier better fit | current |
| LFM3-VL-2BLiquid AI | 2026-10 | VLM | 1.9B | ~1.1 GB | 128K | text · image · video → text | ± | MMMU 55.7 † · DocVQA 96.7 † · Video-MME 62.8 † | LFM Open License v1.0 (<$10M rev) | on-phone VLM edge (S26/OnePlus tested) | current |
| LFM3-Omni-2BLiquid AI | 2026-10 | VLM | 2.2B | ~1.2 GB | 32K | text · image · video · audio → text · speech | — | MMMU 42.4 † · EN-ASR WER 6.4 † | LFM Open License v1.0 (<$10M rev) | full omni incl. speech output | current |
| SmolVLM2-256M-Video-InstructHugging Face | 2025-02 | VLM | 256M | ~0.14 GB | 8K | text · image · video → text | — | Video-MME 33.7 | Apache-2.0 | video captioning on the weakest HW | current |
| SmolVLM2-500M-Video-InstructHugging Face | 2025-02 | VLM | 500M | ~0.28 GB | 8K | text · image · video → text | — | Video-MME 42.2 | Apache-2.0 | cheap visual QA; 8 GB HW | current |
| SmolVLM2-2.2B-InstructHugging Face | 2025-02 | VLM | 2.2B | ~1.2 GB | 8K | text · image · video → text | — | MMMU 42.0 · DocVQA 80.0 · Video-MME 52.1 | Apache-2.0 | all-round open video VLM (8K ctx) | current |
| MiniCPM-V-4.7-1BOpenBMB | 2026-10 | VLM | 1.6B | ~0.9 GB | 256K | text · image · video → text | — | MMMU 56.9 · OCRBench 86.1 | Apache-2.0 | recommended OCR/vision for phones | current |
| MiniCPM-OCR-1.0OpenBMB | 2026-10 | VLM | 1.3B | ~0.7 GB | — | text · image → text | — | Real5-OmniDocBench 93.68 † | Apache-2.0 | specialist document/OCR parsing | current |
| Ministral-3-3B-2512Mistral | 2025-12 | VLM | 3.4B LM + 0.4B ViT | ~2.1 GB | 256K (131K hosted) | text · image → text | ± | MMLU (base) 70.7 · AIME-25 72.1 (Reasoning) | Apache-2.0 | edge dense VLM; strong EN/FR | current |
| Moonshine-tiny · baseUseful Sensors | 2024-10 | STT | 27M · 62M | ~0.02–0.06 GB | — | audio → text | — | WER 12.7 † (tiny, Open-ASR) | MIT | live captions / push-to-talk | current |
| Whisper-tinyOpenAI | 2022-09 | STT | 38M | ~0.02 GB | — | audio → text (99 langs) | — | WER 7.5 / 17.2 (clean/other) | Apache-2.0 | smallest multilingual ASR ever | current |
| Whisper-baseOpenAI | 2022-09 | STT | 73M | ~0.04 GB | — | audio → text (99 langs) | — | WER 5.0 / 12.9 | Apache-2.0 | small but real multilingual ASR | current |
| Whisper-smallOpenAI | 2022-09 | STT | 242M | ~0.12 GB | — | audio → text (99 langs) | — | WER 3.4 / 7.6 | Apache-2.0 | solid general-purpose ASR (99 langs) | current |
| Whisper large-v3-turboOpenAI | 2024-10 | STT | 809M | ~0.4 GB | — | audio → text (99 langs) | — | WER 7.83 † (Open-ASR mean) | MIT | accuracy-favouring 8 GiB ASR | current |
| Distil-Whisper large-v3Hugging Face | 2024-03 | STT | 756M | ~0.38 GB | — | audio → text (EN only) | — | WER 9.7 (ESB short-form) | MIT | English long-form transcription | current |
| Qwen3-ASR-0.6BAlibaba | 2026-01 | STT | 782–938M | ~0.47 GB | — | audio → text (30 langs + 22 dialects) | — | WER 1.7 / 4.0 (Open-ASR 6/2026) | Apache-2.0 | 2026 recommended multilingual ASR | current |
| SenseVoice-SmallAlibaba (FunAudioLLM) | 2024-07 | STT | ~234M | ~0.12 GB | — | audio → text (5 langs) + events · emotion | — | WER 3.15 / 7.18 | FunASR license (free w/ conditions) | ZH/EN/YUE/JA/KO + emotion tags | current |
| Parakeet-TDT-0.6B-v3NVIDIA | 2025-08 | STT | 627M | ~0.32 GB (q8_0 GGUF 0.71) | — | audio → text (25 EU langs) | — | WER 1.93 / 3.59 | CC-BY-4.0 | fastest EU/EN ASR on GGUF | current |
| Canary-1B-v2NVIDIA | 2025-08 | STT | 978M | ~0.49 GB | — | audio → text (25 EU langs) | — | UNVERIFIED — see card | CC-BY-4.0 | EN+DE/FR/ES ASR+translate 4L | current |
| Light-ASD (audio-visual)LHL | 2023-06 | speaker | 1.0M | ~1 MB | — | audio + video (faces) → speaker | — | mAP 94.1 (AVA-ASD) | MIT | research-only; no mobile build | research |
| pyannote/segmentation-3.0pyannote | 2023-09 | speaker | ~1.5M | ~2 MB int8 | — | audio → speech segments | — | component — see community-1 pipeline | MIT — gated (accept conditions) | segmentation block for sherpa-onnx | gated |
| Speaker-diarization 3.1 (legacy)pyannote | 2023-11 | speaker | seg 1.5M + emb 6.6M | ~33 MB | — | audio → who spoke when | — | DER 18.8 (IHM) / 22.7 (SDM) | MIT — gated (accept conditions) | supersedes nothing — use community-1 | legacy |
| Speaker-diarization community-1pyannote | 2025-04 | speaker | seg + emb | ~33 MB | — | audio → who spoke when | — | DER 17.0 (IHM) / 19.9 (SDM) | CC-BY-4.0 — gated | offline diarization reference pipeline | gated |
| WeSpeaker CAM++ (embeddings)WeNet / ModelScope | 2023 | speaker | 7.2M | ~28 MB (ONNX) | — | audio → speaker embedding | — | EER 0.66 (vox1-O) | Apache-2.0 code | building block; pair with segmentation | current |
| Sortformer-4spk-v2NVIDIA | 2025-06 | speaker | ~80M? (GGUF 147 MB) | ~0.15 GB (GGUF 147 MB) | — | audio → who spoke when (streaming, ≤4 spk) | — | DIHARD-3 19.7 † · CALLHOME 10.5 | CC-BY-4.0 | low-latency open diarization ≤4 spk | current |
| Nemotron-3-DiarizationNVIDIA | 2026-09 | speaker | 99M | ~0.1 GB (GGUF quants exist) | — | audio → who spoke when (streaming, ≤8 spk) | — | DIHARD-3 12.7 · AMI SDM 11.1 | OpenMDW-1.1 (commercial OK) | best open streaming diarizer (DIY) | current |
| MOSS-Transcribe-DiarizeOpenMOSS | 2026-05 | speaker | 0.9B | ~0.9 GB int8 | — | audio → diarized transcript (50+ langs) | — | UNVERIFIED (demo-class) | Apache-2.0 | joint ASR+diarize; not phone-proven | demo |
Glossary. WER = word error rate (lower is better) · DER = diarization error rate (lower) · EER = equal error rate (lower) · MMMU / MMLU(-Pro) = multimodal / text knowledge (higher) · INT4 size = weights only, ~0.55 GB per billion params + ~5% (excludes KV cache & runtime) · `✓` reasoning always on · `±` toggleable thinking mode · `✗` none · `—` n/a ·
*128K = config positions; card recommends lower generation length · Status: superseded = later open weights exist · legacy = kept for reproducibility · gated = free but licence conditions to accept · research / demo = not packaged for production.
† = vendor-reported. Canary-1B-v2 has a card but no clean public WER — marked UNVERIFIED rather than guessed.
what you pay
Everything here runs free once downloaded — that’s the whole point of open weights.
A few also have hosted access if you’d rather not self-serve. As of 2026-11-08 (OpenRouter prices, per million tokens prompt / completion):
| Model | Prompt | Completion |
|---|---|---|
| meta-llama/llama-3.2-1b-instruct | $0.027 | $0.201 |
| meta-llama/llama-3.2-3b-instruct | $0.05 | $0.33 |
| google/gemma-3-4b-it | $0.05 | $0.10 |
| mistralai/ministral-3b-2512 (131K ctx) | $0.10 | $0.10 |
That’s it — the rest of this list is legal-but-not-hosted or hosted elsewhere at prices set by each host. Calls/second/subsidisation change; check OpenRouter for the day’s number. Self-hosting cost ≈ $0 (electricity). There is no “API price” hiding behind an open download.
a realistic stack for STT + active speaker + image/video, multilingual
On 8GiB, on battery or on the charger, for an app that listens, watches, and knows who was talking:
- STT:
Qwen3-ASR-0.6B(30 languages + 22 dialects, leaderboard WER 1.7/4.0, Apache-2.0) — my default.Parakeet-TDT-0.6B-v3if your languages are the 25 European set and raw speed matters.Whisper-smallif you need the long tail of Whisper’s 99 languages and can afford ~2× worse accuracy. - Active speaker (reality): today = offline post-processing, not sub-second “who is talking now”. Two workable paths: sherpa-onnx on device (
pyannote/segmentation-3.0+WeSpeaker CAM++embeddings, ~30–40 MB total, seconds of latency, MIT-but-gated for the pyannote weights) — works, well trodden. Or the 2026 newcomer loop: Nemotron-3-Diarization (100M params, streaming, DIHARD-3 12.7) — best open option, but DIY GGUF; nothing plug-and-play yet. Sortformer v2 if you need ≤4 speakers over ≤30 s billing latency. True audio-visual ASD (Light-ASD) remains research-only. - Image / video processing:
MiniCPM-V-4.7-1B(OCR/document grade),Qwen3.5-2B(all-round, 256K ctx, reasoning toggle) orGemma-4-E2B(Apache-2.0, omni w/ audio-in). - Orchestration brain (routing, structuring, answering):
Qwen3.5-2BorSmolLM3-3B(both toggleable thinking). - One-model-many-jobs:
LFM3-Omni-2Bif you genuinely need audio-in and speech-out in one weights file.
If it were my build: Qwen3-ASR + Nemotron-3-Diarization + Qwen3.5-2B (orchestrator + vision). Three models, all < 1 GB each at int4/int8, all Apache/OpenMDW, all offline, none with a licence questionnaire.
running these on a phone — working notes
- Stacks that matter:
llama.cpp/whisper.cpp(GGUF, CPU/GPU/Vulkan) ·MLC LLM·ExecuTorch·sherpa-onnx(speech/Android+iOS first class) ·WhisperKit(Apple ANE) ·ONNX Runtime Mobile·MediaPipe LLM Inference·LiteRT·Core ML. - Formats: GGUF at Q4_K_M / int4. Avoid grouping-size > 64; keep Q4/int8 KV for long ctx (quantised KV matters more than quantised weights).
- iOS: ANE chops small models into a 4 GB DRAM envelope per app;
WhisperKit+Core MLfinds it. Android: NNAPI/GPU delegate where available, else CPU; watch thermal throttle on sustained STT. - Context is not free: at 256K ctx, expect GBs of KV — the cards’ “128K/256K context” is a hard ceiling, not a dial you should set. Real-world on phones: 4–32K.
- Multilingual ≠ certified: Whisper’s 99 languages is “trained on”, not “quality-checked”. For production, spot-check top-5 languages you actually touch.
exclusions and gotchas (the ones worth printing)
- Qwen2.5-VL-3B — Qwen Research License, non-commercial (the 7B is Apache-2.0). Excluded.
- canary-1b — CC-BY-NC-4.0. Use canary-1b-flash / -v2 instead (CC-BY-4.0).
- Sortformer v1 (diar_sortformer_4spk-v1) — CC-BY-NC-4.0. Use v2 (CC-BY-4.0).
- sherpa-onnx reverb-diarization-v1 (
Revai/..) — non-commercial. Don’t ship in a commercial app. - pyannote weights — technically MIT/CC-BY but gated: account + conditions, contact info flows to pyannote. Legally fine for personal use, read conditions for commercial redistribution.
- Gemma 3 / 3n — Gemma Terms of Use (not Apache). Gemma 4 moved to Apache.
- LFM3 — LFM Open License v1.0: free commercial use only under $10M annual revenue; else talk to Liquid.
- Llama 3.2 — Llama Community License, >700M MAU needs Meta’s blessing; multimodal Llama variants are EU-restricted (text models unaffected).
- Benchmarks: every
†is vendor-reported. Vendor rigs optimistic/in-house evals. Cross-vendor comparisons on the same public benchmark (e.g. Qwen3.5-vs-Gemma4 MMMU) at least use one axis per benchmark. Don’t read “97.0 MATH-500” as “superhuman at maths”. - Cards lie in both directions: sometimes the model samples a better number; sometimes they just don’t print any.
UNVERIFIEDis the honest comment.
sources
Model cards, official blogs, tech reports — no third-party comparison sites except where marked. Retrieval 2026-11-08.
- Qwen (Qwen3 blog 2025-04-29 · arXiv:2505.09388 · Qwen3.5 Feb 2026 · https://huggingface.co/Qwen · https://qwenlm.github.io/blog/qwen3/) · Qwen3-VL (arXiv:2511.21631 · https://github.com/qwenlm/qwen3-vl) · Qwen3-ASR (arXiv:2601.21337 · https://huggingface.co/Qwen/Qwen3-ASR-0.6B-hf)
- Google (Gemma 3 blog 2025-03-12 · https://arxiv.org/abs/2503.19786 · Gemma 3n guide 2025-06-26 · Gemma 4 blog 2026-04-02 · https://arxiv.org/abs/2607.02770)
- Hugging Face (SmolLM3 https://hf.co/blog/smollm3 2025-07 · SmolVLM2 https://huggingface.co/HuggingFaceTB/SmolVLM2-2.2B-Instruct)
- Microsoft (Phi-4-mini · arXiv:2503.01743 · Phi-4-mini-reasoning · arXiv:2504.21233)
- Meta (Llama 3.2 · 2024-09-25 · https://huggingface.co/meta-llama)
- NVIDIA (Parakeet-TDT-0.6B-v3 · arXiv:2509.14128 · Nemotron-3-Diarization https://huggingface.co/nvidia/Nemotron-3-Diarization · Sortformer v2 · canary-1b-v2)
- OpenBMB (MiniCPM5-2B · MiniCPM-V-4.7 · MiniCPM-OCR-1.0 · https://huggingface.co/openbmb)
- Liquid AI (LFM3 2026-10-27 · https://www.liquid.ai/blog/lfm3 · LFM3-VL-2B · LFM3-Omni-2B)
- OpenAI (Whisper family · https://huggingface.co/openai/whisper-small · large-v3-turbo)
- Distil-Whisper https://huggingface.co/distil-whisper/distil-large-v3 · Moonshine https://arxiv.org/abs/2410.15608 · SenseVoice https://arxiv.org/abs/2407.04051
- pyannote (community-1 · https://github.com/pyannote/pyannote-audio · DER table 2025-09) · WeSpeaker EER table · sherpa-onnx diarization docs · 3D-Speaker DER table
- OpenRouter context/pricing snapshot 2026-11-08 (https://openrouter.ai/api/v1/models)
How to update: this page renders the table from _data/models.yml in the site repo — update a row there, push, done. If a model goes EOL or gets beaten by something ≤4B that did happen recently, flag it with status: superseded rather than deleting the row; reproducibility beats tidiness.