TT Lab
Blog

한국어 English

Get started
Blog

Blog

Korean Document OCR Comparison 1: Re-evaluating PP-OCRv5, PaddleOCR-VL-1.6, and Unlimited-OCR-2 on the Same 60 Pages

Status: Measured (October 29 to October 30, 2026, using a single 24GB consumer GPU). All numbers are derived from raw data measured firsthand (raw outputs per page, measurement logs, and scoring scripts). Paper figures are noted along with the section and table numbers verified from the original texts; unmeasured items are marked as 〈Unmeasured〉, and items not found in the original texts are marked as 〈Unverified〉. Installation notes and security memos have been gathered separately in Part 2.

Table of Contents

1. What We Measured and Why

OCR (Optical Character Recognition) is the task of extracting text from images or scanned pages. The traditional approach consists of two stages: first, locating lines of text on a page (detection), and then cropping each detected line to read the characters (recognition). Nowadays, Vision Language Models (VLMs, language models that accept images as input) that view the entire image and directly output Markdown occupy the top ranks of document OCR leaderboards. Vision Language Model (VLM, a language model that takes images as input) occupies the top of the document OCR leaderboard.

We selected three engines for this evaluation. Although all three originate from the same corporate ecosystem (Baidu), their methods of reading pages differ.

Engine Single Line Version Used
PP-OCRv5 Korean Classical detection + recognition pipeline. Two small specialized models PaddleOCR 3.7.0, Detection PP-OCRv5_server_det, Recognition korean_PP-OCRv5_mobile_rec
PaddleOCR-VL-1.6 Layout model segments the page into elements, and a 0.9B VLM reads each element PaddleOCR 3.7.0, PaddleOCR-VL-1.6
Unlimited-OCR-2 compresses images into visual tokens, and a 3B MoE decoder reads multiple pages at once baidu/Unlimited-OCR-2(released Oct 27, 2026), Transformers 4.52.1

Why we had to measure it ourselves. Because major document OCR benchmarks do not include Korean.

Therefore, there are three questions: Which of the three is the most accurate on Korean documents? How fast are they, and how much memory do they consume? And when they make mistakes, how do they fail?

2. How the Three Engines Read Differently

세 엔진은 쪽을 이렇게 읽는다 왼쪽에서 오른쪽으로. 회색 글자는 우리가 쓴 설정 PP-OCRv5 한국어: 고전 파이프라인 글줄 검출 server_det 줄마다 인식 korean mobile_rec 위에서 아래로 줄 글자 잇기 작은 전용 모델 둘. 쪽 구조는 모른다 PaddleOCR-VL-1.6: 레이아웃 + 작은 VLM 레이아웃 PP-DocLayoutV3 요소마다 잘라 0.9B VLM 읽는 순서대로 마크다운 VLM 은 잘린 요소 하나만 본다 Unlimited-OCR-2: 광학 압축 + 긴 디코딩 DeepEncoder 16배 압축 3B MoE 디코더 활성 약 0.5B 여러 쪽을 한 번에 출력 SR-SWA: 단계마다 약 512토큰만 참조 Unlimited-OCR-2 의 한 쪽은 Gundam(타일) 모드, 여러 쪽은 Base 모드(쪽당 시각 토큰 273개)로 읽는다
Figure: How the three engines read pages

PP-OCRv5 Koreandoes not understand page structure. The detector finds text line boxes, and the recognizer produces characters for each line. The output is a sequence of line texts from top to bottom. According to the PaddleOCR 3.0 technical report (arXiv 2507.05595, §2.1), this family totals about 0.07B parameters and is under 100MB (based on the report's baseline model; the size of the Korean recognition model is unverified).

PaddleOCR-VL divides the work into two parts (1.0 paper arXiv 2510.14528, §2.1). A layout model (PP-DocLayoutV3 starting from v1.5) determines "what is where and in what order," and then a 0.9B VLM (NaViT-style dynamic resolution encoder + ERNIE-4.5-0.3B) reads the content of a single cropped element. The VLM does not look at the entire page at once. Version 1.6 (arXiv 2606.03264) keeps the architecture unchanged while updating only the data and post-training. It selected and reinforced error-prone samples (predictions diverging across 8 checkpoints and 16 types of distortions, ancient texts, and rare characters), followed sequentially by CPT, SFT, and GRPO reinforcement learning (§3, §4).

Unlimited-OCR-2 's backbone is the "optical compression" from DeepSeek-OCR (arXiv 2510.18234). An encoder (DeepEncoder) reduces a 1024×1024 image 16x into around 256 visual tokens, and a 3B MoE (Mixture of Experts, using only some experts per token) decoder generates the text. What the Part 2 report (HF public PDF, p.5-7) adds is SR-SWA(Sparse-Reference Sliding-Window Attention). Every time the decoder generates the next token, instead of looking at all visual tokens across all pages, it looks only at a few blocks of that page and the immediately preceding output. Calculated using the configuration parameters we received, this is remote 12 blocks × 32 + local 128 = 512 tokens, which matches the "512 tokens" in the model card. This mechanism ensures that the computational cost of a single step does not increase even as the number of pages grows.

There is also an interesting link in the training data of the two VLMs. The pseudo-labels (labels generated by another model instead of humans) for Unlimited-OCR-2 were extracted from MinerU2.5-Pro and PaddleOCR-VL-1.6 (Part 2 report, p.8). The two VLMs in this comparison also share a teacher-student relationship.

3. Test Documents and Scoring

Creating documents with known ground truth

Real scanned documents require humans to type out the ground truth text character by character. So we did the reverse. We decided on the ground truth text first and rendered the pages using that text. The body text was extracted from TT Lab's technical study notes, focusing on paragraphs where Korean accounts for over 40%, rendered at A4 size (150dpi, 1240×1754 pixels) using a single Apple SD Gothic Neo font. The 60 pages were divided as follows.

Bundle pages Method Ground Truth Length (after normalization)
Standard Body Text 8 Single-column body text, 26px font 9,833
Blurred Copy 8 8 pages of standard body text with Gaussian blur → rotated 1.5 degrees → scaled down 0.6x → JPEG quality 35 9,833
Korean Table 4 6-column, 23-row grid table with Korean headers 2,285
Long Document 40 40 pages of different paragraphs, 24px font 48,878

The blurred copy has the exact same text as the standard body. Therefore, the difference between the two sets of the same engine represents "errors caused by degraded image quality."

Scoring: Two Types of Character Error Rate (CER)

CER(Character Error Rate) is the minimum number of edits (insertions, deletions, substitutions) required to convert the ground truth into the output, divided by the length of the ground truth text. A 1% rate means roughly one error per 100 characters. Edit distance was calculated using Myers' (1999) bit-parallel algorithm.

Since output formats vary by engine, we first normalizethem. We standardize to Unicode NFKC, remove markdown symbols (#, *, | , etc.), HTML tags, and coordinate markers added by the model, and strip all spaces and line breaks. Since spacing and line wrapping depend on the layout, only the character sequence is compared.

Then, we compute CER twice.

The reason for maintaining two separate metrics is that engines vary significantly in how they handle punctuation. Combining them into a single score would make an engine that frequently drops punctuation and an engine that misreads Korean look like they have the same score. Use cases where only the text matters (like search indexing) and use cases where documents need to be read by humans require looking at different numbers.

Scoring Pitfall: Leaving Coordinates Results in a 16% CER

The output of Unlimited-OCR-2 includes coordinates for each block. For example, it looks like this.

<BLOCK>text[71, 96, 900, 160]<FORK>우리에게 의미는 「언젠가 휴대폰 안에서 …

Initially, the scorer removed only <…> tags and kept text[71, 96, 900, 160] . As a result, the median CER for standard body text came out to 16.3%(ranging from 13.9% to 17.5% per page). Adding one more coordinate regex line brought it down to 0.80% . For the blurred copy, it dropped from 16.95% to 1.99%, and for the table, from 8.38% to 0.17% (recalculated with the same output and ground truth). A 20-fold difference came from a single output format detail. When evaluating VLM outputs, the proper procedure is to first visually inspect a few pages of the raw output and adjust the normalization rules.

4. Results: Accuracy, Speed, Memory

Engine Set Pages Full CER (Median) Full CER (Max) Text-Only CER (Median) Sec/Page Max GPU Memory
PP-OCRv5 Korean Standard Body Text 8 1.52% 2.37% 0.33% 0.36 2.27 GiB
Blurred Copy 8 4.47% 4.89% 1.23% 0.20 2.27 GiB
Korean Table 4 0.00% 0.00% 0.00% 0.30 2.27 GiB
Long Document (per page, 40 pages) 40 1.41% 0.49% 0.34 2.27 GiB
PaddleOCR-VL-1.6 Standard Body Text 8 0.48% 1.71% 0.28% 13.81 5.80 GiB
Blurred Copy 8 1.51% 2.68% 0.83% 14.04 5.80 GiB
Korean Table 4 0.00% 0.00% 0.00% 8.59 5.90 GiB
Long Document (per page, 40 pages) 40 0.53% 0.37% 14.39 5.80 GiB
Unlimited-OCR-2 Standard Body Text 8 0.80% 0.98% 0.75% 31.07 6.85 GiB
Blurred Copy 8 1.99% 3.25% 1.76% 30.91 6.85 GiB
Korean Table 4 0.17% 0.71% 0.19% 21.52 6.85 GiB
Long Document (10 pages at once) 10 2.72% 2.01% 38.07 7.59 GiB
Long document (20 pages at once) 20 2.59% 2.00% 41.21 8.81 GiB

How to read: The median is the middle value of the CERs calculated per page. For an even number of pages, like 8 pages, the upper value (the fifth one) was used. For long documents, they were graded as a single block, resulting in a single value. Time is the average measured excluding one warmup page, and for long documents, the total time was divided by the page count. Memory is the peak value recorded by each framework's allocator ( max_memory_allocated), so it is smaller than the value shown in nvidia-smi . No page failed across all 13 batches.

글자 오류율: 문장 부호를 빼면 순위가 바뀐다 ● 전체 CER(문장 부호 포함) ○ 글자만 CER(한글·영문·숫자) 일반 본문 8쪽(쪽마다 중앙값) PP-OCRv5 한국어 1.52 / 0.33 PaddleOCR-VL-1.6 0.48 / 0.28 Unlimited-OCR-2 0.80 / 0.75 흐린 사본 8쪽(쪽마다 중앙값) PP-OCRv5 한국어 4.47 / 1.23 PaddleOCR-VL-1.6 1.51 / 0.83 Unlimited-OCR-2 1.99 / 1.76 한국어 표 4쪽(쪽마다 중앙값) PP-OCRv5 한국어 0.00 / 0.00 PaddleOCR-VL-1.6 0.00 / 0.00 Unlimited-OCR-2 0.17 / 0.19 긴 문서 앞 10쪽(한 덩어리) PP-OCRv5 한국어 1.53 / 0.50 PaddleOCR-VL-1.6 0.58 / 0.39 Unlimited-OCR-2 2.72 / 2.01 0% 1% 2% 3% 4% 5% 오른쪽 숫자: 전체 / 글자만(%). 표는 세 엔진 모두 거의 0 긴 문서는 Unlimited-OCR-2 만 10쪽을 한 번에, 나머지는 쪽마다 읽음
Figure: Character Error Rate: Overall CER and Character-only CER

There are three key takeaways from the figure.

PaddleOCR-VL-1.6 was the most accurate across all four batches. The overall CER of 0.48% for regular body text means about six characters out of roughly 1,230 per page were wrong. For tables, it was 0% across all 4 pages along with PP-OCRv5.

The rankings change when punctuation is excluded. In terms of overall CER, Unlimited-OCR-2 (0.80%) is better than PP-OCRv5 (1.52%). However, when counting only characters, the order reverses with PP-OCRv5 at 0.33% and Unlimited-OCR-2 at 0.75%. This is even more distinct in blurry copies. For overall CER, PP-OCRv5 is the worst of the three at 4.47%, but its character-only CER is 1.23%, which is better than Unlimited-OCR-2 (1.76%). Most of PP-OCRv5's errors are punctuation, while most of Unlimited-OCR-2's errors are characters. In the figure, a long bar between two points means there are many punctuation errors. Unlimited-OCR-2 has almost no bar.

Reading multiple pages at once roughly tripled the errors for Unlimited-OCR-2. Comparing the first 10 pages of the same long document, PaddleOCR-VL-1.6 is 0.58%, PP-OCRv5 is 1.53%, and Unlimited-OCR-2 is 2.72% (the values for the first 10 pages were recalculated by trimming the 40-page output to match the end of the 10 ground-truth pages, and applying the same method to the entire 40 pages yields the 0.53% and 1.41% shown in the table). The difference from reading page by page (0.80% for regular body text) stems from the resolution mode. Single pages are read using Gundam mode, which splits them into tiles for close inspection, while multiple pages are read using Base mode with 273 visual tokens per page. Section 5 provides a practical example.

속도와 메모리: 같은 GPU, 배치 1, 서빙 엔진 없이 위 세 줄은 일반 본문 8쪽 평균, 아래 두 줄은 긴 문서 묶음 쪽당 걸린 시간 PP-OCRv5 한국어 0.36초 PaddleOCR-VL-1.6 13.81초 Unlimited-OCR-2 31.07초 UOCR-2, 10쪽 한 번에 38.07초 UOCR-2, 20쪽 한 번에 41.21초 최대 GPU 메모리(할당기 기준) PP-OCRv5 한국어 2.27 GiB PaddleOCR-VL-1.6 5.80 GiB Unlimited-OCR-2 6.85 GiB UOCR-2, 10쪽 한 번에 7.59 GiB UOCR-2, 20쪽 한 번에 8.81 GiB Unlimited-OCR-2 는 모델 카드가 「빠른 시험용」이라 부르는 Transformers 경로로 쟀다. 저자가 권하는 SGLang 서빙은 미실측
Figure: Speed and GPU memory

The processing speeds are on a completely different scale. For a single standard body page, PP-OCRv5 took 0.36 seconds, PaddleOCR-VL-1.6 took 13.81 seconds (about 38 times slower), and Unlimited-OCR-2 took 31.07 seconds (about 86 times slower). Simply converting this to an hourly rate yields 10,000 pages, about 260 pages, and about 116 pages, respectively. The reason PP-OCRv5 was even faster on the blurry copy (0.20 seconds) is because the image was scaled down to 0.6x. As for memory usage, PP-OCRv5 used 2.27 GiB, PaddleOCR-VL-1.6 used 5.80 GiB, and Unlimited-OCR-2 used 6.32 GiB for weights alone, increasing with the page count: 6.85 GiB for 1 page, 7.59 GiB for 10 pages, and 8.81 GiB for 20 pages. A 24GB graphics card has plenty of headroom for all three.

However, the execution times for the two VLMs reflect our implementation method, not the limitations of the models themselves. We will explore the reasons in Section 6.

5. Actual Output Comparison

Let us look at the actual outputs following the numbers. The two figures below show the exact same location on page 2. The top image is a pixel-for-pixel crop of the image received by the engine, and the bottom image shows the outputs of the three engines aligned to their ground truth positions. This page was chosen because it contains a diverse mix of error types (the CER for page 2 of the general body text is 0.09% for PaddleOCR-VL-1.6, 0.26% for Unlimited-OCR-2, and 1.57% for PP-OCRv5, which is slightly better than the bundle median).

같은 쪽, 세 엔진의 실제 출력: 일반 본문 2쪽 위: 엔진이 받은 이미지 조각. 아래: 각 엔진의 출력 굵은 밑줄 = 틀리게 읽은 글자, 취소선 = 빠뜨린 글자 드문 받침: 「쟀」 PP-OCRv5 한국어 2026-10-13 에 졌습니다(5절 끝: 틀린 곳 1 PaddleOCR-VL-1.6 2026-10-13 에 잤습니다(5절 끝: 틀린 곳 1 Unlimited-OCR-2 2026-10-13 에 잤습니다(5절 끝: 틀린 곳 1 낫표 「 」 와 쉼표 PP-OCRv5 한국어 0.60 으로 '아마 탁구대,라고 했을 책상이, 틀린 곳 2 PaddleOCR-VL-1.6 0.60 으로 「아마 탁구대」라고 했을 책상이, 맞음 Unlimited-OCR-2 0.60 으로 「아마 탁구대」라고 했을 책상이, 맞음 뜻이 뒤집히는 「없 → 있」 PP-OCRv5 한국어 메시지도 없습니다. 맞음 PaddleOCR-VL-1.6 메시지도 없습니다. 맞음 Unlimited-OCR-2 메시지도 있습니다. 틀린 곳 1 띄어쓰기는 채점에서 빼므로 정답의 띄어쓰기로 보여 준다
Figure: Same side, actual output of the three engines: General Body Page 2
같은 쪽, 세 엔진의 실제 출력: 흐린 사본 2쪽 위: 엔진이 받은 이미지 조각. 아래: 각 엔진의 출력 굵은 밑줄 = 틀리게 읽은 글자, 취소선 = 빠뜨린 글자 드문 받침: 「쟀」 PP-OCRv5 한국어 2026-10-13 에 겠습니다(5절 끝: 틀린 곳 1 PaddleOCR-VL-1.6 2026-10-13 에 졌습니다(5절 끝: 틀린 곳 1 Unlimited-OCR-2 2026-10-13 에 겠습니다(5절 끝: 틀린 곳 1 낫표 「 」 와 쉼표 PP-OCRv5 한국어 0.60 으로 「아마 탁구대,라고 했을 책상이, 틀린 곳 3 PaddleOCR-VL-1.6 0.60 으로 「아마 탁구대,라고 했을 책상이, 틀린 곳 1 Unlimited-OCR-2 0.60 으로 「아마 탁구대」라고 했을 책상이, 맞음 뜻이 뒤집히는 「없 → 있」 PP-OCRv5 한국어 메시지도 없습니다. 틀린 곳 1 PaddleOCR-VL-1.6 메시지도 없습니다. 맞음 Unlimited-OCR-2 메시지도 있습니다. 틀린 곳 1 흐린 사본에서만: 「둘 → 돌」 PP-OCRv5 한국어 공개 가중치 둘(라켓 찾기 맞음 PaddleOCR-VL-1.6 공개 가중치 돌(라켓 찾기 틀린 곳 1 Unlimited-OCR-2 공개 가중치 돌(라켓 찾기 틀린 곳 1 띄어쓰기는 채점에서 빼므로 정답의 띄어쓰기로 보여 준다
Figure: Same side, actual outputs of the three engines: 2 blurry copies

Rare base: "&#xcfc5;" was not read even once by all three

"Jaesseumnida" (jaetda, the past tense of jaeda) appears 7 times on page 8 of the general body text. All three engines got it wrong all 7 times. This is also true for the clean general body text.

How "Jaet" was read General body text (7 times) Blurry Copy (No. 7)
PP-OCRv5 Korean Lost 7 Fine 4, Would be 3
PaddleOCR-VL-1.6 jat 6, chaeng 1 jyeot 2, chae 2, jat 1, jjal 1, chaet 1
Unlimited-OCR-2 jat 2, jaet 2, sseot 1, get 1, jat 1 get 3, jjo 2, kyeo 1, chaeng 1

PP-OCRv5 always read it as "jyeot" on the clean side. The recognizer picks an answer only from a fixed character dictionary; if "jaet" is not in that dictionary, it is consistently replaced with the most similar character like this (it is unconfirmed whether it is actually missing from the dictionary). The answers of the two VLMs are scattered. It seems that among similarly shaped characters, the language model leans toward the one it has seen more frequently. Since this is a final consonant rarely seen in everyday documents, it is highly likely that it was scarce in the training data of all three engines.

There are more similar characters. "hip" (found in read, disclosed, heap memory) appears 5 times in the regular body text, but Unlimited-OCR-2 read it as "him" or "rip" all 5 times, PaddleOCR-VL-1.6 got them all right, and PP-OCRv5 was wrong once. For "sseup" in "sseumnida", only Unlimited-OCR-2 read it as "ssing" (2 out of 3 times in regular body text, and all 3 times in blurred copies). Conversely, for "rael" in "rally", PP-OCRv5 (ael) and PaddleOCR-VL-1.6 (raem, ral) got it wrong, while Unlimited-OCR-2 got it right on the clean side. No engine is safe with rare characters, and each engine has different weak characters.

Errors that flip meanings: "does not exist → exists"

Unlimited-OCR-2 read "eop" as "it". This happens 2 out of the 14 times "eop" appears in the regular body text, and the same 2 times in the blurred copies. An example from the image is when "there is no message telling you why it is so does not exist" becomes "message exists". In terms of CER, it is just one character out of 1,150, or 0.09 percentage points, but the meaning of the sentence becomes completely opposite. Both Paddle engines got it right all 14 times.

This error is difficult to explain solely by character shape. "eop" and "iss" have quite different final consonant shapes. When visual evidence is weak, it appears to be an error where the decoder's language knowledge fills in the more common one. The PP-OCRv6 paper (arXiv 2606.13108) also raises this kind of "hallucination" in VLM-based OCR as an issue. For documents where a single negative word matters, such as contracts or test results, VLM outputs must assume a human review workflow.

Punctuation: PP-OCRv5 changes quotation marks and erases them when blurred

Almost all of the factors that drove up the overall CER of PP-OCRv5 are punctuation marks. Counting the error types (aligning normalized characters and counting discrepancies) in the regular body text, changing 「 to ' occurred 46 times, and changing 」 to ] occurred 42 times. In blurred copies, instead of changing them, they were erased. There were 60 deletions of periods, 39 deletions of 「, 38 deletions of commas, 36 changes from commas to periods, 30 deletions of 」, and 28 deletions of middle dots ·. Small, blurred dots appear not to be captured as characters during the detection stage.

The two VLMs also misplace punctuation marks, but with a much lower frequency. For PaddleOCR-VL-1.6, changing 「 to ‘ or ' in blurred copies occurred 18 times, while for Unlimited-OCR-2, deleting middle dots 18 times and changing 「 to ' 11 times were the most common errors in blurred copies.

Let us also point out a small flaw on the grader side. All three engines read the dash – in the correct answer as a hyphen -, and since normalization treats hyphens as Markdown symbols and removes them, it counted "dash deletion" 4 times per batch. Strictly speaking, the dashes were replaced with hyphens, but since they were fed identically to all three engines, the rankings remain unchanged.

Resolution drop in multi-page mode

When Unlimited-OCR-2 reads a 10-page long document all at once, the output contains errors that are hard to see when reading page by page. Examples include "increases → is played around with", "feels → chae-gap", "mention → dancer", "light → bakkwi-on", "comment → reply" (3 times), and "rally → mwolli". Instead of just a single character, two or three characters collapse together and are replaced by visually similar words. The CER for the first 10 pages of PaddleOCR-VL-1.6, which read the exact same pages individually, was 0.58%.

The cause has already been pointed out in the paper. In Table 3 of DeepSeek-OCR, dense Chinese characters in the same Base mode have an edit distance about 4 times that of English (0.205 vs. 0.054), which improves to 0.097 in the token-extended Gundam mode. The Unlimited-OCR Part 1 report (arXiv 2606.23050, &sect;5.4) also notes that most errors in documents exceeding 40 pages are because it could not read small text in Base mode I write that it happened. Hangul is also a square-shaped letter with final consonants (batchim), so it is closer to Chinese. Our results match that explanation. When visual tokens per page are reduced to 273, the final consonants of 24px Hangul get blurred.

6. Why is it so slow, and why you shouldn't judge by these numbers

The 30 seconds per page of Unlimited-OCR-2 is far from the speed in the paper. However, the two numbers are of different kinds.

Paper numbers are concurrent throughputs. The 5,580 TPS (tokens per second, §5.2) of Unlimited-OCR Paper 1 is the sum of 512 concurrent requests, and the 1,315 TPS in Table 4 of Paper 2 is for a batch size of 16. Dividing by a single request yields about 11 and about 82 tokens/second, respectively. The approximately 3.8ms per step in Figure 6(b) of Paper 2 was measured with batch size 3. The hardware is undisclosed (unverified) for all three figures. We had 37.9 tokens per second and 26.4ms per step in batch size 1 (calculated by dividing the 9,426 output tokens on page 8 of the main text by 248.6 seconds).

The hardware share is not large. Batch 1 decoding is memory bandwidth-bound because weights must be read from memory at every step. The bandwidth of the A800 80GB tested by the model card is 1,935 GB/s (official specs), and our GPU is about 936 GB/s, a difference of about 2.1x. Reading about 0.57B active parameters in bf16 (2 bytes) takes about 1.14 GB per step, so the theoretical lower bound for our GPU is also about 1.2ms per step (estimated). The measured 26ms is over 20 times that. The bottleneck is not the hardware, but the execution path.

The Transformers path is for "quick testing". The model card calls it that and recommends SGLang for serving. The remote code we received (revision 5632329a) makes the reason clear. It is a Python loop that yields tokens one by one and lacks CUDA graphs. At each MoE layer, tokens_per_expert.cpu() synchronizes the GPU and CPU, and decoding attention does not compute only selected blocks; instead, it copies the entire cache to fp32, performs dense matrix multiplication, and masks it. The result is identical to sparse attention, but the computation is dense. As a result, the 20-page batch took 2.16 times longer than the 10-page batch (while generating 1.96 times more output tokens). This accounts for the step time increasing by about 10%, from 27.7ms to 30.6ms.

What SR-SWA promises is that "each step takes a constant amount of time." Since the total time is proportional to the number of output tokens, it is natural for it to scale linearly with the page count. What SR-SWA prevents is the quadratic growth of full attention. In Part 2, Figure 6(b), the difference diverges significantly from 50 pages to over 100 pages (at 100 pages, full attention takes about 26.7ms versus SR-SWA taking about 3.9ms, estimated visually from the chart). Our measurements with 10 and 20 pages cannot verify the benefits of SR-SWA.

PaddleOCR-VL is in the same situation. We read the pages sequentially using Paddle's dynamic graph without vLLM or FastDeploy servers. Paper v1.0, Table 13 reports 1.62 pages/sec with FastDeploy and 1.35 pages/sec with vLLM by packing 512 PDFs onto a single A100. Appendix Table A2 and version 1.5 Table A8 also report 0.36 to 0.54 pages/sec on entry-level consumer GPUs. This is more than ten times faster than our 0.07 pages/sec (13.81 seconds). Since this is batch throughput, it cannot be directly compared.

Therefore, based on these results, do not apply to the following claims:

7. What to Choose

Recommendations are limited to the scope of our actual measurements: Korean single-paragraph body text, grid tables, a single 24GB GPU, and batch size 1.

Task Recommendation Basis and Cautions
Fast processing of many pages for search indexing PP-OCRv5 Korean 0.36 seconds per page, 2.27 GiB. Text-only CER 0.33% (blurred copies 1.23%). Quotation marks and periods may change or disappear.
Human-readable results, blurred scans PaddleOCR-VL-1.6 Most accurate across all four bundles (general 0.48%, blurred 1.51%). 14 seconds per page with our path; for large volumes, measure vLLM and FastDeploy serving separately.
Multi-page tables and paragraphs, long books Judgment reserved based on our measurements Unlimited-OCR-2 was the weakest of the three in character accuracy (around 2.6% in multi-page mode), and structural advantages were not measured. Needs separate measurement via the SGLang path.
Documents where negations and numbers are critical Any engine requires mandatory review "Measured" failed all 7 times across the board, and VLMs can invert meanings (e.g., changing "none" to "exist").

Another option is combining the classical pipeline with a VLM. For example, processing all documents with PP-OCRv5 first to build an index, and re-reading only pages intended for human reading or those with low confidence using PaddleOCR-VL-1.6. The effectiveness of this combination has not been measured.

8. Limitations

A word from Titi. All three engines read "jaessumnida" (measured) twenty-one times and got it wrong every single time. It would be troublesome if you meant to write that you measured the speed of a ping-pong ball, but wrote that you slept instead! That is why OCR results are not chosen solely by a single number, but by looking at what and how they get things wrong.

References

All original texts were accessed and verified on 2026-10-30. Since arXiv is in HTML format, section and table numbers are used instead of page numbers.

Sign in to like

Comments

No comments yet.

Sign in to leave a comment