Unlimited-OCR

Unlimited-OCR

이 문서는 Baidu의 문서 파싱용 멀티모달 OCR 모델인 Unlimited-OCR을 SGLang으로 서빙하고 호출하는 방법을 설명해요. 슬라이딩 윈도우 언어 백본을 사용하지만, SGLang은 prefill-aware 슬라이딩 윈도우 경로로 서빙해 긴 decode 동안에도 이미지와 프롬프트 토큰을 볼 수 있게 해요. 원문 페이지에는 하드웨어 플랫폼을 골라 명령을 자동 생성해 주는 Playground가 포함되어 있어요.

출처: 문서

본문

배포

SGLang 설치

Unlimited-OCR 지원은 SGLang PR #29186에 있어요. 이 PR이 태그된 SGLang 릴리스에 포함되기 전까지는, PR이 포함된 빌드에서 설치하세요.

Python (pip / uv):

pip install -U uv
uv venv --python 3.12 && source .venv/bin/activate

git clone https://github.com/sgl-project/sglang.git
cd sglang
git fetch origin pull/29186/head && git checkout FETCH_HEAD
uv pip install --prerelease=allow -e python

그런 다음 해당 환경에서 아래 명령 패널의 Python 출력을 실행하세요.

Docker:

docker pull lmsysorg/sglang:dev

이미지 실행 방법은 Install → Method 3: Using Docker를 참고하세요. 내부 sglang serve ...을 아래 명령 생성기가 만드는 것으로 대체하세요.

하드웨어를 골라 실행 명령을 생성하세요. 레시피는 현재 prefill-aware 슬라이딩 윈도우 attention 경로에 필요한 FlashAttention-3와 --page-size 1을 사용해요. 또한 기본적으로 radix cache를 비활성화하는데, 이는 각 요청이 보통 다른 이미지를 담는 배치 OCR 워크로드에 더 적합해요.

Playground

Playground를 사용해 선택한 배포 셀 위에 텐서 병렬화를 조정하세요.

1. 모델 소개

Unlimited-OCR은 Baidu의 문서 파싱용 멀티모달 OCR 모델이에요. 슬라이딩 윈도우 언어 백본을 사용하지만, SGLang은 prefill-aware 슬라이딩 윈도우 경로로 서빙해 긴 decode 동안 이미지와 프롬프트 토큰이 계속 보이도록 해요.

SGLang 통합은 SAM과 CLIP 비전 인코더에 DeepSeek 스타일 언어 백본을 더한 독립형 Unlimited-OCR 아키텍처를 로드해요. OpenAI 호환 이미지 요청과 images_config를 통한 모델별 이미지 처리 옵션을 지원해요.

리소스: Hugging Face · SGLang PR #29186

2. 설정 팁

  • Attention 백엔드: --attention-backend fa3 --page-size 1을 사용하세요. prefill-aware SWA 페이지 테이블은 토큰 수준 위치로 구축되므로 페이지 크기 1이 필요해요.
  • Radix cache: 서로 다른 문서에 대한 배치 OCR에서는 --disable-radix-cache를 유지하세요. 워크로드가 같은 이미지와 프롬프트에 대해 반복해서 물어보면 이 플래그를 제거해 PureSWARadixCache를 통한 prefix 재사용을 허용하세요.
  • 긴 OCR 생성: 기본 prefill-aware SWA 경로를 유지하세요. 생성된 텍스트에 슬라이딩 윈도우를 적용하면서 프롬프트와 이미지 KV는 유지해요.
  • 커스텀 logit 프로세서: 실행 명령에 --enable-custom-logit-processor를 유지하세요.
  • 이미지 모드: 요청별로 images_config.image_mode를 전달하세요. 지원 모드는 tiny, small, base, large, gundam이에요. 여러 이미지 지원은 tiny, small, base 전용이에요.
  • 기본 이미지 모드: images_config.image_mode가 생략되면 SGLang은 gundam을 사용해요.

3. 고급 사용법

3.1 OCR 요청

OCR 예시 (Python):

from openai import OpenAI

client = OpenAI(base_url="http://localhost:30000/v1", api_key="EMPTY")

response = client.chat.completions.create(
    model="baidu/Unlimited-OCR",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "document parsing."},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://example.com/your_document.png"
                    },
                },
            ],
        }
    ],
    max_tokens=2048,
    temperature=0,
    extra_body={"images_config": {"image_mode": "gundam"}},
)

print(response.choices[0].message.content)

3.2 이미지 모드 선택

단순 이미지의 prefill 비용을 줄이려면 낮은 모드를, 높은 디테일 문데 파싱에는 gundam을 사용하세요.

모드 용도 여러 이미지
tiny 가장 낮은 prefill 비용.
small 가벼운 OCR 요청.
base 품질과 비용의 균형.
large 더 높은 해상도 단일 이미지 OCR. 아니오
gundam 기본 고디테일 문서 파싱 모드. 아니오