mlx-optiq
Release · August 3, 2026

Mage-VL: our first video model, on a Mac

Mage-VL is Microsoft's 5B vision-language model, and it reads video as well as still images. It is the first video model in the OptiQ lineup. We quantized it, and it runs on an ordinary Mac with no PyTorch and no cloud. On disk it is 3.7 GB.

Mage-VL pairs a from-scratch visual encoder, Mage-ViT, with a Qwen3-4B language model. Point it at a photo and it describes the photo. Hand it a few frames from a clip and it tells you what is going on. Both go through the same checkpoint.

A dog sitting on a patterned rug, the demo image Mage-VL was asked to describe
The demo image from Mage-VL's model card. The caption below is what the quantized model returned.

What it does

Two runs, both through the quantized model on Apple Silicon with MLX only. First the still image above:

A dog is sitting on a rug in front of a patterned rug.

Then a short video. We sampled six frames from a soccer broadcast and asked what was happening:

Three frames sampled from a soccer broadcast, the video given to Mage-VL
Three of the six frames we sampled from the clip.
A man is reporting on a soccer game.

Neither of these is a hard example, and that is the point. A 5B model, quantized to under 4 GB, gets the gist of a picture and a clip while running on a laptop.

How we quantized it

Mage-VL uses the same sidecar pattern as the rest of the OptiQ vision lineup. OptiQ quantizes only the language tower, to mixed 4- and 8-bit precision. The Mage-ViT vision tower stays at bf16 in a separate file, optiq_vision.safetensors, that rides alongside the quantized shards. mlx-lm globs model*.safetensors when it loads, so it never picks up the sidecar. The same published repo loads text-only under stock mlx-lm and full vision under OptiQ.

Stock mlx-lm has no class for this architecture, so we vendored the vision tower as a native MLX port. There is no mlx-vlm runtime dependency. import optiq registers the architecture and loads the sidecar. We checked the port against the reference tower, and the outputs match to a maximum absolute difference of 1.7e-3 in float32. The quant runs the real encoder, not an approximation of it.

PartWhat OptiQ does
Language tower (Qwen3-4B)Mixed 4/8-bit, 164 layers at 4-bit and 90 at 8-bit, 5.90 bits per weight, 3.0 GB
Vision tower (Mage-ViT)Kept at bf16 in the sidecar, 297 tensors, 0.63 GB
On disk3.7 GB total

Video is frames

Mage-VL handles video as sampled frames. Pick some frames evenly across the clip, feed them in as images, and the model reasons over the sequence. The base repo ships an optional neural codec, DCVC, for compressing frames, but the quant does not need it. Uniform frame sampling is enough to caption a clip and answer questions about it.

Capability Score

The images and video above cover the vision side. For the language side we run the standard OptiQ six-metric eval, the same one every quant we ship goes through. The language tower scores 70.27, which is strong for a 4B. It does function calling well once the tools are in the prompt. Long-context multi-hop retrieval is the weak spot.

MetricScore
MMLU (5-shot, 969 samples)74.6%
GSM8K (1000 samples)88.7%
IFEval (full set, strict)68.6%
BFCL-V3 simple (200 calls)88.5%
HumanEval (164 problems, pass@1)76.2%
HashHop (long-context retrieval)25.0%
Capability Score (mean of 6)70.27

Run it

Text generation loads straight through mlx-lm once OptiQ has registered the architecture.

hello.pypython
import optiq  # registers the mage_vl arch + vision sidecar
from mlx_lm import load, generate

model, tok = load("mlx-community/Mage-VL-OptiQ-4bit")
print(generate(model, tok, prompt="Hello", max_tokens=100))

For images and video, serve the model and send an image, or sampled video frames, as image_url content.

serve.shbash
$ optiq serve --model mlx-community/Mage-VL-OptiQ-4bit

The quant is on the Hub as mlx-community/Mage-VL-OptiQ-4bit. The full setup, the Capability Score, and the image and video walkthrough are in the Mage-VL guide. It needs OptiQ 0.4.8 or newer.