mirror of
https://www.modelscope.cn/PaddlePaddle/PaddleOCR-VL.git
synced 2026-07-16 13:42:55 +08:00
Update README.md (batch 1/1)
This commit is contained in:
133
README.md
133
README.md
@ -38,7 +38,7 @@ PaddleOCR-VL: Boosting Multilingual Document Parsing via a 0.9B Ultra-Compact Vi
|
||||
[](https://x.com/PaddlePaddle)
|
||||
[](./LICENSE)
|
||||
|
||||
**🔥 Official Demo**: [Baidu AI Studio](https://aistudio.baidu.com/application/detail/98365) |
|
||||
**🔥 Official Website**: [Baidu AI Studio](https://aistudio.baidu.com/paddleocr) |
|
||||
**📝 arXiv**: [Technical Report](https://arxiv.org/pdf/2510.14528)
|
||||
|
||||
</div>
|
||||
@ -72,9 +72,11 @@ PaddleOCR-VL: Boosting Multilingual Document Parsing via a 0.9B Ultra-Compact Vi
|
||||
|
||||
|
||||
## News
|
||||
* ```2025.10.16``` 🚀 We release [PaddleOCR-VL](https://github.com/PaddlePaddle/PaddleOCR), — a multilingual documents parsing via a 0.9B Ultra-Compact Vision-Language Model with SOTA performance.
|
||||
* ```2025.10.29``` Supports calling the core module PaddleOCR-VL-0.9B of PaddleOCR-VL via the `transformers` library.
|
||||
|
||||
* ```2025.11.07``` 🚀 Enabled `flash-attn` in the `transformers` library to achieve faster inference with PaddleOCR-VL-0.9B.
|
||||
* ```2025.11.04``` 🌟 PaddleOCR-VL-0.9B is now officially supported on `vLLM` .
|
||||
* ```2025.10.29``` 🤗 Supports calling the core module PaddleOCR-VL-0.9B of PaddleOCR-VL via the `transformers` library.
|
||||
* ```2025.10.16``` 🚀 We release [PaddleOCR-VL](https://github.com/PaddlePaddle/PaddleOCR), — a multilingual documents parsing via a 0.9B Ultra-Compact Vision-Language Model with SOTA performance.
|
||||
|
||||
## Usage
|
||||
|
||||
@ -83,27 +85,24 @@ PaddleOCR-VL: Boosting Multilingual Document Parsing via a 0.9B Ultra-Compact Vi
|
||||
Install [PaddlePaddle](https://www.paddlepaddle.org.cn/install/quick) and [PaddleOCR](https://github.com/PaddlePaddle/PaddleOCR):
|
||||
|
||||
```bash
|
||||
python -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/
|
||||
python -m pip install -U "paddleocr[doc-parser]"
|
||||
python -m pip install https://paddle-whl.bj.bcebos.com/nightly/cu126/safetensors/safetensors-0.6.2.dev0-cp38-abi3-linux_x86_64.whl
|
||||
# The following command installs the PaddlePaddle version for CUDA 12.6. For other CUDA versions and the CPU version, please refer to https://www.paddlepaddle.org.cn/en/install/quick?docurl=/documentation/docs/en/develop/install/pip/linux-pip_en.html
|
||||
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]>=3.4.0"
|
||||
```
|
||||
|
||||
> For Windows users, please use WSL or a Docker container.
|
||||
|
||||
|
||||
### Basic Usage
|
||||
|
||||
CLI usage:
|
||||
|
||||
```bash
|
||||
paddleocr doc_parser -i https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/paddleocr_vl_demo.png
|
||||
paddleocr doc_parser -i https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/paddleocr_vl_demo.png --pipeline_version v1
|
||||
```
|
||||
|
||||
Python API usage:
|
||||
|
||||
```python
|
||||
from paddleocr import PaddleOCRVL
|
||||
pipeline = PaddleOCRVL()
|
||||
pipeline = PaddleOCRVL(pipeline_version="v1")
|
||||
output = pipeline.predict("https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/paddleocr_vl_demo.png")
|
||||
for res in output:
|
||||
res.print()
|
||||
@ -113,26 +112,38 @@ for res in output:
|
||||
|
||||
### Accelerate VLM Inference via Optimized Inference Servers
|
||||
|
||||
1. Start the VLM inference server (the default port is `8080`):
|
||||
1. Start the VLM inference server:
|
||||
|
||||
```bash
|
||||
docker run \
|
||||
--rm \
|
||||
--gpus all \
|
||||
--network host \
|
||||
ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddlex-genai-vllm-server
|
||||
```
|
||||
You can start the vLLM inference service using one of two methods:
|
||||
|
||||
- Method 1: PaddleOCR method
|
||||
|
||||
```bash
|
||||
docker run \
|
||||
--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-0.9B --host 0.0.0.0 --port 8080 --backend vllm
|
||||
```
|
||||
|
||||
- Method 2: vLLM method
|
||||
|
||||
[vLLM: PaddleOCR-VL Usage Guide](https://docs.vllm.ai/projects/recipes/en/latest/PaddlePaddle/PaddleOCR-VL.html)
|
||||
|
||||
2. Call the PaddleOCR CLI or Python API:
|
||||
|
||||
```bash
|
||||
paddleocr doc_parser \
|
||||
-i https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/paddleocr_vl_demo.png \
|
||||
--pipeline_version v1 \
|
||||
--vl_rec_backend vllm-server \
|
||||
--vl_rec_server_url http://127.0.0.1:8080/v1
|
||||
```
|
||||
|
||||
```python
|
||||
from paddleocr import PaddleOCRVL
|
||||
pipeline = PaddleOCRVL(vl_rec_backend="vllm-server", vl_rec_server_url="http://127.0.0.1:8080/v1")
|
||||
pipeline = PaddleOCRVL(pipeline_version="v1", vl_rec_backend="vllm-server", vl_rec_server_url="http://127.0.0.1:8080/v1")
|
||||
output = pipeline.predict("https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/paddleocr_vl_demo.png")
|
||||
for res in output:
|
||||
res.print()
|
||||
@ -154,9 +165,14 @@ from PIL import Image
|
||||
import torch
|
||||
from transformers import AutoModelForCausalLM, AutoProcessor
|
||||
|
||||
# ---- Settings ----
|
||||
model_path = "PaddlePaddle/PaddleOCR-VL"
|
||||
image_path = "test.png"
|
||||
task = "ocr" # Options: 'ocr' | 'table' | 'chart' | 'formula'
|
||||
# ------------------
|
||||
|
||||
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
|
||||
|
||||
CHOSEN_TASK = "ocr" # Options: 'ocr' | 'table' | 'chart' | 'formula'
|
||||
PROMPTS = {
|
||||
"ocr": "OCR:",
|
||||
"table": "Table Recognition:",
|
||||
@ -164,8 +180,6 @@ PROMPTS = {
|
||||
"chart": "Chart Recognition:",
|
||||
}
|
||||
|
||||
model_path = "PaddlePaddle/PaddleOCR-VL"
|
||||
image_path = "test.png"
|
||||
image = Image.open(image_path).convert("RGB")
|
||||
|
||||
model = AutoModelForCausalLM.from_pretrained(
|
||||
@ -177,7 +191,7 @@ messages = [
|
||||
{"role": "user",
|
||||
"content": [
|
||||
{"type": "image", "image": image},
|
||||
{"type": "text", "text": PROMPTS[CHOSEN_TASK]},
|
||||
{"type": "text", "text": PROMPTS[task]},
|
||||
]
|
||||
}
|
||||
]
|
||||
@ -186,7 +200,7 @@ inputs = processor.apply_chat_template(
|
||||
tokenize=True,
|
||||
add_generation_prompt=True,
|
||||
return_dict=True,
|
||||
return_tensors="pt"
|
||||
return_tensors="pt"
|
||||
).to(DEVICE)
|
||||
|
||||
outputs = model.generate(**inputs, max_new_tokens=1024)
|
||||
@ -194,6 +208,73 @@ outputs = processor.batch_decode(outputs, skip_special_tokens=True)[0]
|
||||
print(outputs)
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>👉 Click to expand: Use flash-attn to boost performance and reduce memory usage</summary>
|
||||
|
||||
```shell
|
||||
# ensure the flash-attn2 is installed
|
||||
pip install flash-attn --no-build-isolation
|
||||
```
|
||||
|
||||
```python
|
||||
import torch
|
||||
from transformers import AutoModelForCausalLM, AutoProcessor
|
||||
from PIL import Image
|
||||
|
||||
# ---- Settings ----
|
||||
model_path = "PaddlePaddle/PaddleOCR-VL"
|
||||
image_path = "test.png"
|
||||
task = "ocr" # ← change to "table" | "chart" | "formula"
|
||||
# ------------------
|
||||
|
||||
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
|
||||
|
||||
model = AutoModelForCausalLM.from_pretrained(
|
||||
model_path,
|
||||
trust_remote_code=True,
|
||||
torch_dtype=torch.bfloat16,
|
||||
attn_implementation="flash_attention_2",
|
||||
).to(dtype=torch.bfloat16, device=DEVICE).eval()
|
||||
processor = AutoProcessor.from_pretrained(model_path, trust_remote_code=True)
|
||||
|
||||
PROMPTS = {
|
||||
"ocr": "OCR:",
|
||||
"table": "Table Recognition:",
|
||||
"chart": "Chart Recognition:",
|
||||
"formula": "Formula Recognition:",
|
||||
}
|
||||
messages = [
|
||||
{
|
||||
"role": "user",
|
||||
"content": [
|
||||
{"type": "image", "image": Image.open(image_path).convert("RGB")},
|
||||
{"type": "text", "text": PROMPTS[task]}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
inputs = processor.apply_chat_template(
|
||||
messages,
|
||||
tokenize=True,
|
||||
add_generation_prompt=True,
|
||||
return_dict=True,
|
||||
return_tensors="pt"
|
||||
).to(DEVICE)
|
||||
|
||||
with torch.inference_mode():
|
||||
out = model.generate(
|
||||
**inputs,
|
||||
max_new_tokens=1024,
|
||||
do_sample=False,
|
||||
use_cache=True
|
||||
)
|
||||
|
||||
outputs = processor.batch_decode(out, skip_special_tokens=True)[0]
|
||||
print(outputs)
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
## Performance
|
||||
|
||||
### Page-Level Document Parsing
|
||||
@ -346,4 +427,4 @@ If you find PaddleOCR-VL helpful, feel free to give us a star and citation.
|
||||
primaryClass={cs.CV},
|
||||
url={https://arxiv.org/abs/2510.14528},
|
||||
}
|
||||
```
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user