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 |
기본 고디테일 문서 파싱 모드. | 아니오 |