Unlimited-OCR: 百度によるワンショット長文書解析

百度のUnlimited-OCRは、最大32Kのコンテキスト長をサポートし、単一のフォワードパスで長文書やPDFをワンショット解析できます。

Unlimited-OCRとは?

Unlimited-OCRは、百度が公開した新しいオープンソースのOCRモデルで、文書解析の限界を押し広げることを目的としています。特に、ワンショット長文書解析をターゲットとしています。従来のOCRシステムがページごとに処理したり、スライディングウィンドウに依存したりするのとは異なり、Unlimited-OCRは複数ページの文書全体(または高解像度の単一画像)を受け取り、単一のフォワードパスで構造化されたテキスト出力を生成できます。

これは、研究論文、法的契約書、複数ページのレポートなど、長文コンテンツの文書理解において大きな前進です。

なぜ重要なのか

ほとんどのOCRパイプラインは、文書を個々のページや領域に分割し、それぞれ独立して処理した後、結果を再結合します。このアプローチにはいくつかの欠点があります。

  • コンテキスト損失: ページ境界をまたぐ情報が失われます。
  • 推論が遅い: 各ページに個別のモデル呼び出しが必要です。
  • 複雑なパイプライン: ページ検出、順序付け、マージのロジックが必要です。

Unlimited-OCRは、複数の画像(または画像に変換されたPDF)を受け入れ、単一の一貫した出力を生成することで、これらの問題を解決します。このモデルは32,768トークンのコンテキスト長をサポートしており、これは数十ページの密な文書をカバーするのに十分です。

主な機能

  • ワンショット長文書解析: 複数ページを一度に与え、単一の出力を得る。
  • 2つの推論モード: gundam(クロップベース、640px画像サイズ)は詳細な単一画像用、base(1024px画像サイズ)は複数ページまたはPDF解析用。
  • vLLMおよびSGLangサポート: 本番グレードの推論エンジンでデプロイ可能。
  • オープンソース: MITライセンス、GitHubおよびHugging Faceで利用可能。
  • 32Kコンテキスト長: 長文書を切り詰めずに処理。

Unlimited-OCRの使い方

Transformersでのクイックスタート

最も簡単な始め方は、Hugging Face Transformersを使用することです。以下は最小限の例です。

import torch
from transformers import AutoModel, AutoTokenizer

model_name = 'baidu/Unlimited-OCR'

tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
model = AutoModel.from_pretrained(
    model_name,
    trust_remote_code=True,
    use_safetensors=True,
    torch_dtype=torch.bfloat16,
)
model = model.eval().cuda()

# 単一画像解析(高詳細のgundamモード)
model.infer(
    tokenizer,
    prompt='<image>document parsing.',
    image_file='your_image.jpg',
    output_path='./output',
    base_size=1024, image_size=640, crop_mode=True,
    max_length=32768,
    no_repeat_ngram_size=35, ngram_window=128,
    save_results=True,
)

複数ページ / PDF解析

複数ページの文書の場合、各ページを画像に変換し、infer_multiを使用します。

import fitz  # PyMuPDF

def pdf_to_images(pdf_path, dpi=300):
    doc = fitz.open(pdf_path)
    mat = fitz.Matrix(dpi / 72, dpi / 72)
    paths = []
    for i, page in enumerate(doc):
        out = f'page_{i+1:04d}.png'
        page.get_pixmap(matrix=mat).save(out)
        paths.append(out)
    doc.close()
    return paths

model.infer_multi(
    tokenizer,
    prompt='<image>Multi page parsing.',
    image_files=pdf_to_images('your_doc.pdf', dpi=300),
    output_path='./output',
    image_size=1024,
    max_length=32768,
    no_repeat_ngram_size=35, ngram_window=1024,
    save_results=True,
)

vLLMによるデプロイ

本番環境では、vLLMが推奨される推論エンジンです。百度はビルド済みのDockerイメージを提供しています。

# デフォルト(CUDA 13.0)
docker pull vllm/vllm-openai:unlimited-ocr

# Hopper GPU用(CUDA 12.9)
docker pull vllm/vllm-openai:unlimited-ocr-cu129

その後、公式レシピに従ってください: https://recipes.vllm.ai/baidu/Unlimited-OCR

SGLangデプロイ

SGLangもサポートされています。環境をセットアップし、サーバーを起動します。

uv venv --python 3.12
source .venv/bin/activate
uv pip install wheel/sglang-0.0.0.dev11416+g92e8bb79e-py3-none-any.whl
uv pip install kernels==0.11.7
uv pip install pymupdf==1.27.2.2

python -m sglang.launch_server \
    --model baidu/Unlimited-OCR \
    --served-model-name Unlimited-OCR \
    --attention-backend fa3 \
    --page-size 1 \
    --mem-fraction-static 0.8 \
    --context-length 32768 \
    --enable-custom-logit-processor \
    --disable-overlap-schedule \
    --skip-server-warmup \
    --host 0.0.0.0 \
    --port 10000

その後、OpenAI互換APIを介してリクエストを送信します。

import requests

response = requests.post(
    "http://127.0.0.1:10000/v1/chat/completions",
    json={
        "model": "Unlimited-OCR",
        "messages": [
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": "document parsing."},
                    {"type": "image_url", "image_url": {"url": "data:image/png;base64,..."}}
                ]
            }
        ],
        "temperature": 0,
        "images_config": {"image_mode": "gundam"},
        "custom_logit_processor": "DeepseekOCRNoRepeatNGramLogitProcessor",
        "custom_params": {"ngram_size": 35, "window_size": 128},
        "stream": True,
    },
    timeout=1200,
    stream=True,
)

パフォーマンスとベンチマーク

READMEには詳細なベンチマークは含まれていませんが、モデルのアーキテクチャは長文書解析向けに設計されています。32Kのコンテキスト長とno_repeat_ngram_sizeパラメータ(35に設定)は、自己回帰モデルでよくある問題である長い出力での繰り返しを防ぐのに役立ちます。

gundamモードはimage_size=640のクロップベースのアプローチを使用し、細かい詳細が重要な単一画像(例えば、密なテキストページ)に最適です。baseモードはクロップなしでimage_size=1024を使用し、グローバルなレイアウトが重要な複数ページの文書に適しています。

DeepSeek-OCRとの比較

Unlimited-OCRは、明示的に「DeepSeek-OCRをさらに一歩進める」と位置づけています。主な改善点は次のとおりです。

  • より長いコンテキスト: 以前のモデルに対して32Kトークン。
  • 複数ページサポート: 複数の画像を一度にネイティブ処理。
  • 本番環境対応: vLLMとSGLangをすぐにサポート。
  • オープンソース: MITライセンス、完全に再現可能。

ユースケース

  • 研究論文解析: PDF全体を入力し、構造化テキストを取得。
  • 法的文書分析: 契約書、同意書、フォーム。
  • 請求書・領収書処理: 文書のバッチ処理。
  • 歴史的文書のデジタル化: 複雑なレイアウトの長文書。
  • RAGパイプライン: インデックス作成前にUnlimited-OCRを文書パーサーとして使用。

はじめに

  1. リポジトリをクローン: git clone https://github.com/baidu/Unlimited-OCR
  2. 依存関係をインストール: pip install torch transformers pillow pymupdf
  3. 上記の例で推論を実行。
  4. 本番環境では、vLLM Dockerイメージを使用。

結論

Unlimited-OCRは、ワンショット長文書解析のための実用的でオープンソースのソリューションです。複数ページ入力、32Kコンテキスト、本番グレードの推論エンジンのサポートにより、文書理解パイプラインを構築する開発者にとって強力な選択肢となります。MITライセンスと活発なコミュニティサポート(GitHubで13k以上のスター)は、今後も進化し続けることを示唆しています。

OCR、文書解析、またはRAGパイプラインに取り組んでいるなら、試す価値のあるプロジェクトです。

ソース

baidu/Unlimited-OCR: Unlimited OCR Works: Welcome the Era of One-shot Long-horizon Parsing.