Unlimited-OCR-RDNA4 / README.md
dougvk's picture
Correct runtime model-tree metadata
ec3267c verified
|
Raw
History Blame Contribute Delete
9.33 kB
---
pipeline_tag: image-text-to-text
license: mit
tags:
- rocm
- amd
- rdna4
- gfx1201
- ocr
- runtime
---
# Unlimited-OCR RDNA 4
Single-GPU [Baidu Unlimited-OCR](https://huggingface.co/baidu/Unlimited-OCR) inference for AMD RDNA 4
(`gfx1200` / `gfx1201`) using native ROCm PyTorch, verified end to end on `gfx1201`.
This project does **not** redistribute or rename Baidu's weights. It provides a reproducible runtime around the original
BF16 checkpoint: an isolated AMD wheel bootstrap, pinned model preparation, audited custom-code patching, single-GPU
selection, local-only model resolution during inference, atomic output, bounded PDF handling, diagnostics, and
validation evidence.
> Status: beta. Verified on 31 July 2026 with an AMD Radeon RX 9070 XT (`gfx1201`). This is not an AMD or Baidu project.
## Verified configuration
| Component | Verified value |
|---|---|
| GPU | AMD Radeon RX 9070 XT, 16 GB |
| GPU allocation | One isolated GPU |
| OS | Ubuntu 24.04.4 |
| Kernel | 6.17.0-40-generic |
| Host ROCm | 7.2.1 |
| PyTorch | 2.9.1 + ROCm 7.2.1 |
| Transformers | 4.57.1 |
| Matplotlib | 3.10.8 |
| Model revision | `07dea832e22aefee32ad281d4b80551282e1c168` |
| Weight precision | Original BF16; no quantization |
| Peak allocated VRAM | 8.25 GiB on the 1600×2000 validation page |
The initial validation recovered headings, reading order, a structured table, euro amounts, a formula, and an exact
checksum. Repeated greedy generation was byte-identical after deterministic tag cleanup. See
[docs/VALIDATION.md](docs/VALIDATION.md) for the evidence and its limits.
## Quick start
The bootstrap downloads checksum-pinned AMD ROCm wheels into your XDG cache, installs every other runtime/build
dependency from `requirements/bootstrap.lock` with hashes required, builds this checkout without build isolation, and
creates a repository-local virtual environment. It does not use `sudo`, alter `/opt/rocm`, or touch the system Python.
```bash
git clone https://huggingface.co/dougvk/Unlimited-OCR-RDNA4
cd Unlimited-OCR-RDNA4
./scripts/bootstrap-rocm.sh
.venv/bin/unlimited-ocr-rdna4 prepare
.venv/bin/unlimited-ocr-rdna4 run --input page.png
```
The model download is approximately 6.78 GB. The verified AMD wheel set is approximately 1.9 GB before installation.
PDFs are rendered and parsed page by page:
```bash
.venv/bin/unlimited-ocr-rdna4 run \
--input document.pdf \
--output document.md \
--max-pages 10 \
--dpi 200
```
## Commands
### `prepare`
Downloads the pinned original checkpoint, fully hashes the 6.67 GB safetensors file and every behavior-defining model,
configuration, tokenizer, and index file, preserves Baidu's original model source, and applies a narrowly scoped audited
patch.
```bash
unlimited-ocr-rdna4 prepare
unlimited-ocr-rdna4 prepare --dry-run --json
unlimited-ocr-rdna4 prepare --model-dir /data/models/unlimited-ocr
```
Preparation is serialized and idempotent. It uses a unique partial directory, validates the exact manifest and file set,
and refuses unknown, extra, symlinked, or mismatched files instead of executing them.
### `doctor`
Reports the active PyTorch/HIP stack, visible devices, RDNA 4 architecture, BF16 capability, and model readiness.
```bash
unlimited-ocr-rdna4 doctor
unlimited-ocr-rdna4 doctor --device 0 --require-model
unlimited-ocr-rdna4 doctor --json
```
### `run`
Parses one image or PDF and publishes untrusted model output atomically. The content may include Markdown and raw HTML;
do not render it in a privileged origin without sanitization.
```bash
unlimited-ocr-rdna4 run --input scan.png
unlimited-ocr-rdna4 run --input scan.png --output scan.md --device 0
unlimited-ocr-rdna4 run --input report.pdf --start-page 21 --max-pages 10
```
Important flags:
| Flag | Default | Meaning |
|---|---:|---|
| `--device` | `$UNLIMITED_OCR_DEVICE` or `0` | ROCm ordinal or stable ROCr UUID |
| `--mode` | `gundam` | `gundam` for detailed single-page parsing; `base` for lower-detail input |
| `--max-length` | `4096` | Total input + output sequence limit; maximum `32768` |
| `--dpi` | `200` | PDF rendering resolution |
| `--max-pages` | `20` | Per-run PDF safety cap |
| `--max-page-pixels` | `60000000` | Per-page rendered-pixel cap |
| `--max-total-pixels` | `400000000` | Aggregate rendered-pixel cap |
| `--max-page-rendered-mib` | `512` | Per-page rendered temporary-byte cap |
| `--max-rendered-mib` | `2048` | Aggregate rendered temporary-byte cap |
| `--force` | off | Replace an existing output file |
| `--json` | off | Stable machine-readable summary on stdout |
| `--quiet` | off | Suppress progress diagnostics |
OCR content is written to the output file. Progress and warnings go to stderr. Human or JSON summaries go to stdout.
## GPU selection
PyTorch uses the CUDA-compatible API name on ROCm. `--device` sets `ROCR_VISIBLE_DEVICES` before PyTorch is imported, so
the process sees one logical `cuda:0` backed by the selected AMD card.
For ordinary one-GPU systems:
```bash
unlimited-ocr-rdna4 run --input page.png --device 0
```
For multi-GPU systems, a stable ROCr UUID avoids dependence on enumeration order:
```bash
unlimited-ocr-rdna4 run --input page.png --device GPU-0123456789abcdef
```
Run `unlimited-ocr-rdna4 doctor` before choosing a device. Do not assume another application's GPU numbering matches
ROCm's ordinal numbering.
## What the RDNA 4 adaptation changes
- Pins the Baidu checkpoint and verifies the complete expected local model tree before custom code loads.
- Uses AMD's production ROCm 7.2.1 PyTorch, torchvision, and Triton wheels for Python 3.12.
- Isolates one `gfx1200`/`gfx1201` GPU before importing PyTorch.
- Replaces unsafe `eval()` calls in optional model-output geometry parsing with `ast.literal_eval()`.
- Makes one internal mask transfer follow the active tensor device.
- Supplies the missing all-ones attention mask and pad token for single-sequence generation.
- Loads only the prepared local model during inference and enables Hugging Face offline mode.
- Avoids vLLM, SGLang, quantization, tensor parallelism, and unverified custom serving kernels.
- Removes only complete, exact layout sentinel pairs without rewriting recognized Unicode or TeX.
- Detects obvious terminal repetition and warns without silently rewriting recognition content.
The model weights and mathematical operators are unchanged. PyTorch's ROCm backend provides the RDNA 4 kernels.
## Configuration
Precedence is flags, then environment variables, then XDG defaults.
| Environment variable | Purpose |
|---|---|
| `UNLIMITED_OCR_DEVICE` | Default ROCm ordinal or UUID |
| `UNLIMITED_OCR_MODEL_DIR` | Prepared model directory |
| `XDG_DATA_HOME` | Default model storage root |
| `XDG_CACHE_HOME` | Wheel, Hugging Face, and temporary-work cache root |
| `NO_COLOR` | Accepted implicitly; the CLI currently emits no color |
This project contains no analytics or telemetry code.
## Safety and limitations
- The default 4096 sequence limit includes visual-prefill tokens. Dense pages may require a larger value.
- PDF mode uses permissively licensed PDFium bindings and renders one bounded page at a time. A failed run leaves no
published partial document; retry with `--start-page` to resume manually.
- Generative OCR can omit or hallucinate content. Verify consequential documents against the source.
- Rotated text and repetitive pages are known upstream weak spots.
- Only the configuration above has completed the full repository acceptance test. Newer ROCm/PyTorch versions may work,
but `doctor` reports them as unverified until measured.
- The hardware guard accepts `gfx1200`, but reports `hardware_verified=false`; only `gfx1201` has completed this GPU gate.
- The bootstrap currently supports Linux x86_64, Python 3.12, and host ROCm 7.2.1.
See [SECURITY.md](SECURITY.md) before processing untrusted documents.
## Development
CPU-only tests do not install PyTorch. The commands below are convenient for development; the release bootstrap is the
hash-locked installation path.
```bash
python3.12 -m venv .venv-dev
.venv-dev/bin/pip install -e '.[dev]'
.venv-dev/bin/ruff check .
.venv-dev/bin/ruff format --check .
.venv-dev/bin/pytest
.venv-dev/bin/python -m build
.venv-dev/bin/twine check dist/*
```
The GPU smoke gate is intentionally separate. It uses tracked, hash-checked fixtures; parses structured JSON; runs the
image twice in fresh processes; and checks image/PDF output hashes, structure, stack identity, revision, VRAM, and process
release. On the validated host, run it in a root-created private network namespace:
```bash
VALIDATION_NETWORK_ISOLATED=1 \
UNLIMITED_OCR_DEVICE=GPU-0123456789abcdef \
AMD_SMI_GPU=3 \
./scripts/validate-smoke.sh
```
## Credits and license
- Model and model code: [Baidu Unlimited-OCR](https://github.com/baidu/Unlimited-OCR), MIT licensed.
- ROCm evaluation and batching research: [AIwork4me/Unlimited-OCR-ROCm](https://github.com/AIwork4me/Unlimited-OCR-ROCm).
- AMD wheel source and compatibility guidance: [ROCm documentation](https://rocm.docs.amd.com/).
- PDF rendering: [pypdfium2](https://pypi.org/project/pypdfium2/) and PDFium, under permissive licenses.
The runtime is MIT licensed. Baidu's original copyright and license are preserved; see
[THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).