Unlimited OCR 소개
사람은 책 수백 페이지를 처음부터 끝까지 베껴 쓰는 동안, 한 글자를 적을 때마다 이미 적은 모든 문장을 다시 훑어보지 않습니다. 원본의 지금 보는 부분과 방금 적은 몇 글자만 곁눈질하며 진도를 확인할 뿐입니다. 신기하게도 우리는 1페이지를 필사할 때나 100페이지째를 필사할 때나 속도가 크게 느려지지 않습니다. 그런데 현재의 OCR 모델들은 정확히 이 지점에서 사람과 정반대로 동작합니다.
이 글에서 소개하는 Unlimited OCR 는 바이두(Baidu)가 공개한 문서 OCR 모델로, "출력이 길어질수록 점점 느려지는" 기존 엔드투엔드(end-to-end) OCR의 구조적 한계를 어텐션(attention) 메커니즘 자체를 바꿔 해결합니다. 핵심 아이디어는 사람의 필사 작업 기억(working memory)을 모방한 Reference Sliding Window Attention(R-SWA) 로, 디코딩이 아무리 길어져도 KV 캐시(KV cache)를 일정하게 유지해 책 수십 페이지를 단 한 번의 순전파(forward pass)로 전사(transcribe)할 수 있게 합니다.
엔드투엔드 OCR의 부상과 디코더의 함정
최근 DeepSeek OCR로 대표되는 엔드투엔드 OCR 모델이 다시 한번 주목받고 있습니다. 전통적인 OCR은 탐지(detection) 모델이 문서 요소를 먼저 찾고, 여러 인식(recognition) 연산자가 각 블록의 내용을 파싱하는 파이프라인(pipeline) 구조였습니다. PaddleOCR이나 MinerU 계열이 대표적이며, 크롭(cropping)과 정렬 같은 휴리스틱으로 각 단계를 이어 붙입니다. 이 방식은 여전히 널리 쓰이지만, 단계가 많고 휴리스틱에 의존한다는 약점이 있습니다.
반면 엔드투엔드 모델은 대형 언어 모델(Large Language Model, LLM)의 강력한 디코더를 활용해 탐지와 인식을 하나의 함수로 통합하고, 페이지 전체를 한 번의 순전파로 파싱합니다. 일반적으로 "LLM을 디코더로 쓰면 언어의 사전 분포(prior distribution)를 활용할 수 있어 OCR 성능이 좋아진다" 는 견해가 널리 받아들여집니다. 하지만 단점도 명확합니다. 출력 시퀀스가 길어질수록 누적되는 KV 캐시가 메모리 사용량을 끌어올리고 생성 속도를 점점 떨어뜨립니다. 사람이 장시간 필사에서 효율 저하를 거의 보이지 않는 것과는 극명하게 대비됩니다.
엔드투엔드 모델을 좀 더 뜯어보면 비용을 좌우하는 두 모듈이 보입니다. 하나는 이미지 정보를 추출하고 압축하는 인코더(encoder) 로, 토큰 압축률이 모델 성능의 상한을 결정합니다. 시각 토큰이 너무 길면(압축률이 낮으면) 지나치게 긴 접두 토큰 탓에 디코딩 속도가 떨어지기 때문입니다. 다른 하나는 추론 비용을 가장 직접적으로 좌우하는 디코더(decoder) 로, 특히 KV 캐시 크기가 병목입니다. 현재 엔드투엔드 OCR 모델은 대부분 $3$B 미만 규모인데(DeepSeek OCR은 MoE로 활성 파라미터를 $0.5$B까지 낮춥니다), 그럼에도 디코딩 맥락이 길어질수록 KV 캐시가 끊임없이 커지면서 생성 속도와 길이가 모두 제약됩니다. Unlimited OCR이 정조준하는 지점이 바로 이 디코더의 KV 캐시입니다.
그 결과 기존 모델들은 열 페이지조차 한 번의 순전파로 파싱하지 못하고, 페이지마다 메모리를 초기화하는 페이지 단위 for-loop 방식으로 우회합니다. 저자들은 이를 두고 "어느 정도는 작동하지만, AGI를 향한 진전이라기보다는 엔지니어링 임시방편(engineering workaround)에 가깝다" 고 지적합니다. 하나의 연속적인 장문 작업이 외부 스케줄러가 관리하는 단편적인 단기 작업들로 쪼개져 버리기 때문입니다.
발상의 전환: 사람의 작업 기억을 모방하기
연구팀은 사람이 문서를 필사하는 행동에서 단서를 찾습니다. 한 사람이 책을 손으로 베낄 때, 주의는 보통 세 곳에 집중됩니다. 원본 책, 방금 적은 아주 짧은 분량(보통 몇 글자), 그리고 다음에 적을 글자입니다. 이미 적은 모든 내용을 완전히 기억하는 대신, 멀리 떨어진 출력은 부드럽게 잊어버리는 소프트 망각(soft forgetting) 을 수행합니다. 저자들은 바로 이 점이 낮은 인지 부하로 장문 작업을 지속하는 비결이라고 봅니다.
이 관찰은 현재 모델의 어텐션과 근본적으로 다른 패턴을 시사합니다. 전체 이력을 끝까지 참조하는 표준 풀 어텐션(full attention)도 아니고, 시각/참조 토큰이 반복적인 상태 갱신을 겪는 선형 어텐션(linear attention)도 아닙니다. 후자처럼 시각 토큰을 매번 갱신하면 시각 특징이 점점 흐려져 인식 정확도가 떨어지기 때문입니다. 이 자연스러운 어텐션 흐름에 더 가깝게 맞추기 위해 제안된 것이 R-SWA이며, 그 위에서 구축된 모델이 Unlimited OCR입니다.
미리 핵심 결과를 언급하면, Unlimited OCR은 OmniDocBench v1.5에서 93.23 점을 기록하며 베이스라인인 DeepSeek OCR을 6.22 점 앞섰고, 최신 v1.6에서는 93.92 점으로 엔드투엔드 SOTA를 달성했습니다. 무엇보다 KV 캐시를 고정 크기로 유지해, 40페이지 이상을 한 번에 입력해도 편집 거리(edit distance)가 0.11 미만으로 유지됩니다.
사람의 필사에서 본 장문 파싱 문제
본격적인 방법론에 앞서, 이 연구가 풀려는 장문 파싱(long-horizon parsing) 문제를 명확히 짚어볼 필요가 있습니다. 사람은 책 한 권을 쉬지 않고 옮겨 적거나, 수백 페이지를 한자리에서 번역하거나, 몇 시간 분량의 음성을 끊김 없이 받아쓰는 일에 능숙합니다. 이 연속적인 파싱 능력은 작업 기억과 밀접하게 연결되어 있어 보입니다.
앞서 본 그림처럼, 핵심은 "멀리 떨어진 출력은 부드럽게 잊고, 가까운 맥락만으로 진도를 추적한다" 는 점입니다. for-loop 방식은 페이지마다 기억을 통째로 지워 버리므로, 연속적인 장문 과정이 고립된 단기 작업으로 파편화됩니다. 그렇다고 풀 어텐션으로 모든 출력을 끝까지 기억하게 하면 KV 캐시가 무한정 커집니다. Unlimited OCR은 이 둘 사이에서, 시각 토큰이라는 변하지 않는 참조는 항상 보되 생성된 텍스트는 일정 폭만 기억하는 제3의 길을 택합니다.
Unlimited OCR의 핵심: Reference Sliding Window Attention
전체 아키텍처
Unlimited OCR은 DeepSeek OCR을 베이스라인으로 삼습니다. 구체적으로는 DeepEncoder 와, 총 30 억 개 파라미터 중 약 5 억 개($0.5$B)만 활성화되는 Mixture-of-Experts(MoE) 구조의 LLM 디코더로 구성됩니다(모델 카드 표기는 3B-A0.5B). DeepEncoder는 시각 토큰을 강하게 압축하는 능력이 뛰어나, 프리필(prefill) 단계의 KV 캐시 부담을 크게 줄이면서도 견고한 광학 텍스트 특징 추출을 유지합니다.
원본 DeepSeek OCR과 달라지는 단 한 가지 지점은, 디코더의 모든 표준 멀티헤드 어텐션(Multi-Head Attention, MHA)을 제안된 R-SWA로 교체했다는 것입니다. 이 교체 덕분에 기존 참조 KV 캐시 m 에 폭 n 의 고정 용량 출력 버퍼만 더하면 장문 파싱이 가능해집니다.
DeepEncoder: 16배 압축이 중요한 이유
DeepEncoder는 DeepSeek OCR에서 처음 도입된 인코더로, SAM의 윈도우 어텐션(window attention) ViT와 CLIP의 글로벌 어텐션(global attention) ViT를 직렬로 연결하고, 그 사이에서 16\times 토큰 압축을 적용합니다. 전반부는 원본 이미지 토큰을 전적으로 윈도우 어텐션으로 처리하고, 글로벌 어텐션은 압축된 토큰에만 적용합니다. 덕분에 고해상도 이미지를 인코딩할 때도 활성화 값이 낮게 유지되어 GPU 메모리를 아낍니다.
이 인코더는 다섯 가지 해상도 모드를 지원하지만, Unlimited OCR은 그중 두 가지만 사용합니다. 다중 페이지용 Base 모드(1024\times1024 )와 단일 페이지용 Gundam 모드(동적 해상도)입니다. 특히 DeepEncoder는 1024\times1024 PDF 이미지를 단 256 개 토큰으로 압축할 수 있습니다.
이 높은 압축률이 장문 OCR에서 결정적인 이유는, 시각 토큰이 출력과 함께 상태 전이(state transition)를 겪지 않기 때문입니다. 시각 토큰은 한 번 인코딩된 뒤 장문 파싱 과정 전체에 걸쳐 정적으로 남아 있습니다. 즉 입력 측 토큰을 잘 압축해 둘수록, 프리필로 고정해 두는 참조의 크기가 작아져 더 많은 페이지를 한 번에 담을 수 있습니다.
R-SWA의 어텐션 계산
이제 핵심인 R-SWA를 살펴봅니다. DeepEncoder가 입력 측 시각 토큰을 충분히 압축했더라도, 책 한 권을 한 번에 파싱하는 진짜 병목은 디코딩 단계에 있습니다. 시각 토큰과 텍스트 토큰의 압축비를 1{:}10 으로 가정하면, 시각 토큰 하나가 약 10 개의 텍스트 토큰으로 디코딩됩니다. 이 경우 $10$K 개의 시각 토큰(해상도 1024\times1024 기준 대략 20 ~ 30 페이지)은 완전한 디코딩을 위해 $100$K 개 이상의 출력 길이를 요구합니다. 표준 LLM 기반 OCR에게 $128$K 토큰을 넘어서는 시퀀스는 막대한 KV 캐시 저장과 어텐션 연산 탓에 오랫동안 풀기 어려운 난제였습니다.
R-SWA는 어텐션을 두 구간으로 이루어진 크기 m+n 의 윈도우 안으로 제한합니다.
위 그림에서 보듯, 각 디코딩 토큰이 접근할 수 있는 위치 집합 \mathcal{N}(t) 는 두 부분으로 나뉩니다. 첫째는 길이 L_m 의 접두(prefix) 구간 \mathcal{P} = \{1, \dots, L_m\} 로, 시각 토큰과 프롬프트를 포함하며 이후의 모든 토큰에게 전역적으로(globally) 보입니다. 둘째는 디코드 영역 위에서 폭 n 으로 인과적(causal)으로 미끄러지는 슬라이딩 윈도우 \mathcal{D}_n(t) 입니다.
즉 모든 출력 토큰은 이미지 전체(접두 구간)를 항상 인지하면서도, 이전에 생성된 토큰들에 대해서는 폭 n 의 경계 안에서만 국소적으로 주의를 둡니다. 여기서 m 은 추론 한 번 동안 고정되며, 책 페이지 수나 문서 해상도에만 의존할 뿐 디코딩 길이에 따라 변하지 않습니다. 슬라이딩 윈도우 폭 n 의 기본값은 128 입니다. 이렇게 각 토큰은 이미지 전체를 보면서도, 인과적 슬라이딩 윈도우 내부의 상태 전이를 통해 OCR 진행 상황을 스스로 추적합니다.
이 점이 일반적인 슬라이딩 윈도우 어텐션(vanilla SWA)과 결정적으로 다른 부분입니다. 보통의 SWA라면 시각 토큰마저 윈도우 밖으로 밀려나거나 반복적인 상태 갱신을 거치며 시각 특징이 점점 흐려집니다. 반면 R-SWA는 시각 토큰과 프롬프트를 윈도우의 상태 전이에서 제외하고 항상 또렷한 전역 참조로 유지하며, 오직 출력 토큰 구간에서만 윈도우를 미끄러뜨립니다. 이름에 '참조(Reference)'가 붙은 이유가 바로 여기에 있습니다.
일정하게 유지되는 KV 캐시
R-SWA가 장문 파싱을 가능하게 하는 진짜 이유는 KV 캐시 크기 분석에서 드러납니다. 베이스라인 DeepSeek OCR이 쓰는 표준 MHA는 표현력은 강하지만 KV 캐시 압박이 큽니다. 총 T 개 토큰을 생성한 뒤 필요한 캐시 크기는 다음과 같이 디코딩 길이 T 에 비례해 무한정 커집니다.
반면 R-SWA는 항상 크기 L_m 의 접두 캐시 전체를 유지하되, 생성된 출력에 대해서는 가장 최근 n 개 토큰만 보관하면 됩니다. 따라서 필요한 캐시 크기는 상수 윈도우로 상한이 묶입니다.
두 방식의 비율 \rho(T) = \frac{L_m + \min(n, T)}{L_m + T} 를 보면, 디코딩 길이가 충분히 길어 T \gg n 인 경우 \rho(T) \approx \frac{L_m + n}{T} \to 0 으로 수렴합니다. 다시 말해 표준 MHA의 캐시가 T 에 선형으로 늘어나는 동안, R-SWA의 디코드 측 캐시는 상수 L_m + n 에 머뭅니다.
구현 관점에서 KV 캐시는 용량 m+n 의 큐(queue)로 다뤄집니다. 새 토큰이 생성될 때마다 큐에서 (m+1) 번째 토큰에 해당하는 KV가 제거되어, 생성 과정 내내 연산 비용과 메모리 사용량이 점진적으로 증가하지 않도록 보장합니다. 바로 이 점이 한정된 자원에서 사실상 무제한에 가까운 파싱을 가능하게 하는 초석입니다.
커널 수준에서 확인되는 안정성
이론적 분석은 실제 연산 커널에서도 그대로 나타납니다. 연구팀은 Flash Attention v3 커널의 호출당 지속 시간(per-call duration)을 디코딩 길이에 따라 측정했습니다. DeepSeek OCR의 표준 MHA 커널은 디코딩 스텝이 진행될수록 지연 시간이 계속 증가하는 반면, R-SWA를 모든 디코더 층에 적용한 Unlimited OCR은 지속 시간이 일정하게 유지됩니다. DeepSeek OCR에서 관찰되는 급격한 지연 스파이크는 KV 캐시 길이가 특정 정렬 경계(alignment boundary)를 넘을 때 데이터 전송 효율이 급락하면서 발생하는데, R-SWA에서는 이 문제 역시 나타나지 않습니다. 추론 중 GPU 메모리 사용량도 같은 패턴을 따라, 원본 DeepSeek OCR에서는 선형으로 증가하지만 Unlimited OCR에서는 고정됩니다.
학습 데이터와 구현 세부사항
R-SWA라는 아키텍처 변경이 실제 OCR 품질로 이어지려면 적절한 데이터와 학습 설정이 뒷받침되어야 합니다.
데이터 엔진: 연구팀은 약 200 만 건의 문서 OCR 데이터를 단일 페이지와 다중 페이지 9{:}1 비율로 구성했습니다. 단일 페이지 PDF 데이터는 PaddleOCR로 주석을 달아, 각 블록의 좌표와 내용을 이어 붙여 엔드투엔드 탐지 및 파싱 정답을 만들었습니다. 각 요소의 좌표는 0 ~ 1000 범위로 정규화됩니다. 다중 페이지 데이터는 단일 페이지 데이터를 이어 붙여 합성했으며, 약 20 만 개 샘플이 각각 2 ~ 50 페이지로 이루어지고 페이지 사이는 <page> 토큰으로 구분합니다. 모든 데이터는 $32$K 토큰 길이로 패킹됩니다.
구현: DeepSeek OCR 체크포인트에서 출발해 Unlimited OCR을 4{,}000 스텝 동안 이어서 학습(continue training)했습니다. 전역 배치 크기는 256, 최대 시퀀스 길이는 $32$K이며 8\times16 개의 A800 GPU에서 모든 데이터를 랜덤 패킹으로 학습했습니다. 학습 시 DeepEncoder는 동결(freeze)하고 LLM 파라미터만 학습하는데, DeepEncoder가 이미 DeepSeek OCR에서 충분히 최적화되어 있기 때문입니다. 옵티마이저는 AdamW, 스케줄러는 코사인 어닐링(cosine annealing)을 쓰며 초기 학습률은 1\mathrm{e}{-4} 입니다. $32$K 학습을 지원하기 위해 DeepEP를 도입하고 전문가 병렬화(Expert Parallelism, EP)를 4 로 설정했으며, 전체 파이프라인은 Megatron-LM 위에서 구축되었습니다. 추론은 Transformers와 SGLang 양쪽에 R-SWA용 KV 캐시 관리를 구현해, 두 프레임워크 모두 일정한 TPS(tokens/s)와 GPU 메모리로 동작합니다.
실험 결과
OmniDocBench 벤치마크
평가의 주 벤치마크는 OmniDocBench로, 텍스트 인식, 수식 인식, 표 구조 추출, 읽기 순서(reading order) 예측 등 여러 차원에서 문서 파싱 능력을 측정합니다. 지표는 작업별로 텍스트 편집 거리(Edit, 낮을수록 좋음), 수식 CDM(높을수록 좋음), 표 TEDS와 TEDS-S(높을수록 좋음), 읽기 순서 편집 거리(낮을수록 좋음)를 사용하고, 전체 점수(Overall)는 이들의 가중 평균입니다.
베이스라인 DeepSeek OCR과의 직접 비교가 가능한 v1.5에서, 200 만 건의 PDF 문서 데이터만으로 이어 학습한 Unlimited OCR은 엔드투엔드 SOTA를 기록합니다.
| 지표 (v1.5) | DeepSeek OCR | Unlimited OCR | 개선 |
|---|---|---|---|
| Overall \uparrow | 87.01 | \mathbf{93.23} | \uparrow 6.22 |
| Text Edit \downarrow | 0.073 | \mathbf{0.038} | \downarrow 0.035 |
| Formula CDM \uparrow | 83.37 | \mathbf{92.61} | \uparrow 9.24 |
| Table TEDS \uparrow | 84.97 | \mathbf{90.93} | \uparrow 5.96 |
| Table TEDS-S \uparrow | 88.80 | \mathbf{94.07} | \uparrow 5.27 |
| Read-order \downarrow | 0.086 | \mathbf{0.045} | \downarrow 0.041 |
여기서 흥미로운 점은, R-SWA가 단지 효율만 개선한 게 아니라 정확도까지 끌어올렸다는 사실입니다. 저자들은 R-SWA가 모델로 하여금 밀집(dense) OCR 작업에 더 집중하게 만드는 반면, 풀 어텐션은 출력 길이가 늘어날수록 발산(divergence)할 수 있다고 해석합니다. 텍스트 편집 거리가 0.035 줄고 표 TEDS가 5.96\% 오른 것은, 과거 정보가 인과적으로 그리고 연속적으로 슬라이딩 윈도우에 공급되어 모델이 단 몇 개의 토큰만 보고도 OCR 진행 위치를 명확히 파악함을 보여줍니다.
최신 v1.6 벤치마크에서도 Unlimited OCR은 93.92\% 로 엔드투엔드 SOTA를 다시 달성하며, DeepSeek-OCR 2(90.25 ), dots.ocr(90.77 ), FireRed-OCR(93.26 ), Logics-Parsing-v2(93.33 ), Qianfan-OCR(93.90 ) 등 동시대 모델들을 앞섭니다. 폭 128 의 R-SWA로 모든 표준 어텐션을 전면 교체하는 것이 단일 페이지 PDF 문서 OCR에서 효과적일 뿐 아니라 무손실(lossless)임을 입증한 셈입니다.
또한 Unlimited OCR은 DeepSeek OCR의 장점을 모두 물려받습니다. 활성 파라미터가 $0.5$B에 불과한 MoE 구조 덕에 추론 효율이 매우 높아, OmniDocBench의 Base DeepEncoder 모드에서 DeepSeek OCR의 4951 TPS 대비 5580 TPS로 약 12.7\% 빠릅니다. OmniDocBench의 평균 문서 길이가 비교적 짧다는 점을 감안하면, 출력이 길어질수록 이 격차는 더욱 벌어집니다.
문서 유형별 분석
OmniDocBench v1.5는 PPT, 학술 논문, 책, 컬러 교과서, 시험지, 잡지, 신문, 노트, 연구 보고서 등 9 가지 문서 유형을 제공해, R-SWA의 효과를 더 체계적으로 들여다볼 수 있습니다. DeepSeek OCR과 비교하면 Unlimited OCR(UOW)은 모든 지표에서 일관되고 뚜렷한 향상을 보이며, 저자들은 이를 "손해 없는 개선, 즉 진정한 공짜 점심(free lunch)" 이라 표현합니다. 아래는 레이아웃이 복잡한 대표 유형의 텍스트 편집 거리입니다.
| 텍스트 편집 거리 \downarrow | 신문 | 노트 | 잡지 | 컬러 교과서 | PPT |
|---|---|---|---|---|---|
| DeepSeek OCR | 0.131 | 0.145 | 0.049 | 0.130 | 0.052 |
| DeepSeek-OCR 2 | 0.139 | 0.068 | 0.026 | 0.053 | 0.031 |
| Unlimited OCR | \mathbf{0.081} | \mathbf{0.066} | \mathbf{0.020} | \mathbf{0.046} | \mathbf{0.025} |
특히 복잡한 레이아웃에서 격차가 큽니다. 신문은 DeepSeek OCR의 0.131 에서 0.081 로, 노트는 0.145 에서 0.066 으로 텍스트 편집 거리가 크게 줄어듭니다. 한 단계 더 강한 DeepSeek-OCR 2와 비교해도 텍스트 편집 거리와 읽기 순서 모두 9 개 유형 중 7 개에서 앞섭니다. DeepSeek-OCR 2가 근소하게 우세한 경우는 텍스트에서 학술 논문과 시험지, 읽기 순서에서 시험지와 연구 보고서 정도이며, 그 차이도 0.01 안팎에 그칩니다. LLM 디코더의 모든 표준 어텐션을 R-SWA로 교체하는 것이 파싱 작업에서 완전하고 견고함을 다시 확인할 수 있습니다.
장문 파싱 성능
장문 파싱은 Unlimited OCR이 새롭게 여는 능력입니다. 그동안 두 가지 장애물이 이를 가로막았습니다. 첫째, 지나치게 긴 출력 시퀀스가 최대 토큰 한계를 쉽게 넘어섭니다. 둘째, 출력 지연이 시퀀스 길이와 함께 커져 수십 페이지 문서의 OCR이 점점 느려집니다. R-SWA를 갖춘 Unlimited OCR은 수십에서 수백 페이지를 한 번에 프리필하고 첫 페이지부터 마지막 페이지까지 연속적으로 파싱하는데, 이 과정 내내 KV 캐시가 고정되어 출력 지연이 일정하게 유지됩니다.
연구팀은 소설, 문서, 논문을 페이지 수별로 나눠(2, 5, 10, 15, 20, 40+ 페이지, 각 범주마다 책 10 권 이상) 자체 테스트셋을 구성하고, 생성된 텍스트에서 전체 n-gram 대비 고유(unique) n-gram의 비율인 Distinct-n(값이 높을수록 반복이 적어 좋음)과 편집 거리를 측정했습니다.
| 페이지 수 | 2 | 5 | 10 | 15 | 20 | 40+ |
|---|---|---|---|---|---|---|
| Distinct-20 \uparrow | 99.76\% | 99.78\% | 97.49\% | 99.92\% | 98.73\% | 96.08\% |
| Distinct-35 \uparrow | 99.87\% | 99.98\% | 99.83\% | 99.99\% | 99.89\% | 96.90\% |
| Edit Distance \downarrow | 0.0362 | 0.0452 | 0.0526 | 0.0787 | 0.0572 | 0.1069 |
20 페이지를 동시에 입력해도 편집 거리 0.0572, Distinct-35 99.89\% 로 강력한 성능이 유지되고, 40 페이지 이상에서도 편집 거리가 0.11 미만, Distinct-35가 97\% 수준입니다. Distinct-n이 끝까지 높게 유지된다는 것은 모델이 같은 구절을 반복해서 토해내는 붕괴(degeneration) 없이 끝 페이지까지 진행 위치를 놓치지 않았다는 뜻입니다. 반복 오류가 나타나는 경우를 살펴보면 대부분 PDF의 작은 글자를 분간하기 어려운 지점에서 발생했는데, 이는 다중 페이지 조건에서 DeepEncoder의 Base 모드(1024\times1024 해상도)를 쓴 탓이지 R-SWA가 장문 파싱 과정에서 방향을 잃어서가 아니라고 분석합니다.
효율성 분석
Unlimited OCR의 가장 실용적인 강점은 출력이 길어질수록 더 분명해집니다. 연구팀은 이상적인 동시성 조건에서 두 모델의 초당 출력 토큰 수(TPS)를 비교했습니다. 프리필 길이를 10 으로 고정하고 나머지 설정을 동일하게 둔 결과입니다.
| 출력 길이(TPS) | 256 | 1024 | 2048 | 4096 | 6144 |
|---|---|---|---|---|---|
| DeepSeek OCR | 7229 | 7423 | 7167 | 6430 | 5823 |
| Unlimited OCR | 7230 | 7841 | 7881 | 7905 | 7848 |
256 토큰 지점에서는 두 모델의 추론 속도가 사실상 동일합니다. 그러나 출력 길이가 늘어날수록 DeepSeek OCR의 TPS는 꾸준히 하락하는 반면 Unlimited OCR은 평탄하게 유지되며, 6{,}000 토큰 부근에서 DeepSeek OCR은 R-SWA를 적용한 Unlimited OCR보다 약 35\% 뒤처집니다. 일정한 생성 속도가 장문 OCR 작업의 핵심 요건임을 보여주는 결과입니다.
Unlimited OCR 설치 및 사용 방법
Unlimited OCR은 모델 가중치와 코드가 모두 공개되어 있어, Hugging Face의 transformers 또는 고성능 추론 엔진 SGLang으로 바로 사용할 수 있습니다.
transformers 기반 추론은 다음과 같이 모델을 불러온 뒤 infer(단일 이미지) 또는 infer_multi(다중 페이지/PDF)를 호출합니다. 단일 이미지는 gundam과 base 두 설정을, 다중 페이지/PDF는 base(image_size=1024)만 지원합니다.
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,
).eval().cuda()
# 단일 이미지 (gundam 모드)
model.infer(
tokenizer,
prompt='<image>document parsing.',
image_file='your_image.jpg',
output_path='your/output/dir',
base_size=1024, image_size=640, crop_mode=True,
max_length=32768,
no_repeat_ngram_size=35, ngram_window=128,
save_results=True,
)
# 다중 페이지 (base 모드)
model.infer_multi(
tokenizer,
prompt='<image>Multi page parsing.',
image_files=['page1.png', 'page2.png', 'page3.png'],
output_path='your/output/dir',
image_size=1024,
max_length=32768,
no_repeat_ngram_size=35, ngram_window=1024,
save_results=True,
)
대량 처리에는 SGLang 서버를 띄우고 OpenAI 호환 API로 스트리밍 요청을 보내는 방식이 권장됩니다. 저장소의 infer.py는 SGLang 서버를 자동으로 시작하고 이미지 디렉토리나 PDF에 대해 동시 요청을 보냅니다.
# 이미지 디렉토리
python infer.py \
--image_dir ./examples/images \
--output_dir ./outputs \
--concurrency 8 \
--image_mode gundam
# PDF 페이지
python infer.py \
--pdf ./examples/document.pdf \
--output_dir ./outputs \
--concurrency 8 \
--image_mode gundam
PDF는 PyMuPDF로 페이지를 이미지로 변환한 뒤 다중 페이지 파싱으로 처리합니다. 반복 생성을 억제하기 위해 no_repeat_ngram_size와 ngram_window 옵션을 함께 사용하는 점이 특징입니다.
한계점 및 향후 연구 방향
저자들은 현재 모델이 "유한한 컨텍스트 길이(예: $32$K)에서 진정으로 무제한인 파싱을 달성하지는 못한다" 고 솔직하게 밝힙니다. R-SWA가 디코드 측 캐시는 상수로 묶지만, 모델은 여전히 프리필 길이에 제약을 받기 때문입니다. DeepEncoder가 이미지 토큰을 강하게 압축하더라도, 페이지가 쌓일수록 프리필 자체는 길어집니다.
이에 대한 향후 계획은 두 갈래입니다. 단기적으로는 $128$K처럼 더 긴 컨텍스트 길이로 모델을 학습해 더 많은 페이지의 프리필을 지원할 예정입니다. 장기적으로는 프리필 풀(prefill pool) 을 구축하고 모델이 프리필 KV 청크를 자동으로 가져오도록 학습시켜, "사람이 책장을 넘기는 효과" 를 모사함으로써 진정한 의미의 무제한 OCR을 실현하려 합니다. 또한 R-SWA를 음성 인식(ASR)이나 번역처럼 장문 의존성을 요구하는 참조 기반(reference-based) 작업으로 확장할 계획입니다.
이 연구의 더 큰 의미는 OCR 한 분야를 넘어섭니다. Unlimited OCR은 "디코더의 모든 표준 어텐션을 인과적 참조 기반 SWA로 교체해도 파싱 성능이 무손실로 유지된다" 는 점을 실증했습니다. 이는 모델이 과거 출력에서 유용한 정보를 윈도우로 끊임없이 흘려보내는 법을 학습한다는 뜻이며, 사람이 책을 필사할 때 보이는 소프트 망각과 정확히 일치합니다. 무거운 컨텍스트 확장에 의존하지 않고도 선형 복잡도 어텐션으로 장문 파싱을 달성할 수 있음을 보인 이 결과는, 어텐션 연산과 메모리 사용량이 더 이상 장문 파싱의 병목이 되지 않는 미래로 가는 우아한 이정표라 할 수 있습니다.
Unlimited OCR Works 논문
Unlimited-OCR GitHub 저장소
Unlimited-OCR (Hugging Face)
DeepSeek OCR 논문 (베이스라인)
Unlimited OCR이 베이스라인으로 삼은 DeepEncoder와 MoE 디코더의 원본 모델입니다.
더 읽어보기
-
DPO로 텍스트 퇴화 줄이기: 모델의 실패 출력을 거부 쌍으로 쓰는 방법에 대한 연구 (feat. DharmaOCR)
-
Jina AI, 텍스트와 이미지, 오디오, 비디오를 하나의 임베딩 공간에 담는 jina-embeddings-v5-omni 공개
-
KO-VLM-Benchmark: Marker AI가 공개한, 한국어 문서 및 시각 요소(도해, 표 등) 이해 능력 벤치마크
-
GLM-OCR: 0.9B 파라미터로 SOTA 성능을 달성한 초경량 오픈소스 OCR 모델 (feat. Z.ai)
-
Unsloth AI, 자사의 Unsloth 프레임워크를 사용하여 Google Colab에서 DeepSeek-OCR 실행 및 파인튜닝하는 문서 공개
이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. ![]()
파이토치 한국 사용자 모임
이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일
로 보내드립니다!
텔레그램(Telegram)이나 Slack/Discord/Teams/Dooray/GoogleChat 등으로도 새 글 알림을 받으실 수 있습니다. ![]()
아래
쪽에 좋아요
를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ ![]()



