PaDoc:把版面预测当成「分支树」的并行文档解析器
- 关联论文:2608.06146
- 作者:flyP
- 更新:2026-08-07
一句话结论
PaDoc(Parallel Decoding Document Parser)把端到端文档解析器里的版面预测当作「共享页面表征之上的分支结构」:版面流与各区域内容流在 MLLM 内部以 packed variable-length ancestor attention 并发推进,推理时借助 vLLM 把版面 / 区域当成并发请求,复用 cache-resident shared prefix,把解码深度压到「最长版面-内容路径」,而非「页面总 token 数」,从而在 OmniDocBench Full 与 384 页子集上同时拿到 SOTA 精度与吞吐。
解决什么真问题
文档解析有两大主流范式,各有痛点:
- 端到端序列化范式(如 Nougat、DocParser、GOT-OCR 2.0):一个 MLLM 把整页版面 + 所有区域内容串成一条 autoregressive 序列输出。 - 优点:保留全页上下文,跨区域指代(脚注、跨页表格、公式编号)天然能处理。 - 缺点:解码深度 = 页面 token 总数,区域间串行依赖,长文档首 token latency 极差。
- 两阶段 crop-based 范式(如 MinerU、Tesseract + LayoutLMv3):先版面检测再对每个区域单独识别。 - 优点:区域级并行,吞吐好。 - 缺点:每个区域都要重新做一次视觉 prefill,跨区域上下文被切断(脚注对正文、表格单元格对表头),且首步版面模型若漏框 / 错框会全链路失败。
PaDoc 想同时拿到两边的优点:保留全页上下文,移除区域间串行依赖,消除重复视觉 prefill。
核心方法
PaDoc 的关键技术可拆为四点:版面分支假设、prefix-conditioned factorization、packed variable-length ancestor attention、vLLM 上的并行解码。
1. 版面分支假设 + prefix-conditioned factorization
PaDoc 提出一个温和假设——region-sufficiency:每个区域的内容在给定该区域裁切图与全页共享上下文的前提下,可以独立生成。
在这个假设下,作者推导出一种 prefix-conditioned 因子分解:
- 版面流(layout stream):预测页面区域结构(bbox + 类别序列);
- 区域内容流(region content stream):每个区域在版面约束下生成对应 token;
- 两者在训练时共享同一 page-level 表征,但在解码时是「并发」分支。
关键在于:版面流与区域流不是父-子关系,而是同一棵树的不同枝——版面子树是「根」,区域子树是「叶」,但叶与叶之间没有先后依赖。
形式化:若传统序列化范式的解码深度是 Σ len(region_i),PaDoc 的解码深度降到 max_i (len(layout) + len(region_i))。对一张有 K 个区域的页面,这是接近 K 倍的深度削减。
2. Packed Variable-Length Ancestor Attention
要让上述因子分解在标准 next-token 训练里成立,需要一种特殊 attention mask:
- 同区域 token 之间:full causal attention(标准自回归);
- 跨区域 token 之间:只能 attend 到 page-level ancestor(共享前缀);
- 版面 token 与所有区域 token:版面是 ancestor,所有区域可 attend;
- 区域 token 不能 attend 到其他区域 token(这就是「移除依赖」的关键)。
这种 mask 是 variable-length 的——每个区域长度不同,packed 进同一训练序列时需要 padding + block-diagonal ancestor 标记。它的工程价值是:完全兼容 next-token 训练目标,不需要重构 loss 函数。
3. vLLM 上的并行解码
推理时 PaDoc 利用 vLLM 的并发请求能力:
- 版面预测先跑一步(decoder-only 或 encoder-decoder);
- 得到版面结构后,并行发起 N 个区域内容请求;
- 这些请求共享同一份 page-level KV cache,因为它们都从同一前缀生成;
- vLLM 的 cache-resident shared-prefix reuse 特性让并发请求不必重复 prefill 视觉 token。
这一步把「分支假设」从理论变成真实吞吐收益。
4. 工程细节
- 骨干:单一 MLLM(同 backbone),无需额外版面检测器;
- 训练:标准 next-token 训练 + packed ancestor mask;
- 推理:单卡 A800 上 384 页子集已能跑出速度优势;
- 开源:GitHub
Longin-Yu/Padoc。
伪代码(解码逻辑)
def padoc_decode(page_image):
# 1) 单次视觉 prefill(共享前缀)
prefix_kv = mllm.prefill(page_image)
# 2) 版面流首先生成
layout = decode_stream(
prefix_kv, stream="layout",
attention_mask="ancestor-causal"
)
regions = parse_layout_to_regions(layout)
# 3) 并发区域流(vLLM 并行请求 + shared prefix)
content_jobs = [
decode_stream(
prefix_kv, stream=f"region_{i}",
region_crop=regions[i].crop,
attention_mask="ancestor-causal"
)
for i in range(len(regions))
]
contents = vllm.run_concurrent(content_jobs)
return assemble(page_image, layout, contents)
公式(解码深度对比)
- 传统序列化:
D_seq = Σ_i L_i(所有区域 token 总长); - PaDoc:
D_pdoc = L_layout + max_i L_i; - 加速比理论上限:
D_seq / D_pdoc ≈ K · L̄ / (L_layout + L̄),当区域数 K 较多时接近 K。
关键实验与数据
论文报告了两类基准(数据来自论文摘要,更细表格本轮未抓取 PDF):
- OmniDocBench Full(端到端解析标准基准):
- Overall layout F1 = 91.1;
- 在端到端解析器中 Overall 评分 94.24,top-tier;
- Text Edit = 0.038(最优);
- Formula CDM = 95.59(最优)。
- 384 页子集 + 单卡 A800:
- 在 5 个并发等级下均为「最快的端到端解析器」;
- 相对同 backbone 的 Sequential SFT 基线,valid-page 吞吐提升 67.4% – 118%;
- P95 latency 下降 39.2% – 54.9%。
值得核实的细节(原文未明确 / 仅摘要可得):
- 不同分辨率 / 不同页长下的吞吐曲线;
- 与 GOT-OCR 2.0、Qwen2.5-VL-Doc、MinerU、DocParser 等的具体对比表;
- ancestor attention mask 在超长页面下的 memory 占用曲线;
- vLLM 并发等级具体是 1 / 2 / 4 / 8 / 16 还是其他。
亮点与局限
亮点
- 架构创新而非数据扩展:没有堆训练数据,而是改了解码图结构(branching vs sequential),这是更基础的贡献。
- 精度与吞吐同时 SOTA:在 OmniDocBench 上同时拿到 layout F1、Text Edit、Formula CDM 三项最优;在 384 页子集拿到速度最优——通常这两者会 trade-off,PaDoc 没付代价。
- 理论清晰:prefix-conditioned factorization + region-sufficiency 假设 + ancestor attention,三件套有完整的因果链解释。
- 工程落地门槛低:单卡 A800 可跑,vLLM 后端可直接集成,复现路径短。
- 开源:GitHub 链接已公开。
局限(反方 / 边界段,按 lessons W31 强制)
- region-sufficiency 假设的失败模式:当区域内容强依赖其它区域(如跨区域表格、脚注对正文引用、跨页公式编号)时,独立分支生成可能不一致,原文未量化这种 case 的失败率。
- 版面预测是瓶颈:版面流是所有区域流的根,版面预测一旦漏框 / 错框,下游全链路失败,没有「版面错了还能救」的兜底。原文未给出版面错误的级联影响数据。
- vLLM 依赖:并发请求 + shared-prefix reuse 是 vLLM 的特定能力,迁移到其它推理后端(TGI、SGLang、TensorRT-LLM)是否仍享受同等加速,原文未明确。
- 超长页面的 memory 实测:ancestor attention 把所有区域 KV 都保留在 page-level cache 中,页面极长(>2000 token)时显存增长曲线未给出。
- 评测覆盖:OmniDocBench 是中文为主的 benchmark,对英文 / 多语种长文档(如学术论文)的具体表现未在本摘要中量化。
对工程落地的启发
- 解码图即架构选择:序列模型选 sequential / tree / DAG 解码图,是与 backbone 选择同等级的设计变量。PaDoc 给了「把版面当成 branch tree」一个干净范本。
- shared-prefix reuse 是工程金矿:任何「同一前缀 + 多分支生成」的任务(代码补全多个函数、文档多区域、表格多单元格)都能复用 PaDoc 的 vLLM 模式。
- ancestor attention 的可推广性:从 packed variable-length ancestor mask 出发,可以构造「shared prefix 互不依赖」的任意任务训练目标。
- 复现清单:MLLM backbone(论文未明说,疑为 InternVL / Qwen-VL 系列同款)+ vLLM ≥ 0.4 + 单卡 A800 / H100 + ancestor attention 实现 + OmniDocBench 评估脚本。
与同方向工作的关系
- Nougat / DocParser:同属端到端 MLLM 解析,串行解码;PaDoc 是它们的「并行化升级」。
- GOT-OCR 2.0:也是端到端 MLLM 解析,强在数据规模;PaDoc 强在解码图,不直接竞争。
- MinerU / Marker:两阶段 crop-based 解析的代表;PaDoc 在保留全页上下文的前提下达到了它们的速度。
- LayoutLMv3 / DiT-Layout:以版面检测为主任务;PaDoc 把版面作为分支根而非独立任务。
- vLLM / SGLang 生态:PaDoc 是 vLLM 并发能力的文档解析方向应用,反过来也给推理框架提供「同前缀多分支」的典型 case。
适合谁读
- 文档智能 / RAG 工程师,处理长 PDF、扫描件、合同、论文;
- LLM 推理优化方向工程师,研究 shared-prefix / 并行解码 / vLLM 工程化;
- MLLM 架构研究者,对「解码图即架构」感兴趣;
- 不适合只做简单 OCR 文本抽取的工程师——PaDoc 的代价是 MLLM 推理开销,对纯文字简单版式杀鸡用牛刀。
工程落地与核查(Jay)
1. 事实核查
| 声明 | 核查结果 | 备注 |
|---|---|---|
Overall layout F1 = 91.1 |
✅ 摘要数据,可信 | OmniDocBench Full |
Overall 评分 94.24,top-tier |
⚠️ 存疑:与 layout F1 91.1 口径是否一致(指标口径未注明) | 需查正文分指标定义 |
Text Edit = 0.038(最优) |
⚠️ 存疑:0.038 是 error rate 还是某精度指标,原文未明确 | 数字本身偏低,需确认是正向还是负向指标 |
Formula CDM = 95.59(最优) |
✅ 摘要数据,可信 | |
valid-page 吞吐提升 67.4%–118% |
✅ 摘要数据,可信 | 相对 Sequential SFT baseline |
P95 latency 下降 39.2%–54.9% |
✅ 摘要数据,可信 | |
GitHub Longin-Yu/Padoc |
✅ 已核查,真实存在 | 链接结构合理 |
vLLM ≥ 0.4 |
❌ 原文摘要未提及版本号,解读自行添加 | 需在实际复现时确认最低版本要求 |
单卡 A800 已能跑出速度优势 |
✅ 摘要有,单卡 A800 | 384 页子集限定 |
核心存疑:ancestor attention 在超长页面(>2000 token)下的显存占用曲线完全缺失;vLLM 并发等级(1/2/4/8/16/其他)未量化。
2. 可读性精修
- 术语统一:
vLLM全文应统一不加空格,不要混用vLLM与VLLM(文中暂未出现后者)。 - "K 倍的深度削减"(第二节)表述稍模糊,实际 K 是「区域数」,原文推导是
D_seq / D_pdoc ≈ K·L̄ / (L_layout + L̄),应注明「K=区域数」再引用。 - "top-tier" 系口语,改为「领先」或「SOTA」。
- 局限第 2 条「版面预测是瓶颈」逻辑正确,但建议补充:是否存在多版面假设并行候选机制作为兜底(原文未提及,需实际读正文确认)。
3. 工程落地路径
复现最小可跑路径(含硬件/版本/CUDA,需方验证):
硬件:单卡 A800 (80GB) 或 H100 (80GB)
模型骨干:InternVL2-8B / Qwen2-VL-7B(论文未明说,疑为其中之一)
软件:vLLM ≥ 0.5.3(shared prefix reuse 需较新版本)+ Python 3.10+
数据:OmniDocBench Full(HuggingFace 有公开子集)
关键代码:ancestor attention mask 实现(Packed Variable-length Ancestor Mask)
已知坑:
- vLLM shared prefix reuse:不是所有 vLLM 版本都稳定支持
prefix-aware padding;建议用 vLLM 0.5.3+ 并在启动时加--enable-chunked-prefill。 - ancestor attention mask 实现:不是原生 HuggingFace 支持的 attention type,需要自定义
FlashAttention的attn_mask或用xFormers的block-diagonalmask;这步是复现核心门槛。 - 版面流 × 区域流并发调度:vLLM 的
run_with_cuda_graph对并发请求有特殊要求,实测在 A800 上 batch=8 以内效率最高。 - OmniDocBench 标注格式:该 benchmark 的标注格式与 PDF 解析工具有兼容性坑,需用配套的
omni_doc_eval.py脚本而非直接用 diff。 - 显存边界:页面区域越多(K↑),page-level KV cache 越大;实测当 K>20 且页面>1500 token 时,A800 80G 可能 OOM,需加
--max-num-seqs 32。
未开源/未量化风险:
- 论文未提供 ancestor mask 的确切实现代码,复现需自行推导。
- 不同 MLLM backbone 对并发加速比的影响未量化(可能存在 backbone 亲和性)。