一个用于将 PDF 和其他基于图像的文档格式转换清晰、可读纯文本格式的工具包。
在线试用演示:https://olmocr.allenai.org/
功能特性:
- 将基于 PDF、PNG 和 JPEG 的文档转换为干净的 Markdown 格式
- 支持公式、表格、手写文本和复杂排版
- 自动移除页眉和页脚
- 即使在有图表、多列布局和嵌入式内容的情况下,也能以自然的阅读顺序转换为文本
- 高效,每百万页转换成本低于 200 美元
- (基于 70亿参数 VLM,因此需要 GPU)
olmOCR-Bench:
我们还附带了一套全面的基准测试套件,涵盖超过 1400 份文档中的 7000 多个测试用例,以帮助衡量 OCR 系统的性能。
| ArXiv | 老旧 扫描 含数学 |
表格 | 老旧 扫描 |
页眉 & 页脚 |
多 列 |
长且 极细 文本 |
基础 | 总分 | |
|---|---|---|---|---|---|---|---|---|---|
| Mistral OCR API | 77.2 | 67.5 | 60.6 | 29.3 | 93.6 | 71.3 | 77.1 | 99.4 | 72.0±1.1 |
| Marker 1.10.1 | 83.8 | 66.8 | 72.9 | 33.5 | 86.6 | 80.0 | 85.7 | 99.3 | 76.1±1.1 |
| MinerU 2.5.4* | 76.6 | 54.6 | 84.9 | 33.7 | 96.6 | 78.2 | 83.5 | 93.7 | 75.2±1.1 |
| DeepSeek-OCR | 77.2 | 73.6 | 80.2 | 33.3 | 96.1 | 66.4 | 79.4 | 99.8 | 75.7±1.0 |
| Nanonets-OCR2-3B | 75.4 | 46.1 | 86.8 | 40.9 | 32.1 | 81.9 | 93.0 | 99.6 | 69.5±1.1 |
| PaddleOCR-VL* | 85.7 | 71.0 | 84.1 | 37.8 | 97.0 | 79.9 | 85.7 | 98.5 | 80.0±1.0 |
| Infinity-Parser 7B* | 84.4 | 83.8 | 85.0 | 47.9 | 88.7 | 84.2 | 86.4 | 99.8 | 82.5±? |
| Chandra OCR 0.1.0* | 82.2 | 80.3 | 88.0 | 50.4 | 90.8 | 81.2 | 92.3 | 99.9 | 83.1±0.9 |
| olmOCR v0.4.0 | 83.0 | 82.3 | 84.9 | 47.7 | 96.1 | 83.7 | 81.9 | 99.7 | 82.4±1.1 |
你需要安装 poppler-utils 和额外的字体来渲染 PDF 图像。
安装依赖 (Ubuntu/Debian):
sudo apt-get update
sudo apt-get install poppler-utils ttf-mscorefonts-installer msttcorefonts fonts-crosextra-caladea fonts-crosextra-carlito gsfonts lcdf-typetools
设置一个 conda 环境并安装 olmocr。运行 olmOCR 的依赖项很难在现有的 python 环境中安装,因此请务必创建一个干净的 python 环境进行安装。
conda create -n olmocr python=3.11
conda activate olmocr
选择符合你用例的安装选项:
选项 1:远程推理(轻量级)
如果你打算使用带有 --server 参数的远程 vLLM 服务器,请安装基础包:
pip install olmocr
这样可以避免安装诸如 PyTorch(~2GB+)之类的重型 GPU 依赖项。
选项 2:本地 GPU 推理
要求:
- 较新的 NVIDIA GPU (已在 RTX 4090, L40S, A100, H100 上测试) 且至少有 12 GB 的 GPU 显存
- 30GB 可用磁盘空间
使用自有 GPU 进行推理:
pip install olmocr[gpu] --extra-index-url https://download.pytorch.org/whl/cu128
# 推荐:安装 flash infer 以加快 GPU 推理速度
pip install https://download.pytorch.org/whl/cu128/flashinfer/flashinfer_python-0.2.5%2Bcu128torch2.7-cp38-abi3-linux_x86_64.whl
选项 3:Beaker 集群执行
用于将任务提交到带有 --beaker 标志的 Beaker 集群:
pip install olmocr[beaker]
选项 4:基准测试套件
用于运行 olmOCR 基准测试套件:
pip install olmocr[bench]
组合安装
你可以组合多个选项:
# GPU + Beaker 支持
pip install olmocr[gpu,beaker] --extra-index-url https://download.pytorch.org/whl/cu128
# GPU + 基准测试支持
pip install olmocr[gpu,bench] --extra-index-url https://download.pytorch.org/whl/cu128
故障排除
如果你遇到关于 too many open files 的错误,请更新你的 ulimit:
ulimit -n 65536
快速测试,请尝试网络演示。
转换单个 PDF(本地 GPU):
# 下载一个示例 PDF
curl -o olmocr-sample.pdf https://olmocr.allenai.org/papers/olmocr_3pg_sample.pdf
# 将其转换为 markdown
olmocr ./localworkspace --markdown --pdfs olmocr-sample.pdf
转换一个图片文件:
olmocr ./localworkspace --markdown --pdfs random_page.png
转换多个 PDF:
olmocr ./localworkspace --markdown --pdfs tests/gnarly_pdfs/*.pdf
使用远程推理服务器:
olmocr ./localworkspace --server http://remote-server:8000/v1 --model allenai/olmOCR-2-7B-1025-FP8 --markdown --pdfs *.pdf
使用 --markdown 标志,结果将作为 markdown 文件存储在 ./localworkspace/markdown/ 目录下。
注意: 如果你更喜欢,也可以使用
python -m olmocr.pipeline来代替olmocr。
然后 ./localworkspace/ 工作区文件夹将包含 Dolma 和 markdown 文件(如果使用了 --markdown)。
cat localworkspace/markdown/olmocr-sample.md
olmOCR: Unlocking Trillions of Tokens in PDFs with Vision Language Models
...
如果你已经有运行中的 vLLM 服务器(或任何实现 OpenAI API 的推理平台),你可以指示 olmOCR 使用它,而不是启动本地实例。
远程推理的安装:
# 轻量级安装 - 无需 GPU 依赖项
pip install olmocr
使用外部服务器:
# 使用外部 vLLM 服务器而不是本地服务器
olmocr ./localworkspace --server http://remote-server:8000/v1 --model allenai/olmOCR-2-7B-1025-FP8 --markdown --pdfs tests/gnarly_pdfs/*.pdf
vLLM 中服务的模型名称需要与 --model 提供的值匹配。
vLLM 服务器启动示例:
vllm serve allenai/olmOCR-2-7B-1025-FP8 --max-model-len 16384
我们已经在这些外部模型提供商上测试了 olmOCR-2-7B-1025-FP8,并确认它们可以正常工作。
| $/百万输入 Token | $/百万输出 Token | 示例命令 | |
|---|---|---|---|
| Cirrascale | $0.07 | $0.15 | olmocr ./workspace --server https://ai2endpoints.cirrascale.ai/api --api_key sk-XXXXXXX --workers 1 --max_concurrent_requests 20 --model olmOCR-2-7B-1025 --pdfs tests/gnarly_pdfs/*.pdf |
| DeepInfra | $0.09 | $0.19 | olmocr ./workspace --server https://api.deepinfra.com/v1/openai --api_key DfXXXXXXX --workers 1 --max_concurrent_requests 20 --model allenai/olmOCR-2-7B-1025 --pdfs tests/gnarly_pdfs/*.pdf |
| Parasail | $0.10 | $0.20 | olmocr ./workspace --server https://api.parasail.io/v1 --api_key psk-XXXXX --workers 1 --max_concurrent_requests 20 --model allenai/olmOCR-2-7B-1025 --pdfs tests/gnarly_pdfs/*.pdf |
关于参数的说明
- --server:定义与 OpenAI 兼容的端点:例如 https://api.deepinfra.com/v1/openai
- --api_key:你的 API 密钥,通过 Authorization Bearer HTTP 头传递
- --max_concurrent_requests:同时发送到推理提供商的并发请求的最大数量
- --workers:同时处理的页面组最大数量。你可能希望将其设置为 1,以便在继续之前完成一组内容。
- --pages_per_group:你可能希望每组有更少的页面,因为许多外部提供商有较低的并发请求限制。
- --model:模型标识符,例如 allenai/olmOCR-2-7B-1025,不同的提供商有不同的名称,如果你在本地运行,可以使用 olmocr。
- 其他参数与本地推理的工作方式相同。
如果你想要使用并行运行的多个节点转换数百万个 PDF,olmOCR 支持从 AWS S3 读取 PDF,并使用 AWS S3 输出存储桶协调工作。
启动第一个工作节点:
olmocr s3://my_s3_bucket/pdfworkspaces/exampleworkspace --pdfs s3://my_s3_bucket/jakep/gnarly_pdfs/*.pdf
这会在你的 AWS 存储桶中设置一个简单的工作队列,并开始转换 PDF。
在后续工作节点上:
olmocr s3://my_s3_bucket/pdfworkspaces/exampleworkspace
它们将自动开始从同一个工作区队列中获取项目。
如果你在 Ai2 并希望使用 beaker 高效线性化数百万个 PDF,请使用 Beaker 支持进行安装:
pip install olmocr[gpu,beaker] --extra-index-url https://download.pytorch.org/whl/cu128
然后使用 --beaker 标志在本地准备工作区,并在集群中启动 N 个 GPU 工作节点:
olmocr s3://my_s3_bucket/pdfworkspaces/exampleworkspace --pdfs s3://my_s3_bucket/jakep/gnarly_pdfs/*.pdf --beaker --beaker_gpus 4
拉取 Docker 镜像(较大,包含模型,约 30 GB):
docker pull alleninstituteforai/olmocr:latest-with-model
对于希望自行管理模型下载的高级用户,我们还提供了不带模型的基础镜像:
docker pull alleninstituteforai/olmocr:latest
处理当前目录中的单个 PDF:
docker run --gpus all \
-v $(pwd):/workspace \
alleninstituteforai/olmocr:latest-with-model \
-c "olmocr /workspace/output --markdown --pdfs /workspace/sample.pdf"
处理多个 PDF:
docker run --gpus all \
-v /path/to/pdfs:/input \
-v /path/to/output:/output \
alleninstituteforai/olmocr:latest-with-model \
-c "olmocr /output --markdown --pdfs /input/*.pdf"
以交互方式运行容器以进行探索和调试:
docker run -it --gpus all alleninstituteforai/olmocr:latest-with-model
访问我们在 Docker Hub 上的 Docker 仓库以获取更多信息。
查看所有可用选项:
olmocr --help
usage: pipeline.py [-h] [--pdfs [PDFS ...]] [--model MODEL] [--workspace_profile WORKSPACE_PROFILE] [--pdf_profile PDF_PROFILE] [--pages_per_group PAGES_PER_GROUP] [--max_page_retries MAX_PAGE_RETRIES] [--max_page_error_rate MAX_PAGE_ERROR_RATE] [--workers WORKERS]
[--apply_filter] [--stats] [--markdown] [--target_longest_image_dim TARGET_LONGEST_IMAGE_DIM] [--target_anchor_text_len TARGET_ANCHOR_TEXT_LEN] [--guided_decoding] [--gpu-memory-utilization GPU_MEMORY_UTILIZATION] [--max_model_len MAX_MODEL_LEN]
[--tensor-parallel-size TENSOR_PARALLEL_SIZE] [--data-parallel-size DATA_PARALLEL_SIZE] [--port PORT] [--server SERVER] [--beaker] [--beaker_workspace BEAKER_WORKSPACE] [--beaker_cluster BEAKER_CLUSTER] [--beaker_gpus BEAKER_GPUS] [--beaker_priority BEAKER_PRIORITY]
workspace
用于通过批量推理流水线管理数百万个 PDF 的经理
位置参数:
workspace 工作存储的文件系统路径,可以是本地文件夹,也可以是用于协调多个工作节点的 s3 路径,s3://bucket/prefix/
选项:
-h, --help 显示此帮助消息并退出
--pdfs [PDFS ...] 添加存储在 s3 中的 pdf 路径到工作区,可以是 glob 路径 s3://bucket/prefix/*.pdf 或包含 pdf 路径列表的文件路径
--model MODEL 模型所在路径,默认为 allenai/olmOCR-7B-0725-FP8,可以是本地、s3 或 hugging face 路径。
--workspace_profile WORKSPACE_PROFILE
用于访问工作区的 S3 配置配置文件
--pdf_profile PDF_PROFILE
用于访问原始 pdf 文档的 S3 配置配置文件
--pages_per_group PAGES_PER_GROUP
每个工作项目组的目标 pdf 页数
--max_page_retries MAX_PAGE_RETRIES
重试渲染一页的最大次数
--max_page_error_rate MAX_PAGE_ERROR_RATE
文档中允许的失败页面率,默认 1/250
--workers WORKERS 同时运行的工作节点数量
--apply_filter 对非表单、非 SEO 垃圾邮件的英文 pdf 应用基本过滤
--stats 不运行任何作业,报告当前工作区的一些统计信息
--markdown 也将自然文本写入 markdown 文件,保留输入 pdf 的文件夹结构
--target_longest_image_dim TARGET_LONGEST_IMAGE_DIM
用于渲染 pdf 页面的最长边尺寸
--target_anchor_text_len TARGET_ANCHOR_TEXT_LEN
要使用的锚文本最大数量(字符),不用于新模型
--guided_decoding 为模型 YAML 类型输出启用引导解码
VLLM 参数:
--gpu-memory-utilization GPU_MEMORY_UTILIZATION
vLLM 可能为 KV-cache 预留的 VRAM 比例(传递到 vllm serve)。
--max_model_len MAX_MODEL_LEN
vLLM 将为 KV-cache 分配的上限(tokens),如果 VLLM 无法启动则降低
--tensor-parallel-size TENSOR_PARALLEL_SIZE, -tp TENSOR_PARALLEL_SIZE
vLLM 的张量并行大小
--data-parallel-size DATA_PARALLEL_SIZE, -dp DATA_PARALLEL_SIZE
vLLM 的数据并行大小
--port PORT VLLM 服务器使用的端口
--server SERVER 外部 vLLM(或其他兼容提供商)服务器的 URL
(例如,http://hostname:port)。如果提供,
则跳过启动本地 vLLM 实例
beaker/集群执行:
--beaker 将此作业提交给 beaker 而不是本地运行
--beaker_workspace BEAKER_WORKSPACE
要提交的 Beaker 工作区
--beaker_cluster BEAKER_CLUSTER
你想要运行的 Beaker 集群
--beaker_gpus BEAKER_GPUS
要运行的 GPU 副本数量
--beaker_priority BEAKER_PRIORITY
作业的 Beaker 优先级级别
代码中有一些可重用的优秀部分,可能对你的项目有用:
- 一种使用 ChatGPT 4o 获得极佳自然文本解析的提示策略 - buildsilver.py
- 基于语言和 SEO 垃圾邮件的基本过滤 - filter.py
- 用于 Qwen2.5-VL 的 SFT 微调代码 - train.py
- GRPO RL 训练器 - grpo_train.py
- 合成数据生成 - mine_html_templates.py
- 通过微调模型使用 VLLM 处理数百万个 PDF - pipeline.py
- 查看通过 PDF 创建的 Dolma 文档 - dolmaviewer.py
olmOCR 由 AllenNLP 团队开发和维护,并得到 艾伦人工智能研究所 (AI2) 的支持。
AI2 是一个非营利性研究所,其使命是通过高影响力的 AI 研究和工程为人类做出贡献。
要了解具体是谁为此代码库做出了贡献,请参阅我们的贡献者页面。
olmOCR 根据 Apache 2.0 许可证授权。
许可证的完整副本可以在 GitHub 上找到。
关于 olmOCR v1 和 OlmOCR-bench:
@misc{olmocrbench,
title={{olmOCR: Unlocking Trillions of Tokens in PDFs with Vision Language Models}},
author={Jake Poznanski and Jon Borchardt and Jason Dunkelberger and Regan Huff and Daniel Lin and Aman Rangapur and Christopher Wilhelm and Kyle Lo and Luca Soldaini},
year={2025},
eprint={2502.18443},
archivePrefix={arXiv},
primaryClass={cs.CL},
url={https://arxiv.org/abs/2502.18443},
}
关于 olmOCR v2 单元测试奖励与 RL:
@misc{olmocr2,
title={olmOCR 2: Unit Test Rewards for Document OCR},
author={Jake Poznanski and Luca Soldaini and Kyle Lo},
year={2025},
eprint={2510.19817},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2510.19817},
}