@hasantoxr: 我找到了为LLM时代打造的OCR工具。它叫olmOCR。olmOCR可以处理PDF、扫描件、PNG和JPEG,并将其转…
摘要
olmOCR 是来自Ai2的开源OCR工具,能够将PDF、扫描件和图像转换为干净的Markdown格式,旨在通过保留阅读顺序和处理复杂布局,为LLM流水线准备文档。
查看缓存全文
缓存时间: 2026/06/29 14:28
我找到了一个专为LLM时代打造的OCR工具。它叫olmOCR。olmOCR能将PDF、扫描件、PNG和JPEG文件转换为模型能够真正理解的干净Markdown格式。它能处理那些通常会导致文档流水线崩溃的内容:→ 表格 → 公式 → 手写体 → 多栏布局 → 图表 → 插图 → 老旧扫描件 → 页眉页脚 → 自然阅读顺序这样的话,你就不用把乱七八糟的PDF dump喂给AI,而是给AI结构化的Markdown,保留了文档本来的阅读方式。这一点很重要,因为世界上还有太多知识被困在PDF里:研究论文、法律文件、财务报告、医疗文档、扫描档案、政府文件、企业内部知识。每个人都在文档之上构建RAG系统。但如果你的OCR不行,你的AI在检索开始之前就已经错了。olmOCR修复了第一英里——这个没人谈论的乏味层,直到你的智能体因为混乱的PDF文本开始产生幻觉为止。https://github.com/allenai/olmocr
allenai/olmocr
来源:https://github.com/allenai/olmocr
一个用于将PDF及其他基于图像的文档格式转换为干净、可读的纯文本格式的工具包。
在线试用演示:https://olmocr.allenai.org/
特性:
- 将基于PDF、PNG和JPEG的文档转换为干净的Markdown
- 支持公式、表格、手写体及复杂排版
- 自动移除页眉和页脚
- 转换为自然阅读顺序的文本,即使存在图表、多栏布局和插图
- 高效,每百万页转换成本低于200美元
- (基于7B参数的VLM,因此需要GPU)
新闻
- 2025年10月21日 - v0.4.0 - 新模型发布(https://huggingface.co/allenai/olmOCR-2-7B-1025-FP8),通过合成数据将olmOCR-bench分数提升约4分,并引入RL训练。
- 2025年8月13日 - v0.3.0 - 新模型发布(https://huggingface.co/allenai/olmOCR-7B-0825-FP8),修复了自动旋转检测以及在空白文档上的幻觉问题。
- 2025年7月24日 - v0.2.1 - 新模型发布(https://huggingface.co/allenai/olmOCR-7B-0725-FP8),在olmOCR-Bench(https://github.com/allenai/olmocr/tree/main/olmocr/bench)上得分高出3分,同时由于默认使用FP8,运行速度显著加快,且每个文档所需的重试次数大大减少。
- 2025年7月23日 - v0.2.0 - 新的清洁后的训练器代码(https://github.com/allenai/olmocr/tree/main/olmocr/train),使自我训练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(https://github.com/allenai/olmocr/tree/main/olmocr/bench)发布,得分77.4。由于修复了提示词相关的bug,olmOCR管道性能提升2分。
- 2025年3月17日 - v0.1.60 - 由于在采样时选择了更好的温度,性能得到改进。
- 2025年2月25日 - v0.1.58 - 初始公开发布和演示。
基准测试
olmOCR-Bench(https://github.com/allenai/olmocr/tree/main/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
Python安装
设置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上测试)至少12GB显存
- 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
使用示例
快速测试可尝试网页演示(https://olmocr.allen.ai/)。
转换单个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(https://github.com/allenai/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,并确认它们可以工作。
| 提供商 | 每100万输入token成本 | 每100万输出token成本 | 示例命令 |
|---|---|---|---|
| Cirrascale (https://ai2endpoints.cirrascale.ai/models/overview) | $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 (https://deepinfra.com/) | $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 (https://www.saas.parasail.io/serverless?name=olmocr-7b-1025-fp8) | $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(https://www.beaker.org)高效地线性化数百万份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上的仓库(https://hub.docker.com/r/alleninstituteforai/olmocr)。
完整文档
查看所有可用选项:
olmocr --help
输出(翻译摘要):
用法: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路径添加到工作区,可以是通配符路径 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缓存预分配的显存比例(传递给vllm serve)。 –max_model_len MAX_MODEL_LEN vLLM为KV缓存分配的上限(token数),如果VLLM无法启动则降低此值 –tensor-parallel-size / -tp TENSOR_PARALLEL_SIZE vLLM的张量并行大小 –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:利用视觉语言模型解锁PDF中的数万亿Token
olmOCR 是一个开源工具包,使用微调的视觉语言模型从PDF中提取干净的文本,同时保留结构,并针对大规模批处理进行了优化。
PaddlePaddle/PaddleOCR
PaddleOCR是一个功能强大、轻量级的OCR工具包,可将PDF和图像转换为结构化数据,适用于AI应用,支持100多种语言,旨在连接文档与大语言模型。
具备视觉能力的LLM与OCR在长文档(包括图表、图片、表格等)问答中的对比
一项对比测试,将具备视觉能力的LLM(原生PDF阅读模式)与基于OCR的流程在30份长且图片密集的PDF上进行比较,发现带有布局提取的OCR在图表/表格密集的页面上仍优于视觉模型,且失败率为0%,而原生PDF为7%,尽管样本量较小且许多差距在噪声范围内。
@tom_doerr: 将文档和媒体转换为用于LLM的结构化JSON https://github.com/adithya-s-k/omniparse…
OmniParse是一个本地平台,能够接收和解析非结构化数据(文档、图像、视频、音频、Web),并将其转换为针对LLM应用(如RAG和微调)优化的结构化JSON。
@techNmak:1.7B 参数轻量 VLM,在 OmniDocBench 上碾压巨头的 OCR 新王者
仅 1.7B 参数的多语言文档解析器 dots.ocr,用轻量体积实现 SOTA,证明文档理解无需巨无霸模型。