FastAPI service wrapping the Surya-OCR-2 model (datalab-to) served through vLLM: legacy /v1/api/ai/* endpoints, an OpenAI-compatible /v1/chat/completions endpoint, a coalescing request batcher, a local OCR CLI, Docker packaging, multilingual example outputs, and quantization/concurrency benchmarks. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
49 lines
1.5 KiB
Python
49 lines
1.5 KiB
Python
from typing import Optional
|
|
|
|
|
|
from surya.common.load import ModelLoader
|
|
from surya.logging import get_logger
|
|
from surya.ocr_error.model.config import DistilBertConfig
|
|
from surya.ocr_error.model.encoder import DistilBertForSequenceClassification
|
|
from surya.ocr_error.tokenizer import DistilBertTokenizer
|
|
from surya.settings import settings
|
|
|
|
logger = get_logger()
|
|
|
|
|
|
class OCRErrorModelLoader(ModelLoader):
|
|
def __init__(self, checkpoint: Optional[str] = None):
|
|
super().__init__(checkpoint)
|
|
|
|
if self.checkpoint is None:
|
|
self.checkpoint = settings.OCR_ERROR_MODEL_CHECKPOINT
|
|
|
|
def model(
|
|
self,
|
|
device=settings.TORCH_DEVICE_MODEL,
|
|
dtype=settings.MODEL_DTYPE,
|
|
attention_implementation: Optional[str] = None,
|
|
) -> DistilBertForSequenceClassification:
|
|
if device is None:
|
|
device = settings.TORCH_DEVICE_MODEL
|
|
if dtype is None:
|
|
dtype = settings.MODEL_DTYPE
|
|
|
|
config = DistilBertConfig.from_pretrained(self.checkpoint)
|
|
model = (
|
|
DistilBertForSequenceClassification.from_pretrained(
|
|
self.checkpoint,
|
|
dtype=dtype,
|
|
config=config,
|
|
)
|
|
.to(device)
|
|
.eval()
|
|
)
|
|
|
|
return model
|
|
|
|
def processor(
|
|
self, device=settings.TORCH_DEVICE_MODEL, dtype=settings.MODEL_DTYPE
|
|
) -> DistilBertTokenizer:
|
|
return DistilBertTokenizer.from_pretrained(self.checkpoint)
|