开源项目

olmocr

olmocr

基于视觉语言模型的PDF转文本工具,专为LLM训练数据准备设计,可将PDF、图片等文档转化为干净可读的Markdown文本。亮点:性能领先,在olmOCR-Bench上达到82.4分,支持表格、公式、多栏等复杂格式,按页计费不到$200/百万页,提供CLI和Docker镜像方便批量处理,并附带完整的训练、微调代码和合成数据生成方案。

README

olmocr-2-full@2x

GitHub License GitHub release Tech Report v1 Tech Report v2 演示 Discord

一个将 PDF 及其他基于图像的文档格式转换为干净、可读的纯文本格式的工具包。

尝试在线演示:https://olmocr.allenai.org/

功能:

  • 将基于 PDF、PNG 和 JPEG 的文档转换为干净的 Markdown
  • 支持公式、表格、手写内容和复杂格式
  • 自动去除页眉和页脚
  • 按自然阅读顺序转换为文本,即使包含图片、多列布局和嵌入内容也能正确处理
  • 高效,每百万页转换成本低于 200 美元
  • (基于 7B 参数的 VLM,因此需要 GPU)

新闻

  • 2025年10月21日 - v0.4.0 - 新模型发布,使用合成数据将 olmOCR-bench 分数提升约 4 分,并引入 RL 训练。
  • 2025年8月13日 - v0.3.0 - 新模型发布,修复了自动旋转检测和空白文档上的幻觉问题。
  • 2025年7月24日 - v0.2.1 - 新模型发布,在 olmOCR-Bench 上得分提高 3 分,同时运行速度显著提升(默认为 FP8),且每个文档所需重试次数大幅减少。
  • 2025年7月23日 - v0.2.0 - 新的整理过的训练代码,使自行训练 olmOCR 模型更加简单。
  • 2025年6月17日 - v0.1.75 - 将推理管道从 sglang 切换到 vllm,更新 Docker 镜像至 CUDA 12.8。
  • 2025年5月23日 - v0.1.70 - 官方 Docker 支持和镜像现已可用!查看 Docker 用法
  • 2025年5月19日 - v0.1.68 - olmOCR-Bench 发布,得分 77.4。由于提示词 bug 修复,olmOCR 管道性能提升 2 分。
  • 2025年3月17日 - v0.1.60 - 通过更好的采样温度选择实现性能提升。
  • 2025年2月25日 - v0.1.58 - 初始公开发布和演示。

基准测试

olmOCR-Bench: 我们还附带了一个全面的基准测试套件,涵盖超过 7,000 个测试用例、1,400 个文档,用于衡量 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
Python 安装

创建一个 conda 环境并安装 olmocr。在现有的 Python 环境中安装 olmOCR 的依赖比较困难,因此请务必创建一个干净的 Python 环境进行安装。

conda create -n olmocr python=3.11
conda activate olmocr

选择适合你的使用场景的安装选项:

选项 1:远程推理(轻量级)

如果你打算使用 --server 标志连接远程 vLLM 服务器,安装基础包:

pip install olmocr

这样可以避免安装 PyTorch 等重型 GPU 依赖(约 2GB+)。

选项 2:本地 GPU 推理

要求:

  • 最新的 NVIDIA GPU(已在 RTX 4090、L40S、A100、H100 上测试),至少 12GB 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,确认可以正常工作。

每百万输入令牌美元 每百万输出令牌美元 示例命令
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

它们会自动开始从同一个工作队列中抓取任务。

使用 Beaker 进行集群执行

如果你在 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

拉取 Docker 镜像(较大,包含模型,约 30GB):

docker pull alleninstituteforai/olmocr:latest-with-model

对于希望自行管理模型下载的高级用户,我们还提供了一个不含模型的基础镜像:

docker pull alleninstituteforai/olmocr:latest
快速开始 - 处理 PDF

处理当前目录下的单个 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 仓库了解更多信息。

完整文档

查看所有可用选项:

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 配置 profile
  --pdf_profile PDF_PROFILE
                        用于访问原始 PDF 文档的 S3 配置 profile
  --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        对英文 PDF 应用基本过滤(非表格、非 SEO 垃圾内容的过滤)
  --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 预分配的显存比例(传递给 vllm serve)。
  --max_model_len MAX_MODEL_LEN
                        vLLM 为 KV-cache 分配的上限(令牌数),如果 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 优先级级别

代码概述

代码中有一些可复用的好部分,可能对你自己项目有用:

团队

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}, 
}
开源项目allenai2026-07-01原文

相关内容