如何批量解析超长PDF文档?Unlimited-OCR-2多页解析最佳实践
【免费下载链接】Unlimited-OCR-2项目地址: https://ai.gitcode.com/hf_mirrors/baidu/Unlimited-OCR-2
解析几百页的超长 PDF 一直是 OCR 的难题:逐页识别会丢失跨页上下文,塞进单一请求又会撑爆显存。Unlimited-OCR-2 通过 SR-SWA(稀疏参考滑动窗口注意力)技术,实现了"无上限"的多页批量解析——文档再长,单步解码的延迟和显存也几乎恒定。本文用最小化示例带你跑通批量解析,并给出生产环境部署的关键调参建议。
为什么它敢解析超长PDF?
传统方案里,注意力计算量随文档长度平方增长,几百页文档直接不可行。Unlimited-OCR-2 的核心改进是把文本与视觉的注意力交互压缩到固定大小的工作参考集(约 512 个 token),从而:
- ⚡计算有界:每步解码开销不随页数增长,10 页和 500 页耗时差距远小于传统方案
- 📄跨页上下文:所有页面在一次请求中送入,模型能利用跨页信息(如延续的表格、多段公式)
- 🏆SOTA 性能:在 MPDocBench(数十页)与 MarathonDocBench(上百页)两个基准上均达到当前最优
两种推理方式:一步选对路线
| 方式 | 适用场景 | 特点 |
|---|---|---|
| Transformers(原生) | 快速验证、小规模测试 | 几行代码即可运行,无需额外服务 |
| SGLang(官方推荐) | 生产服务、高并发 | 提供 OpenAI 兼容 API,内置页窗调度优化显存 |
先用 Transformers 验证效果,再用 SGLang 上线服务,是最常见的组合。
三步用 Transformers 批量解析PDF
第 1 步:准备环境(官方测试环境为 Python 3.10 + NVIDIA A800-80GB)
pip install torch==2.13.0 torchvision pillow transformers==4.52.1 \ huggingface-hub==0.36.0 tokenizers==0.21.4 addict==2.4.0 einops==0.8.2 easydict==1.13第 2 步:加载模型(一次加载,反复调用)
import torch from transformers import AutoModel, AutoTokenizer model_name = "baidu/Unlimited-OCR-2" 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()第 3 步:多页批量解析——把 PDF 转成的页面图片按页序传入infer_multi:
pages = [f"your_doc/page_{i}.jpg" for i in range(1, 8)] text, num_tokens = model.infer_multi(tokenizer, image_files=pages, output_path="output/multi", save_results=True)就这么简单。提示词"<PAGE><image>" * 页数 + "Multi page parsing."会自动构建,输出中每页对应一个<PAGE>标记,顺序与输入一致,方便你按页切分结果。
💡 只需解析单页时改用
model.infer(...),它默认启用动态切块(gundam 模式),对复杂版式更友好。实现细节可参考 modeling_unlimitedocr.py 中的infer与infer_multi方法。
多页解析关键参数速查表
批量解析时,下面这些参数最值得了解(默认值见 config.json):
| 参数 | 默认值 | 说明 |
|---|---|---|
crop_mode | 自动 | 单页默认动态切块(gundam);多页默认 base 全局视图,避免切块打断跨页结构 |
max_page_tokens | 20000 | 每页输出上限,超出会被页数守卫截断,防止单页"卡死"整个文档 |
temperature | 0.0 | 贪心解码,结果稳定可复现 |
no_repeat_ngram_size | 0 | 长文档建议启用(多页场景窗口建议 1024),抑制重复输出 |
max_length | 131072 | 最大上下文长度 |
一个小技巧:PDF 转图片时建议300 DPI,分辨率过低会明显损失表格和公式的识别精度。
SGLang 生产部署:显存最优配置
需要高并发时,官方推荐 SGLang 路线。仓库内已附带定制版轮子 wheel/sglang-0.5.20.dev13+g75b9b06b02-py3-none-any.whl,完整启动命令见 README.md。超长文档场景,真正关键的只有几个环境变量:
| 环境变量 | 建议值 | 作用 |
|---|---|---|
SGLANG_UOCR_EANABLE_DOC_LIMIT | 1 | 启用页窗调度,超长文档分窗解析并复用上一窗 KV 尾部,显存占用大幅降低 |
SGLANG_UOCR_DOC_GUNDAM_PAGE_WINDOW/SGLANG_UOCR_DOC_BASE_PAGE_WINDOW | 10 | 每个窗口的页数。调小可降低峰值显存,但跨窗边界的表格/段落会丢失上下文 |
SGLANG_UOCR_MAX_PAGE_TOKENS | 20000 | 单页输出上限,必须 > 0 |
SGLANG_OPT_UOCR_SAM_REL_POS_BIAS_MB | 64 | 降低 SAM 注意力偏置的峰值分配(默认 512 可能 OOM) |
PYTORCH_CUDA_ALLOC_CONF | expandable_segments:True | 缓解大显存分配时的碎片化失败 |
启动后通过 OpenAI 兼容接口/v1/chat/completions发请求即可,多页文档把全部页面图片放进一条消息,并设置max_tokens = 每页预算 × 页数(如每页 8000)。README 中有完整的 PDF→图片→请求示例代码,可直接参考 README.md。
常见问题与调优清单
- 输出页数和输入对不上?检查图片是否按页序传入,
<PAGE>数量必须与页数一致;页数守卫(page_count_guard)默认开启,可兜底纠正 - 显存不够(OOM)?优先调小
*_PAGE_WINDOW,再降--max-prefill-tokens(如 4096→2048 可减半峰值),--mem-fraction-static设为 0.7 更稳 - 跨页表格断裂?窗口跨边界处会丢失上下文,适当调大页数窗口即可权衡
- 想整文档单窗解析?设
SGLANG_UOCR_EANABLE_DOC_LIMIT=0,但仅限较短文档
参考资料
- 官方说明与完整部署命令:README.md
- 技术论文(Unlimited-OCR-2):Unlimited-OCR-2.pdf
- 模型推理实现(
infer/infer_multi/ 页面守卫):modeling_unlimitedocr.py - 稀疏注意力配置(页标记 ID、块大小等):config.json
- 视觉编码器实现:deepencoder.py
- SGLang 定制轮子:wheel/
跑通 Transformers 验证、再按上表配置 SGLang 服务,你就拥有了从几十页到数百页的完整批量解析流水线。动手试试吧!🚀
【免费下载链接】Unlimited-OCR-2项目地址: https://ai.gitcode.com/hf_mirrors/baidu/Unlimited-OCR-2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考