# TrOCR ONNX Runtime ## Uebersicht TrOCR (Transformer-based OCR) kann sowohl mit PyTorch als auch mit ONNX Runtime betrieben werden. ONNX bietet deutlich reduzierten RAM-Verbrauch und schnellere Inferenz — ideal fuer den Offline-Betrieb auf Hardware Tier 2 (8 GB RAM). ## Export-Prozess ### Voraussetzungen - Python 3.10+ - `optimum>=1.17.0` (Apache-2.0) - `onnxruntime` (bereits installiert via RapidOCR) ### Export ausfuehren ```bash python scripts/export-trocr-onnx.py --model both ``` Dies exportiert: - `models/onnx/trocr-base-printed/` (~85 MB fp32 → ~25 MB int8) - `models/onnx/trocr-base-handwritten/` (~85 MB fp32 → ~25 MB int8) ### Quantisierung Int8-Quantisierung reduziert Modellgroesse um ~70% mit weniger als 2% Genauigkeitsverlust. ## Runtime-Konfiguration ### Umgebungsvariablen | Variable | Default | Beschreibung | |----------|---------|--------------| | `TROCR_BACKEND` | `auto` | Backend-Auswahl: `auto`, `pytorch`, `onnx` | | `TROCR_ONNX_DIR` | (siehe unten) | Pfad zu ONNX-Modellen | ### Backend-Modi - **auto** (empfohlen): ONNX wenn verfuegbar, sonst PyTorch Fallback - **pytorch**: Erzwingt PyTorch (hoeherer RAM, aber bewaehrt) - **onnx**: Erzwingt ONNX (Fehler wenn Modell nicht vorhanden) ### Modell-Pfade (Suchpfade) 1. `$TROCR_ONNX_DIR/trocr-base-{variant}/` 2. `/root/.cache/huggingface/onnx/trocr-base-{variant}/` (Docker) 3. `models/onnx/trocr-base-{variant}/` (lokale Entwicklung) ## Hardware-Anforderungen | Metrik | PyTorch float32 | ONNX int8 | |--------|-----------------|-----------| | Modell-Groesse | ~340 MB | ~50 MB | | RAM (Printed) | ~1.1 GB | ~300 MB | | RAM (Handwritten) | ~1.1 GB | ~300 MB | | Inferenz/Zeile | ~120 ms | ~40 ms | | Mindest-RAM | 4 GB | 2 GB | ## Benchmark ```bash # PyTorch Baseline (Sprint 1) python scripts/benchmark-trocr.py > benchmark-baseline.json # ONNX Benchmark python scripts/benchmark-trocr.py --backend onnx > benchmark-onnx.json ``` Benchmark-Vergleiche koennen im Admin unter `/ai/model-management` eingesehen werden. ## Verifikation Der Export-Script verifiziert automatisch, dass ONNX-Output weniger als 2% von PyTorch abweicht. Manuelle Verifikation: ```python # Im Container python -c " from services.trocr_onnx_service import is_onnx_available, get_onnx_model_status print('Available:', is_onnx_available()) print('Status:', get_onnx_model_status()) " ```