On this page
- What PaddleOCR-VL is
- Versions: v1, 1.5 and 1.6
- Benchmarks: where PaddleOCR-VL stands
- Hardware requirements
- Install
- Python and CLI usage
- Serving: vLLM, SGLang, FastDeploy, llama.cpp
- Apple Silicon, AMD, Ascend and other hardware
- Hugging Face and Transformers
- The hosted API (no GPU needed)
- HPD-Parsing: the throughput-first sibling
- Fine-tuning
- FAQ
Short answer: install a GPU build of PaddlePaddle 3.2.1+, then pip install "paddleocr[doc-parser]", then call PaddleOCRVL().predict("file.pdf"). That runs the full pipeline — layout analysis plus the 0.9B VLM — and gives you Markdown and JSON per page. For production, put the VLM behind vLLM, SGLang or FastDeploy and point the pipeline at it with vl_rec_backend. If you have no GPU, the hosted PaddleOCR API serves the same model.
What we tested and what we didn't. Our test machine has no GPU, so we have not run PaddleOCR-VL and this page reports no speeds of our own. Every command and parameter below was checked against the PaddleOCR 3.7.0 wheel, PaddleX 3.7.2 configs and the official docs, with line numbers in the sources. For a document parser we did run and time on CPU, see PP-StructureV3.
What PaddleOCR-VL is#
PaddleOCR-VL is a two-stage pipeline, not a single model.1 The first stage is a layout model that detects every element on the page (paragraphs, titles, tables, formulas, charts, seals), puts them in reading order and crops them. The second stage is a small vision-language model that reads each crop and writes Markdown, an HTML table, LaTeX or a chart table. The pipeline then stitches the pieces back together in reading order.
restructure_pages().The VLM component pairs a NaViT-style dynamic-resolution visual encoder with the ERNIE-4.5-0.3B language model.1 The Hugging Face API reports 958,588,736 parameters (BF16 safetensors) for all three releases — v1, 1.5 and 1.6 share one architecture.4 "0.9B" in names like PaddleOCR-VL-1.6-0.9B refers to this VLM component only, not a separate model size.1
Use the whole pipeline. The official docs are blunt about this: sending page images straight to the VLM through Transformers, vLLM, SGLang or FastDeploy "is not equivalent" to running PaddleOCR-VL. If you see poor accuracy or hallucinated text, the first thing to check is whether the layout stage is running.1
PaddleOCR-VL or PP-StructureV3?#
Both convert documents to Markdown and JSON and both ship in paddleocr[doc-parser]. The README positions PP-StructureV3 as the choice when you need finer-grained coordinates, such as table-cell and text-line boxes, which the VL series doesn't return.5 PaddleOCR-VL is the accuracy pick: on the OmniDocBench v1.5 table, PaddleOCR-VL-1.5 scores 94.50 and PP-StructureV3 86.73.7 PP-StructureV3 runs comfortably on a CPU; PaddleOCR-VL is designed for a GPU.
Versions: v1, 1.5 and 1.6#
- PaddleOCR-VL (v1) ships with PaddleOCR 3.3.0. 109 languages; text, tables, formulas and charts; arXiv 2510.14528.54
- Hugging Face Transformers support.4
- Official vLLM support.4
- PaddleOCR-VL-1.5 with PaddleOCR 3.4.0. New PP-DocLayoutV3 layout model with polygon boxes, seal recognition, text spotting, cross-page table merging and heading levels; adds Tibetan and Bengali; arXiv 2601.21957.15
- llama.cpp (GGUF) support for 1.5.4
- PaddleOCR-VL-1.6 with PaddleOCR 3.6.0. Same architecture as 1.5; better ancient-document, rare-character, seal, spotting and chart results per Baidu. Technical report arXiv 2606.03264 followed on June 3.19
- HPD-Parsing, a separate high-throughput parser, is announced (see below).5
| Release | Python / CLI value | Layout model | VLM component |
|---|---|---|---|
| PaddleOCR-VL (v1) | v1 | PP-DocLayoutV2 | PaddleOCR-VL-0.9B |
| PaddleOCR-VL-1.5 | v1.5 | PP-DocLayoutV3 | PaddleOCR-VL-1.5-0.9B |
| PaddleOCR-VL-1.6 | v1.6 (default) | PP-DocLayoutV3 | PaddleOCR-VL-1.6-0.9B |
Layout models and component names come from the PaddleX 3.7.2 pipeline configs.3 The VLM understands task prompts: v1 knows OCR:, Table Recognition:, Formula Recognition: and Chart Recognition:; 1.5 and 1.6 add Spotting: and Seal Recognition:.4 PP-DocLayoutV2 and V3 share the same 25 labels, including display_formula, inline_formula, vertical_text, seal and chart.15 V3 predicts polygon boxes and reading order in one forward pass; its own model card says it is also used by GLM-OCR.15
109 or 111 languages? The usage tutorial says the series supports 109 languages. The README's 3.4.0 entry says PaddleOCR-VL-1.5 supports 111, and the 1.5 model card says it added Tibetan and Bengali without giving a total.154 The most likely reading is 109 for v1 and 111 from 1.5 on, but no official page states that outright.
Benchmarks: where PaddleOCR-VL stands#
The most-cited benchmark for document parsers is OmniDocBench, published by OpenDataLab — the team that also builds MinerU, which appears on the same table. The leaderboard below is the one in OmniDocBench's own README, not Baidu's. We copied the rows as published.6 "Overall" there is ((1 − TextEdit) × 100 + TableTEDS + FormulaCDM) / 3 over 1,651 pages.6
OmniDocBench v1.6_full end-to-end overall score, higher is better. Top 10 of the 35 rows in the OmniDocBench README as of Oct 27, 2026.
| Model (size) | Overall |
|---|---|
| TeleOCR (1.2B) | 96.91 |
| OvisOCR2 (0.8B) | 96.47 |
| PaddleOCR-VL-1.6 (0.9B) | 96.34 |
| MinerU2.5-Pro (1.2B) | 95.75 |
| GLM-OCR (0.9B) | 95.22 |
| PaddleOCR-VL-1.5 (0.9B) | 94.93 |
| PaddleOCR-VL v1 (0.9B) | 94.18 |
| Unlimited-OCR (3B) | 94.00 |
| Qianfan-OCR (4B) | 93.90 |
| Youtu-Parsing (2.5B) | 93.74 |
PaddleOCR-VL-1.6 has the best formula score (CDM 97.53) of the ten, while TeleOCR leads on tables and OvisOCR2 on text edit distance.6 For scale, the same table lists Gemini 3 Pro at 92.91, dots.ocr at 90.77, GPT-5.2 at 86.59 and the MinerU pipeline at 86.47. GPT-4o and PP-StructureV3 are not in this table.6 Remember that a 1–2 point gap on a 1,651-page benchmark says little about your documents — test on a sample of your own.
Three caveats on these numbers. (1) Baidu's own docs give 1.6 as 96.33 or "96.3%"; OmniDocBench's table says 96.34.96 (2) The OmniDocBench update log says the benchmark moved "from v1.6 to v1.7" on April 30, 2026, but the table caption still reads "v1.6_full"; we use the caption.6 (3) Scores from different OmniDocBench versions are not comparable: 1.5 scored 94.50 on the v1.5 table and 94.93 on v1.6_full.7
How much did each version improve?#
Biggest gains on photographed pages. Overall scores. OmniDocBench v1.6_full is third-party; Real5-OmniDocBench (scans, warping, screen photos, lighting, skew) was built by the PaddleOCR team.
| Version | OmniDocBench v1.6_full (third-party) | Real5-OmniDocBench (first-party) |
|---|---|---|
| PaddleOCR-VL v1 | 94.18 | 85.54 |
| PaddleOCR-VL-1.5 | 94.93 | 92.05 |
| PaddleOCR-VL-1.6 | 96.34 | 93.19 |
.eval_results/real5_omnidocbench.yaml in each Hugging Face repo. Real5-OmniDocBench is Baidu's own benchmark.The jump from v1 to 1.5 on Real5-OmniDocBench is driven by the hard cases: skewed pages went from 77.47 to 91.66 and screen photos from 82.54 to 91.76, in line with the switch to polygon layout boxes in PP-DocLayoutV3.8 Treat those as vendor numbers. On the independent table the gains are smaller: +0.75 from v1 to 1.5 and +1.41 from 1.5 to 1.6.6
Hardware requirements#
On NVIDIA GPUs, the requirement depends on which engine runs the VLM:1
| VLM engine | Compute capability | CUDA |
|---|---|---|
| PaddlePaddle (default) | ≥ 7.0 | ≥ 11.8 |
| Transformers | ≥ 7.0 | ≥ 11.8 |
| vLLM | ≥ 8.0 | ≥ 12.6 |
| SGLang | 8.0 – below 12.0 | ≥ 12.6 |
| FastDeploy | 8.0 – below 12.0 | ≥ 12.6 |
- T4 and V100 (CC 7.x) can start vLLM but the docs say it is "prone to timeouts or OOM" and not recommended. Use the PaddlePaddle engine on those cards.1
- RTX 30/40/50 and A10/A100 are CC 8+ and qualify for every backend except that RTX 50 (Blackwell, CC 12) is outside the SGLang and FastDeploy range. Blackwell has its own guide: a driver supporting CUDA 12.9+ and
-sm120images.11 - VRAM: no minimum is documented anywhere in the repo. The only memory guidance is a tuning tip for the NVIDIA RTX 3060: set
gpu-memory-utilization: 0.7for vLLM or FastDeploy.1 - x64 CPU: the support matrix marks local PaddlePaddle inference on x64 CPU as supported, but the MCP server docs say "CPU inference is not recommended" for the VL series.116 We haven't timed it.
Which inference method works on which device#
| Layout + VLM engine | NVIDIA | x64 CPU | Apple Silicon | AMD | Ascend |
|---|---|---|---|---|---|
| PaddlePaddle | Yes | Yes | Yes | Yes | Pending |
| Transformers | Yes | Yes | Pending | Pending | Pending |
| + vLLM server | Yes | No | No | Yes | Yes |
| + SGLang server | Yes | No | No | Pending | Pending |
| + FastDeploy server | Yes | No | No | Pending | Pending |
| + MLX-VLM server | No | No | Yes | No | No |
| + llama.cpp server | Yes | Yes | Pending | Pending | Pending |
The "+ server" rows run layout with PaddlePaddle on the client and the VLM on the named server. "Pending" means the docs mark it as in progress or not yet verified. The official matrix also covers Kunlunxin, Hygon, MetaX, Iluvatar and Intel Arc (see below). vLLM, SGLang and FastDeploy don't run natively on Windows, so use Docker there.1
Install#
The VL guide asks for PaddlePaddle 3.2.1 or later and Python 3.9–3.13, and recommends a virtual environment. Don't install the CPU and GPU builds of PaddlePaddle side by side.1
python -m venv .venv_paddleocr && source .venv_paddleocr/bin/activate
python -m pip install paddlepaddle-gpu==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/
python -m pip install -U "paddleocr[doc-parser]"python -m venv .venv_paddleocr && source .venv_paddleocr/bin/activate
python -m pip install paddlepaddle==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/
python -m pip install -U "paddleocr[doc-parser]"# ~8 GB image with PaddlePaddle preinstalled; needs a driver for CUDA 12.6+
docker run -it --gpus all --network host --user root \
ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-vl:latest-nvidia-gpu \
/bin/bash
# then run the paddleocr CLI or Python inside the container
# offline variant (~10 GB): ...:latest-nvidia-gpu-offlineTwo version notes from our own testing. With the plain PyPI paddlepaddle (3.3.1 at the time of writing), PP-OCRv6 inference on CPU crashed for us with a ConvertPirAttribute2RuntimeAttribute error — that's why we pin the exact version the guide names. And if you see A dependency error occurred during pipeline creation, you installed paddleocr without the [doc-parser] extra. Both are in our error fixer; the full matrix of OS and CUDA options is on the install page.
Python and CLI usage#
from paddleocr import PaddleOCRVL
pipeline = PaddleOCRVL() # loads v1.6 by default
# pipeline = PaddleOCRVL(pipeline_version="v1.5")
# pipeline = PaddleOCRVL(engine="transformers")
# pipeline = PaddleOCRVL(device="cpu") # Apple Silicon
for res in pipeline.predict("paper.png"):
res.print()
res.save_to_json(save_path="output")
res.save_to_markdown(save_path="output")
res.save_to_word(save_path="output") # .docxpaddleocr doc_parser -i paper.png --save_path ./output
# pick a release, or switch engine
paddleocr doc_parser -i paper.png --pipeline_version v1.5 --save_path ./output
paddleocr doc_parser -i paper.png --engine transformers --save_path ./output
# fix rotated or curved pages first
paddleocr doc_parser -i photo.jpg --use_doc_orientation_classify True --use_doc_unwarping Truepipeline_version accepts exactly "v1", "v1.5" and "v1.6", which map to the PaddleX pipelines PaddleOCR-VL, PaddleOCR-VL-1.5 and PaddleOCR-VL-1.6.2 Each result has the same parsing_res_list shape as PP-StructureV3 — block_label, block_content, block_bbox, block_order — and the save methods save_to_json, save_to_markdown, save_to_html, save_to_xlsx, save_to_word and save_to_img.1
Multi-page PDFs: restructure_pages()#
A PDF gives you one result per page. To merge tables that continue across pages, rebuild heading levels across the whole document, or join everything into one result, pass the page list to restructure_pages():1
from paddleocr import PaddleOCRVL
pipeline = PaddleOCRVL()
pages = list(pipeline.predict("report.pdf"))
# merge_tables and relevel_titles already default to True in the code
merged = pipeline.restructure_pages(pages, concatenate_pages=True)
for res in merged: # one result with concatenate_pages=True
res.save_to_markdown(save_path="output")The signature in PaddleOCR 3.7.0 is restructure_pages(res_list, merge_tables=True, relevel_titles=True, concatenate_pages=False) and it returns a list.2 The official example passes merge_tables=True, relevel_titles=True explicitly, which suggests they are off by default; they aren't. Only concatenate_pages needs turning on. A simpler concatenate_markdown_pages(markdown_list) helper, the one PP-StructureV3 has, also exists.
Parameters you'll actually use#
| Parameter | Default | What it does |
|---|---|---|
pipeline_version | "v1.6" | Which release to load. |
vl_rec_backend | native (config) | native, vllm-server, sglang-server, fastdeploy-server, mlx-vlm-server, llama-cpp-server. |
vl_rec_server_url | — | URL of the VLM server, e.g. http://localhost:8118/v1. |
vl_rec_max_concurrency | — | Concurrent requests the client sends to the server. |
use_layout_detection | True | Turn off to send the whole image to the VLM with one prompt. |
prompt_label | "ocr" | Only when layout is off: ocr, formula, table, chart, spotting, seal. |
use_chart_recognition | False | Convert charts to tables. |
use_seal_recognition | False | Read stamps and seals (1.5+). |
use_ocr_for_image_block | False | Also read text inside blocks labelled as images. |
use_doc_orientation_classify / use_doc_unwarping | False | Fix rotated or curved pages before layout. |
merge_layout_blocks | True | Merge adjacent layout blocks. |
layout_shape_mode | "auto" | rect, quad, poly or auto box geometry. |
markdown_ignore_labels | 7 labels | Blocks left out of Markdown: number, footnote, header, header_image, footer, footer_image, aside_text. |
max_new_tokens, temperature, top_p, repetition_penalty | — | VLM sampling controls. |
vl_rec_* settings go to the constructor; the rest can be set there or per call in predict(), except prompt_label, layout_shape_mode and the sampling controls, which are predict()-only. Defaults are from the usage doc and the 3.7.0 source; prompt_label values are from the PaddleX 3.7.2 code, which accepts six labels although its error message lists four.123 One conflict: the docs give layout_threshold a default of 0.5, while the PaddleX configs use 0.3 for 1.5 and 1.6 and per-class 0.4–0.5 for v1.3 To see exactly what your pipeline will use, call pipeline.export_paddlex_config_to_yaml("vl.yaml"); after editing, pass the file back with PaddleOCRVL(paddlex_config="vl.yaml").2
Serving: vLLM, SGLang, FastDeploy, llama.cpp#
The quick-start path above runs everything in one Python process. The docs call that suitable for "rapid validation" and recommend a dedicated VLM inference server for production.1 The split is: a VLM server runs only the 0.9B model; your client — still the PaddleOCRVL pipeline — runs layout analysis locally and sends crops to the server. Because the client still runs a layout model, the docs recommend running it on a GPU too.1
Start the VLM server#
docker run -it --rm --gpus all --network host \
ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-genai-vllm-server:latest-nvidia-gpu \
paddleocr genai_server --model_name PaddleOCR-VL-1.6-0.9B --host 0.0.0.0 --port 8118 --backend vllmdocker run -it --rm --gpus all --network host \
ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-genai-fastdeploy-server:latest-nvidia-gpu \
paddleocr genai_server --model_name PaddleOCR-VL-1.6-0.9B --host 0.0.0.0 --port 8118 --backend fastdeploypython -m venv .venv_vlm && source .venv_vlm/bin/activate
python -m pip install "paddleocr[doc-parser]"
paddleocr install_genai_server_deps vllm # or: sglang, fastdeploy
paddleocr genai_server --model_name PaddleOCR-VL-1.6-0.9B --backend vllm --port 8118# GGUF files: huggingface.co/PaddlePaddle/PaddleOCR-VL-1.6-GGUF
./build/bin/llama-server \
-m /path/to/PaddleOCR-VL-1.6-GGUF.gguf \
--mmproj /path/to/PaddleOCR-VL-1.6-GGUF-mmproj.gguf \
--port 8111 --host 0.0.0.0 --temp 0Commands are verbatim from the usage tutorial.1 The vLLM and SGLang builds installed by install_genai_server_deps target CUDA 12.6, and vLLM/SGLang need FlashAttention 2.8.2. The Transformers engine can't share an environment with vLLM or SGLang because they need different transformers versions.1 Server tuning goes in a YAML file passed with --backend_config (for example gpu-memory-utilization and max-num-seqs for vLLM).
| Docker image | Size | Offline variant |
|---|---|---|
paddleocr-vl (whole pipeline) | ~8 GB | ~10 GB |
paddleocr-genai-vllm-server | ~13 GB | ~15 GB |
paddleocr-genai-fastdeploy-server | ~43 GB | ~45 GB |
Point the pipeline at it#
from paddleocr import PaddleOCRVL
pipeline = PaddleOCRVL(
vl_rec_backend="vllm-server", # or sglang-server, fastdeploy-server
vl_rec_server_url="http://localhost:8118/v1",
vl_rec_max_concurrency=16, # tune for your GPU
)
for res in pipeline.predict("report.pdf"):
res.save_to_markdown(save_path="output")paddleocr doc_parser --input report.pdf \
--vl_rec_backend vllm-server \
--vl_rec_server_url http://localhost:8118/v1# server started with plain `vllm serve` (port 8000): pass the HF repo id
paddleocr doc_parser --input report.pdf \
--vl_rec_backend vllm-server \
--vl_rec_server_url http://localhost:8000/v1 \
--vl_rec_api_model_name 'PaddlePaddle/PaddleOCR-VL-1.6'Managed VLM endpoints work the same way with --vl_rec_api_key. Per the docs, SiliconFlow serves only v1 and 1.5 (use pipeline_version="v1.5") and Novita AI only v1.1
A full HTTP API#
For an HTTP endpoint that runs the entire pipeline, the docs offer a Docker Compose setup (listens on port 8080) or paddlex --serve --pipeline PaddleOCR-VL. Both process one request at a time; for concurrency the docs point to a separate high-performance serving (HPS) solution.1 Our serving and API guide covers request formats and clients.
Published throughput (Baidu's numbers)#
Baidu reports end-to-end throughput for PaddleOCR-VL-1.5 on OmniDocBench v1.5 with one A100 and batches of 512: 1.4335 pages/s with FastDeploy 2.3, 1.1433 with vLLM 0.10.2 and 1.0091 with SGLang 0.5.2. In the same table MinerU2.5 on vLLM does 0.9984 pages/s.10 These tables exist only as images in the repo; we transcribed them. The 1.6 doc says inference speed is identical to 1.5.9 We have no GPU numbers of our own.
Apple Silicon, AMD, Ascend and other hardware#
Each accelerator has its own official guide, and each names one device it was verified on:11
| Hardware | Verified on | How the VLM runs |
|---|---|---|
| Apple Silicon | M4 (M1–M3 listed, unconfirmed) | PaddlePaddle on CPU, or pip install "mlx-vlm>=0.3.11", mlx_vlm.server --port 8111, client --vl_rec_backend mlx-vlm-server. No Docker. |
| AMD GPU | MI300X | vLLM image paddleocr-genai-vllm-server:latest-amd-gpu (~31 GB) |
| NVIDIA Blackwell | RTX 5070 | Driver for CUDA 12.9+, -sm120 images, PaddlePaddle from the cu129 index |
| Huawei Ascend | 910B | No local direct inference; use the vLLM service |
| Kunlunxin XPU | P800 | PaddlePaddle or FastDeploy |
| MetaX GPU | C550 | PaddlePaddle or FastDeploy |
| Hygon DCU | K100AI | PaddlePaddle or vLLM |
| Intel Arc | Arc B60 Pro | vLLM |
| Iluvatar GPU | BI-V150 | PaddlePaddle or FastDeploy |
Hugging Face and Transformers#
The weights are on Hugging Face as PaddlePaddle/PaddleOCR-VL, -1.5 and -1.6, plus a GGUF build and the standalone PP-DocLayoutV3 layout model. The model cards include a raw Transformers example that sends one image with a task prompt such as OCR: or Table Recognition:; for 1.5 and 1.6 it needs transformers>=5.0.0.4 That's element-level recognition — useful for a cropped table or formula, but not a full-page parser. For whole documents through Transformers, keep the pipeline and switch its engine: PaddleOCRVL(engine="transformers").1
The hosted API (no GPU needed)#
PaddleOCR 3.7.0 ships a client for the official hosted service, and its document-parsing default is PaddleOCR-VL-1.6.13 You need an access token from AI Studio. We checked the code against the 3.7.0 source but haven't called the service.
# export PADDLEOCR_ACCESS_TOKEN="..."
from paddleocr import PaddleOCRClient, Model
client = PaddleOCRClient()
result = client.parse_document(
file_path="report.pdf",
model=Model.PADDLE_OCR_VL_16, # the default
)
for page in result.pages:
print(page.markdown_text)
client.close()export PADDLEOCR_ACCESS_TOKEN="..."
paddleocr api --model_type doc_parsing --file_path report.pdfThe AI Studio quota page says each user can parse up to 3,000 pages per model per day and that only the first 100 pages of a file are parsed; the async API guide says one request supports up to 1,000 PDF pages. The two official pages disagree, so test with your own files.14 No price is published on any page we could read. Details, SDKs for TypeScript and Go, and error codes are on our API page.
HPD-Parsing: the throughput-first sibling#
HPD-Parsing, announced July 22, 2026, is a separate ~1B document VLM built on InternVL3.5-1B for high-volume parsing. Instead of decoding a page as one long token stream, a main layout branch spawns content branches that decode in parallel, and Progressive Multi-Token Prediction (P-MTP) cuts decoding steps further.12
- Accuracy (self-reported): 94.91 overall on OmniDocBench v1.6. HPD-Parsing is not in the OmniDocBench README table, so there is no independent number; for comparison, PaddleOCR-VL-1.6 is 96.34 on that table.126
- Speed (self-reported): 2.68 pages/s and 4,752.1 tokens/s on an A800 80GB with vLLM and batch 512, against 1.02 pages/s for an autoregressive baseline.12
- Requirements: NVIDIA GPU (verified on H100, H800, H20, A100, A800, A30, L20, RTX Pro 6000), driver for CUDA 12.8+, Linux x86-64, Python 3.10–3.13, and a custom vLLM build based on v0.17.1. It does not use the
paddleocrpackage at all.12
docker run -it --rm --gpus all --network host \
ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/hpd-parsing-vllm:latest-nvidia-gpuThe server listens on port 8118 and speaks the OpenAI API; clients send the fixed prompt document parsing with fork. with each page.12 Pick HPD-Parsing when pages per GPU-hour matter more than the last point of accuracy and you're on a supported data-centre GPU; pick PaddleOCR-VL for accuracy, broader hardware support and the paddleocr tooling.
Fine-tuning#
The VLM can be fine-tuned with supervised fine-tuning through ERNIEKit; the layout and reading-order models can't.1 One inconsistency: the v1 algorithm FAQ says fine-tuning is "not supported" in one answer and recommends ERNIEKit SFT in another. The usage tutorial's ERNIEKit section is the current guidance.
FAQ#
What is the difference between PaddleOCR-VL and PaddleOCR-VL-0.9B?
PaddleOCR-VL is the full pipeline: a layout model plus a recognizer. PaddleOCR-VL-0.9B (and PaddleOCR-VL-1.5-0.9B, PaddleOCR-VL-1.6-0.9B) is only the VLM recognizer inside it. Running the 0.9B model on whole pages without the layout stage is not equivalent and usually less accurate.
How do I use PaddleOCR-VL-1.6 specifically?
It's the default in PaddleOCR 3.6.0 and later: PaddleOCRVL() loads it. To be explicit, pass pipeline_version="v1.6", or --pipeline_version v1.6 on the CLI. For a VLM server, the model name is PaddleOCR-VL-1.6-0.9B.
Does PaddleOCR-VL need a GPU?
Not strictly — the official matrix lists x64 CPU and Apple Silicon as supported with PaddlePaddle — but the docs say CPU inference is not recommended for the VL series. On NVIDIA, the PaddlePaddle engine needs compute capability 7.0+ and CUDA 11.8+; vLLM needs CC 8.0+ and CUDA 12.6+. With no GPU, the hosted API is the practical option, or use PP-StructureV3, which we ran on a 4-core CPU.
How much VRAM does PaddleOCR-VL need?
The official docs don't state a minimum. The only memory guidance is for an RTX 3060: set gpu-memory-utilization to 0.7 on the vLLM or FastDeploy server. Since we haven't run it, we won't guess.
Is there a PaddleOCR-VL API?
Two kinds. The official hosted API (AI Studio) runs PaddleOCR-VL-1.6 by default; call it with PaddleOCRClient().parse_document(...) or paddleocr api --model_type doc_parsing and an access token. Or self-host: Docker Compose gives a full HTTP service on port 8080, and paddleocr genai_server gives an OpenAI-compatible VLM-only server for the pipeline to call. See Serving & API.
Is PaddleOCR-VL better than MinerU or GPT-5?
On the OmniDocBench v1.6_full table, PaddleOCR-VL-1.6 (96.34) is ahead of MinerU2.5-Pro (95.75), Gemini 3 Pro (92.91) and GPT-5.2 (86.59), and behind TeleOCR (96.91) and OvisOCR2 (96.47). That's one benchmark; differences of a point or two may not hold on your documents. Our comparison page covers more tools.
How many languages does PaddleOCR-VL support?
The docs say 109 for the series; the README says 111 for PaddleOCR-VL-1.5, which added Tibetan and Bengali. No official page reconciles the two. For plain text lines in a known language, PP-OCRv6 and the language list may be simpler.
Can I convert a whole PDF to one Markdown file?
Yes. Collect the per-page results with list(pipeline.predict("file.pdf")), then call pipeline.restructure_pages(pages, concatenate_pages=True). Cross-page table merging and heading re-levelling are on by default.
Sources
- PaddleOCR-VL usage tutorial, docs/version3.x/pipeline_usage/PaddleOCR-VL.en.md (repo commit dab3fe3, 2026-09-16): architecture (line 10), version notes (12–14), full-pipeline warning (16–22), hardware matrix (44–237), CC/CUDA requirements (240–247), install (312–345), CLI and Python (356–1690), VLM servers (1695–1855), clients (1856–1946), tuning (1948–2000), service deployment (2002–2160), fine-tuning (3365–3369).
- PaddleOCR 3.7.0 package source (PyPI wheel),
paddleocr/_pipelines/paddleocr_vl.py:_AVAILABLE_PIPELINE_VERSIONS = ["v1","v1.5","v1.6"], default"v1.6", the sixvl_rec_backendvalues,restructure_pages(res_list, merge_tables=True, relevel_titles=True, concatenate_pages=False)(lines 25–34, 219–229). Read by paddleocr.dev, 2026-10-27. - PaddleX 3.7.2 wheel (PyPI, 2026-06-25):
configs/pipelines/PaddleOCR-VL.yaml,PaddleOCR-VL-1.5.yaml,PaddleOCR-VL-1.6.yaml— layout model (line 25/26), VLM component name (84/60/60),layout_threshold(28–53 / 29 / 29),batch_size64 anduse_queues(4–6);inference/pipelines/paddleocr_vl/pipeline.py:855-868for acceptedprompt_labelvalues. - Hugging Face model cards and API: PaddleOCR-VL (architecture L53, dates L78–80, prompts L172–182), PaddleOCR-VL-1.5 (L43, L55–67, L79–80), PaddleOCR-VL-1.6 (L53–81, transformers>=5.0.0 at L164, prompts L175 and L197–204). Parameter count 958,588,736 (BF16 safetensors total) from
huggingface.co/api/models/PaddlePaddle/PaddleOCR-VL*, fetched 2026-10-27. - PaddleOCR README.md: release entries for 3.3.0 (line 119), 3.4.0 / PaddleOCR-VL-1.5 and "111 languages" (107–113), 3.6.0 / PaddleOCR-VL-1.6 (85–89), HPD-Parsing (65–68).
- OmniDocBench leaderboard, github.com/opendatalab/OmniDocBench README on
main, fetched 2026-10-27: table captioned "OmniDocBench (v1.6_full)" (line 524), overall formula (519–521), 1651 pages (104), update log "[2026/04/30] Updated from v1.6 to v1.7" (71) and "[2026/09/11] Added TeleOCR, OvisOCR2, and Unlimited-OCR" (66). Rows copied as published. - OmniDocBench README on the
v1_5branch: table "OmniDocBench (v1.5)" (line 417), PaddleOCR-VL-1.5 94.50 (432–443), PaddleOCR-VL 92.86 (464–473), PP-StructureV3 86.73 (806–817). - Real5-OmniDocBench scores from
.eval_results/real5_omnidocbench.yamlin each PaddleOCR-VL Hugging Face repo. The dataset was built by the PaddleOCR team from OmniDocBench v1.5 (HF PaddleOCR-VL-1.6 card L275), so these are first-party numbers. - PaddleOCR-VL-1.6 algorithm doc,
docs/version3.x/algorithm/PaddleOCR-VL/PaddleOCR-VL-1.6.en.md: 96.33 on OmniDocBench v1.6 (line 3), "identical inference speeds" to 1.5 (64); technical report arXiv 2606.03264 (2026-06-03). The 1.5 algorithm doc still carries the placeholder "achieves xxx% accuracy" (line 14). - Throughput tables in
algorithm/PaddleOCR-VL/PaddleOCR-VL-1.5.en.md:65-69(OmniDocBench v1.5, one A100) andPaddleOCR-VL.en.md:113-120(OmniDocBench v1.0). Published only as images; values transcribed by paddleocr.dev. - Hardware guides in
docs/version3.x/pipeline_usage/: PaddleOCR-VL-Apple-Silicon.en.md (lines 12–19, 87–109), -AMD-GPU.en.md (12, 123, 127), -NVIDIA-Blackwell.en.md (20–22, 64, 97–98), -Huawei-Ascend-NPU.en.md (12, 20), -Hygon-DCU, -Iluvatar-GPU, -Intel-Arc-GPU, -Kunlunxin-XPU, -MetaX-GPU (line 12 of each). - HPD-Parsing: usage doc (lines 7–26, 104–155) and Hugging Face card (L15, L48, L57, L75, L213). All accuracy and speed figures are self-reported.
- Official API SDK docs
docs/version3.x/inference_deployment/serving/paddleocr_official_api/python.en.mdandcli.en.md; PaddleOCR 3.7.0 sourcepaddleocr/_api_client/client.py:102-117andresults.py:29-51. - AI Studio "API Quota Rules and Error Code Description" (updated 2026-02-10, ai.baidu.com/ai-doc/AISTUDIO/pmjcld5qm) and "Asynchronous API Usage Guide" (updated 2026-02-04, Mml7n69e7).
- PP-DocLayoutV2 / PP-DocLayoutV3 label lists:
inference.ymllines 27–52 in PaddlePaddle/PP-DocLayoutV3 and in the PP-DocLayoutV2 folder of the PaddleOCR-VL repo; V3 model card L23, L37, L48–50. - PaddleOCR MCP server doc
docs/version3.x/deployment/mcp_server.en.md:261: "CPU inference is not recommended" for the PaddleOCR-VL series.