Unlimited-OCR — Baidu взяла идею DeepSeek OCR, починила её главный потолок и обогнала оригинал
Осенью DeepSeek показала фокус, от которого у инженеров поехала крыша: страницу документа можно не «читать» токен за токеном, а сжать в горстку визуальных токенов и скормить модели как картинку. В десять раз меньше токенов на ту же страницу. Звучало как чит. Но потолок был: KV-кэш всё равно рос с длиной вывода, и на многостраничных документах всё упиралось в память и контекст.
22 июня Baidu выложила Unlimited-OCR и закрыла ровно эту дыру. 3 миллиарда параметров (500 миллионов активных), MIT-лицензия, и главное: KV-кэш больше не растёт. Сорок страниц за один проход, а память стоит на месте.
TL;DR: Unlimited-OCR от Baidu — open-source OCR-модель на 3B (500M активных, MoE), которая парсит 40+ страниц за один forward pass в окне 32K. Фишка тут в Reference Sliding Window Attention (R-SWA): декодер держит только 128 последних токенов плюс полный визуальный референс, поэтому KV-кэш постоянный. По замерам Baidu бьёт DeepSeek OCR на OmniDocBench v1.5 на 6+ пунктов (93.23 против 87.01). Репо на GitHub уже собрало 6.8K звёзд.
В чём, собственно, трюк
Обычный VLM при распознавании документа ведёт себя как генеративная модель: каждый новый токен видит всё, что сгенерировано раньше. KV-кэш растёт линейно с длиной вывода. Распарси одну страницу, и всё нормально. Закинь сорок, и кэш разбухает, латентность ползёт вверх, память кончается. Поэтому DeepSeek OCR при всей гениальности компрессии всё равно жевал документы постранично.
R-SWA выкидывает это ограничение. Декодер держит скользящее окно из 128 последних токенов и при этом сохраняет полный доступ к визуальному референсу (сжатым токенам страниц). Текстовый контекст ограничен, а картинка целиком нет. KV-кэш становится константным независимо от того, парсите вы одну страницу или сорок. Память не двигается. Вот за счёт чего «one-shot long-horizon parsing» из названия вообще возможен.
Энкодер при этом унаследован от DeepSeek-OCR: связка SAM + CLIP (тот самый DeepEncoder), которая сжимает страницу примерно в 16 раз. Новое здесь именно в декодере.

Цифры и сколько им верить
По замерам Baidu на OmniDocBench v1.5 картина такая:
- Unlimited-OCR — 93.23 общий балл
- DeepSeek-OCR — 87.01 (та самая база, от которой форкнулись)
- Qwen3-VL 235B — 89.15 (модель в 78 раз больше по параметрам)
В деталях разрыв ещё нагляднее: text edit distance 0.038 против 0.073 у DeepSeek (вдвое меньше ошибок), формулы по CDM 92.61 против 83.37, таблицы по TEDS 90.93 против 84.97. На свежем OmniDocBench v1.6 это 93.92, текущий SOTA. По скорости Baidu заявляет +12.7% TPS и до +35% на длинных выводах в 6000 токенов.
Теперь важное: все эти числа дала сама Baidu. Независимого аудита на OmniDocBench пока нет. И когда CodeSOTA прогнала слепые тесты на сложных, замусоренных документах, Mistral OCR выигрывал примерно в 72% случаев. На чистых структурированных PDF Unlimited-OCR блистает, а на факсовом качестве и шуме всё не так однозначно. Держите это в голове, прежде чем выкидывать текущий пайплайн.
Запускаем за пять минут
Модель лежит на HuggingFace, весит 6.78 ГБ в BF16 и заводится через обычный transformers:
from transformers import AutoModel, AutoTokenizer import torch name = "baidu/Unlimited-OCR" tokenizer = AutoTokenizer.from_pretrained(name, trust_remote_code=True) model = AutoModel.from_pretrained( name, trust_remote_code=True, use_safetensors=True, torch_dtype=torch.bfloat16, ).eval().cuda() # одиночная плотная страница, максимум деталей — режим gundam model.infer(tokenizer, prompt="<image>document parsing.", image_file="page.jpg", output_path="out/", base_size=1024, image_size=640, crop_mode=True, max_length=32768)
На выходе получаете Markdown с сохранённым порядком чтения, таблицы в HTML, формулы в LaTeX, при желании bbox-координаты для разметки. Обратите внимание на trust_remote_code=True: вы запускаете кастомный код модели прямо с Hub, так что для продакшена сначала загляните, что там внутри. Для нагрузки есть SGLang-сервер с OpenAI-совместимым эндпоинтом, для машины без видеокарты годятся GGUF-кванты на 2–5 ГБ, но на CPU инференс медленный.
Один момент про режимы. Base (1024×1024) пакует несколько страниц в один проход, это и есть то самое многостраничное чудо. Gundam работает с динамическим разрешением на одной странице и вытягивает мелкий шрифт. Одновременно «и батч страниц, и максимальная детализация» не бывает: выбираете под задачу.
А кто это вообще написал
Технический директор проекта подписан только как «YY». Китайская пресса почти сразу предположила, что это Вэй Хаожань, человек, который в одиночку построил всю OCR-линию DeepSeek, включая архитектуру DeepEncoder. Из DeepSeek он ушёл, когда в апреле вышла V4, и куда именно, не сообщалось. Если догадка верна, почти бесшовная преемственность между Unlimited-OCR и DeepSeek OCR перестаёт быть загадкой: автор просто продолжил свою же работу под новым флагом.
Подводные камни
32K всё ещё потолок. KV-кэш константный, да, но префилл (сами визуальные токены страниц) в окно 32K по-прежнему упирается. Сорок страниц — это для разреженной вёрстки. Натолкаете плотных таблиц и мелкого текста, и реальный лимит просядет. «Unlimited» в названии про память декодера, а не про бесконечный вход.
Нет confidence-скоринга. Модель не говорит, в каких полях она не уверена. Для счетов и накладных, где ошибка в цифре стоит денег, это больно: вы не получаете сигнала «вот тут перепроверь руками».
Языков меньше, чем кажется. Заявлено 40+ языков с упором на CJK (китайский, японский, корейский). У Mistral OCR их 170. Если у вас документы на длинном хвосте языков, Unlimited-OCR может спотыкаться.
Бенчмарки вендорские. Повторюсь, потому что это критично: SOTA-числа на OmniDocBench от Baidu, без независимой проверки. А в слепых тестах на грязных сканах Mistral пока впереди.
Альтернативы
- DeepSeek-OCR — та самая база, которую Unlimited-OCR форкнула и обошла на ~6 пунктов. Open-weight, более обкатанная сообществом. Берите, если хотите «оригинал» и не гонитесь за многостраничным проходом.
- Mistral OCR 4 — не open-weight, только API. Зато 170 языков, корпоративные SLA, аудит-логи и победа в слепых тестах на тяжёлых документах. Вариант «заплатить за страницу и не держать инфраструктуру».
- Surya OCR 2 — всего 650M параметров, заточена под слабое железо и edge. Если вам нужен OCR на ноутбуке или в мобильном сценарии, а не SOTA-точность, Surya логичнее.
Вердикт
Если вы строите self-hosted пайплайн на чистых структурированных документах (счета, научные статьи, таблицы), особенно с CJK, и хотите парсить целые документы за один проход на одной 12–24 ГБ видеокарте под MIT, ставьте сегодня: выигрыш в памяти и скорости реальный. Если вам нужны 170 языков, confidence-скоринг из коробки или максимальная точность на факсовом мусоре, берите Mistral и не мучайтесь. А SOTA-числа держите под подозрением, пока кто-то независимый не перепроверит OmniDocBench: на сложных сканах слепые тесты пока голосуют за конкурента.
Как попробовать
- Поставьте окружение:
pip install torch torchvision transformers pillow einops pymupdf(питон 3.12, CUDA 12.x). - Стяните
baidu/Unlimited-OCRс HuggingFace и прогоните сниппет выше на одной странице PDF в режиме gundam, убедитесь, что Markdown на выходе адекватный. - Для многостраничного парсинга переключитесь в base-режим (
base_size=1024,crop_mode=True) и закиньте документ целиком. - Нужна пропускная способность — поднимите SGLang-сервер из репозитория и дёргайте через OpenAI-совместимый эндпоинт. Без GPU берите GGUF-квант и llama.cpp, но real-time не ждите.
- Перед продакшеном прогоните свои реальные документы рядом с DeepSeek-OCR или Mistral: бенчмарки вендорские, а ваши данные единственный честный тест.
Весь код, веса и примеры лежат в репозитории github.com/baidu/Unlimited-OCR.