llama.cpp b9963 fixes DeepSeek-OCR v1 multi-tile tiling
Build b9963 lands proper multi-tile support for DeepSeek-OCR v1 with dynamic resolution, and unifies the image preprocessor for both v1 and v2. Multi-column documents now handled correctly.
Build b9963, released today, adds multi-tile dynamic resolution for DeepSeek-OCR v1 in llama.cpp, and unifies the image preprocessor across both v1 and v2. The tile-drop bug and multi-row/column image handling are fixed in the same release.
This matters because before these patches, pointing the model at a dense multi-column document (a scanned invoice, a two-column PDF page) would produce garbage or silently drop tiles. Now the model actually sees the whole image. GGUF quantizations are available on Hugging Face: the sabafallah/DeepSeek-OCR-GGUF repo offers Q4_K_M and Q8_0 builds (Q4_K_M weighs in around 1.95GB), and a BF16 variant for full precision. The model is 3B parameters, so the VRAM floor is low: though the source material doesn’t pin an exact number, a mid-range consumer card should be fine. You run it through llama-mtmd-cli with --chat-template deepseek-ocr, pass your image with --image, and prompt with something like <|grounding|>Convert the document to markdown. Note one real caveat: the bounding-box Locate prompt mode needs the f16 model; Q4_K_M loops on that specific mode. For straight document-to-Markdown OCR, Q4_K_M works.
Local multimodal OCR has been on the wishlist for a while. DeepSeek-OCR with working multi-tile support is the version that’s actually usable on real documents.