LiquidAI/LFM2.5-1.2B-Instruct
Run locally on Apple devices with Mirai
- Type
- local
- From
- LiquidAI
- Quantization
- No
- Parameters
- 1.2B
- Size
- 2.2 GB

LFM2.5-1.2B-Instruct is a compact, instruction-tuned language model from Liquid AI, purpose-built for on-device deployment. Part of the LFM2.5 family, it delivers surprisingly strong performance from just 1.17 billion parameters — rivaling much larger models while running under 1GB of memory.
Architecture & Training
The model uses a hybrid architecture combining 10 double-gated LIV convolution blocks with 6 grouped-query attention (GQA) blocks across 16 layers. It supports a 32,768-token context window and a vocabulary of 65,536 tokens. Pre-training was extended from 10T to 28T tokens, followed by large-scale multi-stage reinforcement learning. The knowledge cutoff is mid-2024.

Capabilities
LFM2.5-1.2B-Instruct excels at agentic tasks, data extraction, and RAG workflows. It supports eight languages — English, Arabic, Chinese, French, German, Japanese, Korean, and Spanish — and includes built-in function calling with Pythonic tool-use syntax. The model is best suited for structured tasks rather than knowledge-intensive queries or programming.
Edge-First Performance
Speed is a defining feature. The model achieves 239 tok/s decode on AMD CPU and 82 tok/s on mobile NPU, with day-one support for llama.cpp, MLX, vLLM, and Transformers. Quantized variants (GGUF, ONNX, MLX) are available for optimized deployment across cloud, desktop, and mobile environments.

Benchmarks at a Glance
Among sub-2B models, LFM2.5-1.2B-Instruct leads on GPQA (38.89), MMLU-Pro (44.35), IFEval (86.23), and AIME25 (14.00), outperforming Qwen3-1.7B, Granite 4.0-1B, Llama 3.2-1B, and Gemma 3-1B across most benchmarks.
Fine-Tuning
The model supports fine-tuning via Unsloth and TRL, including SFT, DPO, GRPO, and continued pre-training — making it highly adaptable for domain-specific use cases.
spm https://github.com/trymirai/uzu.git
| 1 | import Uzu |
| 2 | |
| 3 | public func runChat() async throws { |
| 4 | let engineConfig = EngineConfig.create() |
| 5 | let engine = try await Engine.create(config: engineConfig) |
| 6 | |
| 7 | guard let model = try await engine.model(identifier: "LiquidAI/LFM2.5-1.2B-Instruct") else { |
| 8 | return |
| 9 | } |
| 10 | for try await update in try await engine.download(model: model).iterator() { |
| 11 | print("Download progress: \(update.progress())") |
| 12 | } |
| 13 | |
| 14 | let messages = [ |
| 15 | ChatMessage.system().withText(text: "You are a helpful assistant"), |
| 16 | ChatMessage.user().withText(text: "Tell me a short, funny story about a robot") |
| 17 | ] |
| 18 | let session = try await engine.chat(model: model, config: .create()) |
| 19 | let stream = await session.replyWithStream(input: messages, config: .create()) |
| 20 | var message: ChatMessage? = nil |
| 21 | for try await update in stream.iterator() { |
| 22 | switch update { |
| 23 | case .replies(let replies): |
| 24 | message = replies.last?.message |
| 25 | case .error(let error): |
| 26 | print("Error: \(error)") |
| 27 | } |
| 28 | } |
| 29 | print("Text: \(message?.text() ?? "empty")") |
| 30 | } |