How to convert PDFs to text with olmOCR on a cloud GPU
Rent a GPU on Deploy, then open a terminal in JupyterLab or over SSH. Install olmOCR from the official allenai/olmocr repository the way the README prints, let the pipeline download the checkpoint pipeline.py defaults to, and run olmocr on your PDFs. Copy the workspace off the instance before you destroy it, because destroying the instance deletes its disk.
Another document parser, whose model card is a different repository, is How to run Unlimited-OCR-2 on a cloud GPU. A different converter, whose README prints no minimum GPU GB figure and whose GPU-support page describes one test GPU as NVIDIA L40S 48GB, is How to convert PDFs and documents with Docling on a cloud GPU. The olmOCR local path runs vllm serve: How to serve an OpenAI-compatible API with vLLM on a cloud GPU. Copy PDFs on and results off with How to transfer files to a cloud GPU. If the process runs out of memory: How to fix CUDA out of memory on a cloud GPU. How published FLUX and SDXL weight sizes are read: How much VRAM do I need for FLUX and SDXL. A converter whose README states 8 GB+ VRAM on two standard rows, and whose quick-start command writes the -o path, is How to convert PDFs to Markdown with MinerU on a cloud GPU. A converter whose README prints no GPU GB figure, and whose default output folder is named conversion_results, is How to convert PDFs to Markdown with Marker on a cloud GPU.
The repository LICENSE file is the Apache License, Version 2.0. The appendix copyright line is still the unfilled template Copyright {yyyy} {name of copyright owner}. The README says olmOCR is licensed under Apache 2.0. The GitHub license field on 2026-11-13 was Apache-2.0. The model cards for allenai/olmOCR-2-7B-1025-FP8, allenai/olmOCR-2-7B-1025, allenai/olmOCR-7B-0825-FP8, and allenai/olmOCR-7B-0725-FP8 that day had cardData.license apache-2.0, top-level license null, and gated false. Each of those cards sets base_model to Qwen/Qwen2.5-VL-7B-Instruct and language to en. lastModified was 2026-02-19T17:30:13.000Z, 2025-10-22T15:31:06.000Z, 2025-10-22T15:27:44.000Z, and 2025-08-19T15:31:53.000Z. This page does not treat the language field as a full language-support list. Read the file before you redistribute the program or the weights.
The commands below are copied from the upstream files named in each step. They were not run on a CloudGPU instance for this page. Anything this page adds around them is marked.
What the README says about memory
The local GPU requirements line says a recent NVIDIA GPU with at least 12 GB of GPU RAM, and it names four cards it was tested on (read 2026-11-13). This page prints three of those names: RTX 4090, L40S, and A100. It does not print the fourth name. The same requirements block also states a disk figure. This page does not copy it. The features list says the toolkit is based on a 7B parameter VLM, so it requires a GPU. The features list also includes a cost sentence. This page does not copy it. Those sentences are the README’s. This page did not remeasure them.
GET /v1/public/compute-capabilities does not list GPUs. It returns feature flags. The memory column is vram_gb from gpu-prices.json, updated_at 2026-11-13T10:09:27.510Z. GET /v1/public/gpu-catalog the same day (generated_at 2026-11-13T10:09:28.527Z) listed the same names and the same vram_gb values, plus Ascend 910B at 64, which is not in gpu-prices.json and is not listed here. The catalog response also includes an availability field. This page does not copy it. Every prices row has gpu_count 1. The smallest vram_gb in that file is 8, on RTX 2080. Catalog rows whose vram_gb is below 12 are RTX 2080 at 8, RTX 3080 at 10, and RTX 2080 Ti at 11. Catalog RTX 3080 Ti is 12. Catalog RTX 4090 is 24. L40S is not a name in gpu-prices.json. A100 appears as A100 40G at 40 and A100 80G at 80. Those catalog numbers are not a measurement of this model. This page did not run olmOCR and does not mark a row as enough. Which listing you can start is on Deploy.
The catalog template list had no olmOCR template.
| Catalog name | vram_gb |
|---|---|
| RTX 2080 | 8 |
| RTX 3080 | 10 |
| RTX 2080 Ti | 11 |
| RTX 3080 Ti | 12 |
| V100 16G | 16 |
| A30 | 24 |
| RTX 3090 | 24 |
| RTX 4090 | 24 |
| RTX 4090D | 24 |
| RTX 4080 SUPER 32G | 32 |
| RTX 5090 | 32 |
| RTX 5090D | 32 |
| V100 32G | 32 |
| A100 40G | 40 |
| A800 40G | 40 |
| A40 | 48 |
| RTX 4090 48G | 48 |
| RTX 4090D 48G | 48 |
| RTX A6000 | 48 |
| NVIDIA RTX PRO 5000 72G | 72 |
| RTX PRO 5000 72G | 72 |
| A100 80G | 80 |
| A800 80G | 80 |
| H800 | 80 |
| RTX 6000D | 83 |
| H20 96G | 96 |
| RTX PRO 6000 96G | 96 |
| RTX PRO 6000 Max-Q | 96 |
| H20-3e 141G | 141 |
Install
On Deploy, choose Raw GPU. The README’s system-dependencies block, copied:
sudo apt-get update
sudo apt-get install poppler-utils ttf-mscorefonts-installer msttcorefonts fonts-crosextra-caladea fonts-crosextra-carlito gsfonts lcdf-typetools
The README then creates a conda environment. The conda block does not print a clone. pip install olmocr installs the package from the index. The clone line below is this page’s, so the repository files are on disk. The comment marking that is this page’s.
# The README's conda block does not print a clone. This line is this page's.
git clone https://github.com/allenai/olmocr.git
cd olmocr
conda create -n olmocr python=3.11
conda activate olmocr
The README’s local GPU install, copied. The comment is the README’s.
pip install olmocr[gpu] --extra-index-url https://download.pytorch.org/whl/cu128
# Recommended: Install flash infer for faster inference on GPU
pip install https://download.pytorch.org/whl/cu128/flashinfer/flashinfer_python-0.2.5%2Bcu128torch2.7-cp38-abi3-linux_x86_64.whl
The README’s remote-inference option, for a process that passes --server, is pip install olmocr. It says this avoids installing heavy GPU dependencies and puts a size in parentheses. This page does not copy that size. pyproject.toml requires Python >=3.11. The gpu extra lists torch>=2.7.0, transformers==4.57.3, and vllm==0.11.2. The script entry is olmocr = olmocr.pipeline:cli_main. The README also prints pip install olmocr[beaker], pip install olmocr[bench], and combined extras. This page does not copy the Beaker cluster commands. The troubleshooting block is ulimit -n 65536 for a “too many open files” error. The commits API for the default branch main listed f7cfe4c22098b154c76b6ec950d1c0a464eecf8d, committed 2026-03-25T17:52:36Z. README.md and pyproject.toml were c4a7ca8395a90b3d240d7a4ade7aa0d8996cbf60, committed 2026-03-23T16:38:21Z.
The RTX 5090 guide says that card is compute capability 12.0 (sm_120) and that PyTorch 2.7 and later, on a build for CUDA 12.8 or newer, is the line that announced support. The gpu extra requires torch>=2.7.0, and the install line uses the cu128 index. This page did not re-test olmOCR on an RTX 5090. Catalog RTX 5090 and RTX 5090D are 32. That is the catalog number only.
The documented pipeline
The single-PDF example, copied. The comments are the README’s.
# Download a sample PDF
curl -o olmocr-sample.pdf https://olmocr.allenai.org/papers/olmocr_3pg_sample.pdf
# Convert it to markdown
olmocr ./localworkspace --markdown --pdfs olmocr-sample.pdf
The image example and the multiple-PDF example, copied:
olmocr ./localworkspace --markdown --pdfs random_page.png
olmocr ./localworkspace --markdown --pdfs tests/gnarly_pdfs/*.pdf
The README says that with the --markdown flag, results are stored as markdown files inside ./localworkspace/markdown/. It says you can also use python -m olmocr.pipeline instead of olmocr. The viewing section runs cat localworkspace/markdown/olmocr-sample.md and says the workspace folder then has both Dolma and markdown files if --markdown is set.
pipeline.py writes Dolma JSONL to workspace/results/output_<work hash>.jsonl. When --markdown is set, get_markdown_path joins workspace/markdown with the source path and changes the extension to .md. For a relative local name such as olmocr-sample.pdf, that is localworkspace/markdown/olmocr-sample.md, which is the path the README cats. --model in that file defaults to allenai/olmOCR-2-7B-1025-FP8, and its help string names that same id as the default. The README’s pasted --help text says allenai/olmOCR-7B-0725-FP8 is the default. The usage examples above do not pass --model, so they use whatever default the installed pipeline.py has. The news section names allenai/olmOCR-2-7B-1025-FP8, allenai/olmOCR-7B-0825-FP8, and allenai/olmOCR-7B-0725-FP8. A later note names allenai/olmOCR-2-7B-1025 without the FP8 suffix, and says that if you run locally you can use olmocr as the model identifier. pipeline.py was 8854eda39eea58eab2724e84ad3cd0994f3b31cf, committed 2026-03-09T18:54:39Z. This page did not run the pipeline.
vLLM
The README’s external-server example, copied. The host in it is the README’s placeholder.
olmocr ./localworkspace --server http://remote-server:8000/v1 --model allenai/olmOCR-2-7B-1025-FP8 --markdown --pdfs *.pdf
The README’s example server launch, copied:
vllm serve allenai/olmOCR-2-7B-1025-FP8 --max-model-len 16384
pipeline.py, when --server is not set, builds its own vllm serve command. It passes --port from an argument whose default is 30024, --served-model-name olmocr, and --max-model-len from an argument whose default is 16384. The pasted --help in the README describes --port and does not print 30024. A log line in main says to retry with lower values, for example --gpu_memory_utilization 0.80 and --max_model_len 16384, if you run out of GPU memory during start-up or get “KV cache is larger than available memory”. The argument defined in that file is --gpu-memory-utilization, with a hyphen. The log example uses underscores. The README has a verified-providers table with prices and example commands. This page does not copy that table. The --server notes and the --api_key help text each name a provider and, in the notes, an example URL. This page does not print those names or that URL. Copy those lines from the README and from pipeline.py if you need them. This page did not start the server. Forward the port you pass with how to use SSH port forwarding on a cloud GPU.
The general vLLM install on a rented GPU is How to serve an OpenAI-compatible API with vLLM on a cloud GPU. This README pins vllm==0.11.2 in the gpu extra. This page did not check that pin against the other guide’s install line.
Docker
The README’s pull lines. The comment on the with-model pull includes a size. This page does not copy that size. The commands were not run.
docker pull alleninstituteforai/olmocr:latest-with-model
docker pull alleninstituteforai/olmocr:latest
The README’s single-PDF container command, copied:
docker run --gpus all \
-v $(pwd):/workspace \
alleninstituteforai/olmocr:latest-with-model \
-c "olmocr /workspace/output --markdown --pdfs /workspace/sample.pdf"
ComfyUI
The README does not document a ComfyUI install. The ComfyUI examples top-level directory list on 2026-11-13 had no directory named for this project. The audio directory at that commit listed README.md, ace_step_example.flac, and stable_audio_example.flac. Examples HEAD was f9431bb000ce792094ff345446e22cac1ea6cef3, committed 2025-11-26T20:33:58Z. Installing ComfyUI itself is How to install ComfyUI and ComfyUI-Manager on a cloud GPU. This page does not add a ComfyUI install.
When it fails
CUDA out of memory. The log line quoted above is the file’s retry example. The README’s GPU line is at least 12 GB of GPU RAM. If the process raises that error, use how to fix CUDA out of memory on a cloud GPU.
“CUDA error: no kernel image is available for execution on the device” on an RTX 5090. See the install section. This page did not re-test the package on that card.
too many open files. The README’s troubleshooting block is ulimit -n 65536.
Pasted help and the code default. The README’s pasted --help says the default model is allenai/olmOCR-7B-0725-FP8. pipeline.py at the commit above defaults --model to allenai/olmOCR-2-7B-1025-FP8.
Save the workspace, then destroy
Dolma JSONL lands in <workspace>/results/. With --markdown, markdown lands under <workspace>/markdown/. Copy that workspace before you destroy the instance. Save your work before you destroy a cloud GPU is the checklist. The terms say data on local instance storage is permanently deleted when the instance is destroyed.
The pricing page FAQ states the billing rule in these words:
Per-minute options have a 1-minute minimum; unused prepaid minutes are refunded when you destroy the instance. Some configurations use whole-hour billing with a 1-hour minimum; unused time within a charged hour is not refunded on voluntary stop. The billing period, minimum charge and initial prepayment are shown before confirmation. No subscription.
Frequently asked questions
What GPU requirement does the olmOCR README state?
The local GPU requirements line says a recent NVIDIA GPU with at least 12 GB of GPU RAM, and it names four cards it was tested on. This page prints three of those names: RTX 4090, L40S, and A100. It does not print the fourth name. The same block also states a disk figure. This page does not copy it. pipeline.py defaults --model to allenai/olmOCR-2-7B-1025-FP8. The pasted README --help text says allenai/olmOCR-7B-0725-FP8 is the default. The smallest vram_gb in gpu-prices.json (updated_at 2026-11-13T10:09:27.510Z) is 8, on RTX 2080. Catalog RTX 3080 Ti is 12. Catalog RTX 4090 is 24. L40S is not a name in gpu-prices.json. A100 appears as A100 40G at 40 and A100 80G at 80. This page did not run olmOCR and does not mark a row as enough. Which listing you can start is on https://cloudgpu.app/deploy.
Which command converts a PDF, and where are the files written?
The README single-PDF example downloads olmocr-sample.pdf and runs olmocr ./localworkspace --markdown --pdfs olmocr-sample.pdf. It says you can also use python -m olmocr.pipeline. It says that with --markdown, results are stored as markdown files inside ./localworkspace/markdown/. The viewing section cats localworkspace/markdown/olmocr-sample.md and says the workspace folder has both Dolma and markdown files when --markdown is set. pipeline.py writes Dolma JSONL to workspace/results/output_<work hash>.jsonl. get_markdown_path joins workspace/markdown with the source path and changes the extension to .md. The --model default in that file is allenai/olmOCR-2-7B-1025-FP8. This page did not run the command.
Does the repository start a vLLM server, and does it document ComfyUI?
When --server is not set, pipeline.py builds a vllm serve command. It passes --port from an argument whose default is 30024, --served-model-name olmocr, and --max-model-len from an argument whose default is 16384. The README example server line is vllm serve allenai/olmOCR-2-7B-1025-FP8 --max-model-len 16384. The README has a verified-providers table. This page does not copy that table. The --api_key help text names a provider. This page does not print that name. The README does not document ComfyUI. The ComfyUI examples top-level directory list on 2026-11-13 had no directory named for this project. Examples HEAD was f9431bb000ce792094ff345446e22cac1ea6cef3.
Which license covers olmOCR?
The repository LICENSE file is the Apache License, Version 2.0, and the appendix copyright line is still the unfilled template Copyright {yyyy} {name of copyright owner}. The README says olmOCR is licensed under Apache 2.0. The GitHub license field on 2026-11-13 was Apache-2.0. The cards for allenai/olmOCR-2-7B-1025-FP8, allenai/olmOCR-2-7B-1025, allenai/olmOCR-7B-0825-FP8, and allenai/olmOCR-7B-0725-FP8 had cardData.license apache-2.0, top-level license null, and gated false. Section 2 of that Apache file grants a no-charge, royalty-free copyright license. That wording is the upstream license, not a CloudGPU price and not a storage allowance. Read the file before you redistribute the program or the weights.
Sources (read 2026-11-13, Asia/Shanghai)
- olmOCR README (system packages, conda and
pip install olmocr[gpu], the cu128 index, the flashinfer wheel, the single-PDF command,--markdownoutput under./localworkspace/markdown/, thevllm serveexample, the pasted--helpdefaultallenai/olmOCR-7B-0725-FP8, at least 12 GB of GPU RAM): https://github.com/allenai/olmocr/blob/main/README.md commitc4a7ca8395a90b3d240d7a4ade7aa0d8996cbf60. Repository HEADf7cfe4c22098b154c76b6ec950d1c0a464eecf8d, committed 2026-03-25T17:52:36Z olmocr/pipeline.py(--modeldefaultallenai/olmOCR-2-7B-1025-FP8,--portdefault 30024,--served-model-name olmocr, Dolma pathresults/output_<hash>.jsonl,get_markdown_path): commit8854eda39eea58eab2724e84ad3cd0994f3b31cfpyproject.toml(requires-python >=3.11,gpuextratorch>=2.7.0,transformers==4.57.3,vllm==0.11.2): commitc4a7ca8395a90b3d240d7a4ade7aa0d8996cbf60LICENSE(Apache-2.0, unfilled copyright template with braces): commit68b2c0e8d6ed19b5e8e16b37d89093e86b60bbf1. GitHub license field Apache-2.0- Model cards
allenai/olmOCR-2-7B-1025-FP8,allenai/olmOCR-2-7B-1025,allenai/olmOCR-7B-0825-FP8, andallenai/olmOCR-7B-0725-FP8(apache-2.0,gatedfalse,base_modelQwen/Qwen2.5-VL-7B-Instruct), read 2026-11-13 - ComfyUI examples top-level directories (no olmOCR directory): https://github.com/comfyanonymous/ComfyUI_examples commit
f9431bb000ce792094ff345446e22cac1ea6cef3 - Public GPU memory: https://cloudgpu.app/gpu-prices.json (
updated_at2026-11-13T10:09:27.510Z) and https://cloudgpu.app/v1/public/gpu-catalog (generated_at2026-11-13T10:09:28.527Z).GET /v1/public/compute-capabilitiesreturned feature flags and no GPU list. The catalog had no olmOCR template
Cards you can start are on the Deploy page. Prices are on https://cloudgpu.app/pricing and are not repeated here.
Last updated: 2026-11-13 (Asia/Shanghai).