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.
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:
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.
| Part | What 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 disk | 3.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.
| Metric | Score |
|---|---|
| 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.
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.
$ 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.