OCR на GPU: потоковые документы и кириллица
Задача страницы. Практический гайд по построению OCR‑сервисов на облачных GPU: онлайн‑распознавание потоков документов (сканы, фото, PDF), пакетная обработка архивов, поддержка кириллицы, верстки со сложным макетом (много колонок, таблицы), профили производительности/VRAM, оркестрация, наблюдаемость и стоимость.
TL;DR
- Онлайн: держите воркеры на on‑demand, p95‑латентность на страницу < 300–800 мс (зависит от разрешения/макета).
- Пакеты/архивы: используйте interruptible с чанкованием ≤ 2 мин/пакет и локальным NVMe‑кэшем.
- Кириллица: стабилизируйте качество через нормализацию, анти‑скош, правильный DPI, layout‑детекцию и языковые пост‑процедуры (склейка переносов/номеров).
Смежные разделы: CV‑хаб — https://cloudcompute.ru/solutions/computer-vision/, детекция/сегментация — https://cloudcompute.ru/solutions/computer-vision/yolo/ и https://cloudcompute.ru/solutions/computer-vision/sam/, эмбеддинги/поиск — https://cloudcompute.ru/solutions/computer-vision/dinov2/, стриминг — https://cloudcompute.ru/solutions/llm-inference/streaming/, хранение — https://cloudcompute.ru/solutions/storage-data/, эксплуатация — https://cloudcompute.ru/solutions/performance-tuning/ и https://cloudcompute.ru/solutions/throughput-vs-latency/, стоимость — https://cloudcompute.ru/solutions/cost-planner/, мониторинг — https://cloudcompute.ru/solutions/monitoring-logging/ и https://cloudcompute.ru/solutions/llm-inference/observability/.
Сценарии использования
- Док‑потоки: входящие договора, счета, ТТН, чеки; распознаём в режиме «почти онлайн», выдаём JSON.
- Мобильные фото: документы под углом/с бликами: нужен авто‑дескью, детекция границ, коррекция перспективы.
- PDF‑архивы: миллионы страниц — планируем пакетами и пулы interruptible.
- Таблицы и формы: извлекаем структуру, поля/значения, нормализуем номера/даты/суммы.
- Классификация документов: по обложке/верстке (эмбеддинги) → маршрут в нужный парсер. См. DINOv2: https://cloudcompute.ru/solutions/computer-vision/dinov2/
Пайплайн OCR (обзор)
Ингест (PDF/изобр/поток)
→ Рендер/Декод (DPI/страницы)
→ Препроцесс (дескью, бинаризация, шумы)
→ Layout (колонки/таблицы/заголовки/ROI)
→ Text OCR (строки/слова, кириллица/латиница)
→ Пост‑проц (склейка переносов, орфо‑нормы, валидаторы)
→ Экспорт (JSON/ALTO/CSV/парсинг полей)
→ Метрики/Логи/Отчёты
Layout‑детекция (страницы, колонки, таблицы, заголовки) критична для кириллицы (узкие буквы/лигатуры, переносы). Для сложных макетов используйте ROI‑маски (см. https://cloudcompute.ru/solutions/computer-vision/sam/) и/или детектор блоков (см. https://cloudcompute.ru/solutions/computer-vision/yolo/).
Кириллица: что влияет на точность - DPI/масштаб: 220–300 DPI для сканов А4; для фото — масштаб по высоте текстовой строки 24–40 px.
- Дескью: коррекция наклона/перспективы перед OCR (особенно важна для печатей/таблиц).
- Бинаризация/дешум: мягкая, чтобы не «съесть» тонкие штрихи (л/т/ш/и).
- Переносы: объединять «сло‑ва» по шаблонам; нормализовать «№», «–», «—», кавычки.
- Языковые профили: ru, uk, kk, bg и т. п.; включать числовые/валютные классы.
- Шрифты/поля: моноширинные таблицы и печати распознаются лучше при усиленном контрасте.
Режимы: онлайн vs пакетный
| **Режим** | **Когда** | **Цели/SLA** | **Ресурсы** |
| **Онлайн (near‑real‑time)** | Почта, чат‑боты, порталы, KYC‑проверки | p95 < 300–800 мс/страница | **On‑demand**, прогретые модели, NVMe‑кэш |
| **Batch (архивы)** | Миллионы страниц, оцифровка | pages/min, **Cost\_per\_1000** | **Interruptible**, чанк ≤ 2 мин, отчёты |
Паттерны для прерываемых пулов — https://cloudcompute.ru/solutions/interruptible-patterns/ • очереди и батчи — https://cloudcompute.ru/solutions/image-video-gen/batch-render/
Профили GPU, VRAM и ориентиры скорости
Оценки для fp16/bf16, 220–300 DPI, страницу A4 рендерим в 1700–2200 px по меньшей стороне, прогретые веса.
| **Профиль** | **Онлайн (стр./мин, p95<800 мс)** | **Batch (стр./мин)** | **Комментарии** |
| **24 ГБ (Compact)** | 60–120 | 1 500–3 000 | Базовые OCR+layout, очереди малой глубины |
| **48 ГБ (Balanced)** | 120–240 | 3 000–6 000 | Параллелизм по страницам/моделям |
| **80 ГБ (HQ)** | 200–400 | 6 000–10 000 | Сложные макеты, много таблиц/колонок |
Фактический throughput зависит от доли страниц с таблицами, разрешения и глубины препроцесса. Тюнинг — https://cloudcompute.ru/solutions/performance-tuning/ Форматы ввода/вывода и структура данных
Вход: PDF, TIFF, PNG/JPEG, zip‑пакеты. Выход:
- JSON (структурный) — блоки/строки/слова/координаты/уверенности.
- ALTO XML — страницы/блоки/строки.
- CSV — плоские данные (например, таблицы/поля).
- Кастом (KYC/инвойсы) — набор полей с валидацией (сумма, дата, ИНН и т. п.).
Хранилище и слои «горячее/тёплое/холодное» — https://cloudcompute.ru/solutions/storage-data/
Экстракция таблиц и форм
- Таблицы: детектор таблиц → пост‑проц (линии/ячейки) → OCR строк/ячеек → нормализация чисел/валют.
- Формы: layout‑шаблоны, ключ‑значение, регулярные проверки (ИНН, дата, номер).
- Выравнивание: для сканов под углом применяйте перспективную коррекцию до выделения таблиц.
Конфиг пайплайна (пример YAML)
pipeline: ocr-ru-pipeline
input:
source: s3://docs/incoming/
formats: [pdf, tiff, jpg, png]
render:
dpi: 260
max_pages: 500
preprocess:
deskew: true
dewarp: auto
denoise: mild
layout:
detector: layout_blocks_v1
tables: true
ocr:
lang: [ru, en]
precision: fp16
batch_pages: 4
postprocess:
hyphen_merge: true
normalize_quotes: true
money_phone_date: true
export:
formats: [json, csv]
path: s3://docs/parsed/
runtime:
mode: online # online | batch
sla_p95_ms: 800
retries: 2
nvme_cache: true
API‑скелет OCR сервиса (стриминг прогресса)
# fastapi_ocr.py — укороченный пример
from fastapi import FastAPI, UploadFile
from fastapi.responses import StreamingResponse
import json, base64, asyncio
app = FastAPI()
def ocr_bytes(pdf_or_image_bytes):
# ... рендер/препроц/layout/ocr/postproc на GPU ...
return {"pages":[{"text":"...", "blocks":[...]}]}
@app.post("/v1/ocr_stream")
async def ocr_stream(file: UploadFile):
data = await file.read()
async def gen():
yield "event: startndata: {}nn"
# можно слать прогресс по страницам
result = ocr_bytes(data)
yield "data: " + json.dumps(result, ensure_ascii=False) + "nn"
yield "event: donendata: [DONE]nn"
return StreamingResponse(gen(), media_type="text/event-stream",
headers={"Cache-Control":"no-cache","X-Accel-Buffering":"no"})
Стриминг/прогресс — https://cloudcompute.ru/solutions/llm-inference/streaming/ Сервинг/ансамбли (рендер→layout→OCR→постпроц) — https://cloudcompute.ru/solutions/triton-inference-server/ UI/API‑демо — https://cloudcompute.ru/solutions/gradio-fastapi/
Наблюдаемость и метрики
Собирайте (см. https://cloudcompute.ru/solutions/monitoring-logging/ и https://cloudcompute.ru/solutions/llm-inference/observability/):
- Технические: p50/p95 latency на страницу, pages/min, GPU util/HBM, VRAM пик, cache‑hit NVMe, ошибки рендера PDF.
- Качество: CER/WER, доля «склейки» переносов, точность табличного парсинга, доля пустых/ошибочных страниц.
- Сервисные: очередь ожидания, таймауты, ретраи, доля брак‑страниц.
Алерты: рост p95, падение pages/min, всплеск ошибок рендера, CER/WER выше порога.
Экономика и расчёты
Пусть t_page — среднее время обработки страницы, c_gpu — цена GPU/час.
Pages_per_hour ≈ 3600 / t_page
Cost_per_1000_pages ≈ (c_gpu × Num_GPU) / (Pages_per_hour / 1000)
Для batch добавьте накладные I/O/рендера (PDF→изображения) и ретраи. Сравнение on‑demand vs interruptible — https://cloudcompute.ru/solutions/cost-planner/ и https://cloudcompute.ru/solutions/interruptible-patterns/
Экспорт полей и валидация
- Нормализация: даты (ISO), суммы (десятичный разделитель), номера (ИНН/ОГРН), телефоны.
- Правила: маскирование чувствительных полей в логах/превью.
- Сопоставление: эмбеддинги для поиска дубликатов документов/страниц — см. https://cloudcompute.ru/solutions/computer-vision/dinov2/
Операционные паттерны
- Batch (interruptible): индексация и переиндексация датасетов, дедуп — см. https://cloudcompute.ru/solutions/interruptible-patterns/
- Онлайн (on‑demand): поиск и рекомендации с низкой латентностью, горячий кэш эмбеддингов.
- Кэширование: LRU по запросам и по item_id; храните эмбеддинги в fp16/int8, а модель — в fp16/bf16.
- A/B и версии: распараллельте индексы v1/v2, не ломая прод.
Безопасность и политика
- PII: маскирование/редактирование в логах и предпросмотрах; шифрование выгрузок.
- Доступ к источникам (почта/S3/FTP/порталы) по ключам/ролям; контроль ретеншна и географии данных.
Белые списки моделей/версий; параметры ограничений (макс. DPI/размер, макс. страницы). Подробнее — https://cloudcompute.ru/solutions/security/ и https://cloudcompute.ru/solutions/llm-inference/guardrails/
Траблшутинг
| **Симптом** | **Причина** | **Что сделать** |
| «Крошится» кириллица | Низкий DPI/шум/переконтраст | Повысить DPI/мягкий денойз, улучшить дескью |
| Склейка колонок | Нет layout‑детекции | Включить детектор блоков/ROI‑маски |
| Ошибки в числах/датах | Нет пост‑валидации | Включить нормализацию и проверку шаблонов |
| Медленно на PDF‑сканах | Узкое место рендер‑движка | Параллелить рендер, кэш страниц на NVMe |
| Падение точности на фото | Перспектива/блики | Усилить дескью/де‑варп, локальная коррекция контраста |
| OOM на многостраничных | Слишком высокий batch/DPI | Снизить batch, добавить стриминг страниц |
Как запустить в cloudcompute.ru
Готовые шаблоны — https://cloudcompute.ru/solutions/templates/
- “OCR‑Online (RU)” — on‑demand, рендер PDF→страницы, layout+OCR, JSON‑выдача, SSE‑прогресс.
- “OCR‑Batch (Archives)” — interruptible, чанк ≤ 2 мин, отчёты по качеству/стоимости.
- “OCR‑Tables/Forms” — детектор таблиц/форм, извлечение полей, CSV/JSON‑экспорт.
Инфраструктура: тюнинг — https://cloudcompute.ru/solutions/performance-tuning/ • хранение — https://cloudcompute.ru/solutions/storage-data/ • наблюдаемость — https://cloudcompute.ru/solutions/monitoring-logging/ • сервинг — https://cloudcompute.ru/solutions/triton-inference-server/ • CI/CD — https://cloudcompute.ru/solutions/containers-ci-cd/
Чек‑лист перед продом
- Определён режим: онлайн vs batch; SLA по p95 и pages/min.
- Выбраны DPI/разрешение и профиль GPU (24/48/80 ГБ).
- Настроены дескью/де‑варп/layout, профили для кириллицы и пост‑нормализация.
- Подключены метрики/алерты/трейсинг; отчёты по CER/WER и табличной точности.
- Рассчитан Cost_per_1000_pages; выбран режим on‑demand/interruptible.
- Настроены безопасность, ретеншн, белые списки моделей/версий.
Навигация по разделу «Компьютерное зрение»
Хаб: https://cloudcompute.ru/solutions/computer-vision/ • Детекция: https://cloudcompute.ru/solutions/computer-vision/yolo/ • Интерактивная сегментация: https://cloudcompute.ru/solutions/computer-vision/sam/ • Эмбеддинги/поиск: https://cloudcompute.ru/solutions/computer-vision/dinov2/ • Видео‑аналитика: https://cloudcompute.ru/solutions/computer-vision/video-analytics/ • ReID/треккинг: https://cloudcompute.ru/solutions/computer-vision/tracking/ • Экспорт на edge: https://cloudcompute.ru/solutions/computer-vision/edge-export/ • Инфраструктура: https://cloudcompute.ru/solutions/performance-tuning/ • https://cloudcompute.ru/solutions/storage-data/ • https://cloudcompute.ru/solutions/monitoring-logging/ • https://cloudcompute.ru/solutions/llm-inference/observability/ • https://cloudcompute.ru/solutions/cost-planner/ • https://cloudcompute.ru/solutions/interruptible-patterns/ • https://cloudcompute.ru/solutions/throughput-vs-latency/ • Сервинг: https://cloudcompute.ru/solutions/triton-inference-server/ • UI/API: https://cloudcompute.ru/solutions/gradio-fastapi/ • CI/CD: https://cloudcompute.ru/solutions/containers-ci-cd/
Готовы запустить?
Запустить GPU-сервер