- Baidu가
여러 페이지를 한 요청으로 처리하는 Unlimited-OCR 2를 공개함. 페이지 간 문맥을 활용하며, 유한한 컨텍스트 윈도 안에서 매우 긴 문서를 이어서 파싱하도록 설계됨
SR-SWA는 텍스트와 시각 정보 간 어텐션 상호작용을 고정 크기 참조 집합으로 압축해, 문서가 길어져도 단계별 디코딩 지연과 메모리 사용량을 거의 일정하게 유지함
- 자체 공개 평가에서 수십 페이지 규모의
MPDocBench 84.6점, 수백 페이지 규모의 MarathonDocBench 77.1점을 기록했으며, 비교 모델 중 가장 높은 종합 점수를 보임
- 빠른 테스트에는
Transformers, 서비스 운영에는 맞춤형 SGLang을 제공함. 단일 페이지와 다중 페이지 입력, PDF를 이미지로 변환해 처리하는 예시를 공개함
- 긴 문서를 나눠 처리하는
페이지 윈도를 줄이면 최대 메모리 사용량은 낮아지지만, 경계를 넘어 이어지는 블록의 문맥이 끊겨 페이지 간 병합 품질이 떨어질 수 있음
SR-SWA로 긴 문서의 처리 비용 제한
Sparse Reference Sliding Window Attention(SR-SWA) 은 초장문 시퀀스의 텍스트와 시각 정보 간 어텐션 상호작용을 512토큰 같은 고정 크기의 작업 참조 집합으로 압축함
- 계산 복잡도에 상한을 두어
단계별 디코딩 지연과 메모리 사용량을 문서 길이와 관계없이 거의 일정하게 유지함
- 유한한 컨텍스트 윈도 안에서 문서 파싱을 이어가며, 문서가 길어질 때 발생하는 어텐션의 제곱 비례 확장과 메모리 병목을 해소하는 것을 목표로 함
- 시각화 예시는 책 한 권 전체를 단일 요청으로 파싱하는 과정을 재생함
수십 페이지와 수백 페이지 문서 평가
-
공개된 성능 비교 그래프는 수십 페이지 규모의
MPDocBench와 수백 페이지 규모의 MarathonDocBench를 비교함
-
Baidu가 공개한 종합 점수는 다음과 같음
| 모델 |
MPDocBench |
MarathonDocBench |
Unlimited-OCR 2 |
84.6 |
77.1 |
| Qwen3.8-Max |
78.3 |
22.9 |
| Qwen3.8-Flash-Next |
77.4 |
27.8 |
| Gemini-3.8-Flash |
76.2 |
28.6 |
| Gemini-3.1-Pro Preview |
71.8 |
27.0 |
| Kimi-K3 |
60.8 |
33.7 |
| Unlimited-OCR |
61.9 |
0.0 |
-
비교 모델 중 차순위 점수보다 MPDocBench에서
6.3점, MarathonDocBench에서 43.4점 높음
-
그래프는 텍스트, 수식, 표, 그림, 제목과 읽기 순서 등 세부 항목의 결과도 제시함
-
MarathonDocBench 데이터셋을 함께 공개함
Transformers는 빠른 테스트를 위한 기본 추론 경로임
- 공개 테스트 환경은 Python 3.10과 NVIDIA A800-80GB이며, PyTorch와 Transformers 등의 패키지 버전을 명시함
- 모델과 토크나이저를 불러올 때
trust_remote_code=True
를 사용하고, 예시에서는 Safetensors 가중치를 BF16으로 GPU에 올림
infer_multi
는 문서의 모든 페이지를 한 요청으로 처리해 페이지 간 문맥을 활용함
- 페이지 이미지를 순서대로 전달하며, 각 페이지를 하나의 전체 뷰로 인코딩하는
base 모드를 사용함
- 다중 페이지 프롬프트는 자동 생성되며, 출력에는 입력 순서대로 페이지마다
<PAGE>
마커가 들어감
infer
는 단일 페이지를 처리하며, 기본적으로 동적 타일링을 사용하는 gundam 모드로 인코딩함
SGLang 서비스 운영과 메모리 절충
SGLang은 권장 서비스 운영 경로이며, 공개 실행 안내는 맞춤형 패키지를 사용함
- PDF의 이미지 변환에는 PyMuPDF를, 토크나이저 백엔드에는
fastokens
를 사용함
페이지 윈도 스케줄링은 이전 윈도의 KV 캐시 꼬리 부분을 재사용하며 긴 문서를 처리함
- 예시는 base와 gundam 모드 모두 윈도당 10페이지로 설정함
SGLANG_UOCR_EANABLE_DOC_LIMIT=0
으로 설정하면 문서 전체를 하나의 윈도로 처리함
- 윈도를 줄이면 최대 메모리 사용량이 낮아지지만, 경계를 넘어 이어지는 블록이 문맥을 잃어
페이지 간 병합에 불리함
SAM 어텐션 바이어스 청크의 기본 상한 512는 약 462MiB의 단일 할당을 허용해 메모리 부족을 일으킬 수 있음
으로 전달하며, 확장 가능한 CUDA 메모리 세그먼트로 단편화에 따른 큰 연속 메모리 할당 실패를 줄임
가중치와 KV 캐시에 예약할 메모리 비율도 조정함
- 실행 안내에서는 동시 요청 32개 이상에서
--mem-fraction-static=0.75
는 여유 공간이 부족하고, 0.7은 안정적이라고 설명함
--max-prefill-tokens
에 따라 대략 [tokens, context/32]
크기의 임시 텐서가 생김
- 값을 4096에서 2048로 줄이면 해당 임시 텐서의 최대 메모리 사용량이 절반으로 줄어듦
CUDA 그래프 설정은 프리필 배치와 동시 요청 수에 맞춰야 함
- 가장 큰
--cuda-graph-bs-prefill
버킷은 --max-prefill-tokens
와 같아야 함
- 작으면 큰 배치가 즉시 실행 방식으로 전환되고, 크면 사용하지 않는 그래프 캡처 메모리를 낭비함
full_prefill_max_req
의 기본값 8은 동시 요청 16개나 32개에서 즉시 실행으로 전환하게 하므로, 예시는 요청 슬롯을 64로 설정함
요청 구성과 출력 제어
OpenAI 호환 API의 /v1/chat/completions
로 페이지 이미지와 다중 페이지 프롬프트를 보내며, 결과를 스트리밍으로 받음
crop_mode=True
는 타일 기반 gundam 모드, False
는 base 모드를 선택함
- PDF 예시는 문서를
300dpi 이미지로 변환한 뒤 같은 요청 경로로 처리함
출력 토큰 예산은 문서 전체 한도와 페이지별 한도를 구분함
max_tokens
는 양수여야 하는 문서 전체 예산이며, 예시는 페이지당 8,000토큰을 기준으로 계산함
- 페이지별 출력 상한 예시는 20,000토큰이며, 요청의
max_page_tokens
를 0 이하로 두면 페이지별 보호 장치를 끔
DeepseekOCRNoRepeatNGramLogitProcessor
로 반복 출력을 제어함
- 평가 설정과 같이 다중 페이지에는 1,024, 단일 페이지에는 128의 윈도 크기를 사용함
- n-gram 크기는 35이며,
<PAGE>
와 EOS 토큰 ID를 전달하고 특수 토큰을 출력에 유지함
공개 범위와 이전 버전
댓글과 토론