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 精度与吞吐。

解决什么真问题

文档解析有两大主流范式,各有痛点:

  1. 端到端序列化范式(如 Nougat、DocParser、GOT-OCR 2.0):一个 MLLM 把整页版面 + 所有区域内容串成一条 autoregressive 序列输出。 - 优点:保留全页上下文,跨区域指代(脚注、跨页表格、公式编号)天然能处理。 - 缺点:解码深度 = 页面 token 总数,区域间串行依赖,长文档首 token latency 极差。
  2. 两阶段 crop-based 范式(如 MinerU、Tesseract + LayoutLMv3):先版面检测再对每个区域单独识别。 - 优点:区域级并行,吞吐好。 - 缺点:每个区域都要重新做一次视觉 prefill,跨区域上下文被切断(脚注对正文、表格单元格对表头),且首步版面模型若漏框 / 错框会全链路失败。

PaDoc 想同时拿到两边的优点:保留全页上下文移除区域间串行依赖消除重复视觉 prefill

核心方法

PaDoc 的关键技术可拆为四点:版面分支假设prefix-conditioned factorizationpacked variable-length ancestor attentionvLLM 上的并行解码

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 还是其他。

亮点与局限

亮点

  1. 架构创新而非数据扩展:没有堆训练数据,而是改了解码图结构(branching vs sequential),这是更基础的贡献。
  2. 精度与吞吐同时 SOTA:在 OmniDocBench 上同时拿到 layout F1、Text Edit、Formula CDM 三项最优;在 384 页子集拿到速度最优——通常这两者会 trade-off,PaDoc 没付代价。
  3. 理论清晰:prefix-conditioned factorization + region-sufficiency 假设 + ancestor attention,三件套有完整的因果链解释。
  4. 工程落地门槛低:单卡 A800 可跑,vLLM 后端可直接集成,复现路径短。
  5. 开源:GitHub 链接已公开。

局限(反方 / 边界段,按 lessons W31 强制)

  1. region-sufficiency 假设的失败模式:当区域内容强依赖其它区域(如跨区域表格、脚注对正文引用、跨页公式编号)时,独立分支生成可能不一致,原文未量化这种 case 的失败率。
  2. 版面预测是瓶颈:版面流是所有区域流的根,版面预测一旦漏框 / 错框,下游全链路失败,没有「版面错了还能救」的兜底。原文未给出版面错误的级联影响数据。
  3. vLLM 依赖:并发请求 + shared-prefix reuse 是 vLLM 的特定能力,迁移到其它推理后端(TGI、SGLang、TensorRT-LLM)是否仍享受同等加速,原文未明确。
  4. 超长页面的 memory 实测:ancestor attention 把所有区域 KV 都保留在 page-level cache 中,页面极长(>2000 token)时显存增长曲线未给出。
  5. 评测覆盖: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 全文应统一不加空格,不要混用 vLLMVLLM(文中暂未出现后者)。
  • "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)

已知坑

  1. vLLM shared prefix reuse:不是所有 vLLM 版本都稳定支持 prefix-aware padding;建议用 vLLM 0.5.3+ 并在启动时加 --enable-chunked-prefill
  2. ancestor attention mask 实现:不是原生 HuggingFace 支持的 attention type,需要自定义 FlashAttentionattn_mask 或用 xFormersblock-diagonal mask;这步是复现核心门槛。
  3. 版面流 × 区域流并发调度:vLLM 的 run_with_cuda_graph 对并发请求有特殊要求,实测在 A800 上 batch=8 以内效率最高。
  4. OmniDocBench 标注格式:该 benchmark 的标注格式与 PDF 解析工具有兼容性坑,需用配套的 omni_doc_eval.py 脚本而非直接用 diff。
  5. 显存边界:页面区域越多(K↑),page-level KV cache 越大;实测当 K>20 且页面>1500 token 时,A800 80G 可能 OOM,需加 --max-num-seqs 32

未开源/未量化风险: - 论文未提供 ancestor mask 的确切实现代码,复现需自行推导。 - 不同 MLLM backbone 对并发加速比的影响未量化(可能存在 backbone 亲和性)。