{
  "hf_id": "PaddlePaddle/PaddleOCR-VL-1.5",
  "meta": {
    "title": "PaddleOCR-VL-1.5",
    "slug": "paddleocr-vl-1.5",
    "provider": "PaddlePaddle",
    "description": "PaddleOCR-VL-1.5 (0.9B) — next-gen compact VLM for document parsing; adds text spotting, seal recognition, and Tibetan/Bengali",
    "date_added": "2026-05-11",
    "date_updated": "2026-05-11",
    "tasks": [
      "multimodal"
    ],
    "related_recipes": [
      "PaddlePaddle/PaddleOCR-VL"
    ]
  },
  "recommended_command": {
    "hardware": "h200",
    "strategy": "single_node_tp",
    "variant": "default",
    "node_count": 1,
    "deploy_type": "single_node",
    "env": {},
    "docker_image": "vllm/vllm-openai:latest",
    "command": "vllm serve PaddlePaddle/PaddleOCR-VL-1.5 \\\n  --trust-remote-code \\\n  --max-num-batched-tokens 16384 \\\n  --no-enable-prefix-caching \\\n  --mm-processor-cache-gb 0 \\\n  --tensor-parallel-size 1",
    "argv": [
      "vllm",
      "serve",
      "PaddlePaddle/PaddleOCR-VL-1.5",
      "--trust-remote-code",
      "--max-num-batched-tokens",
      "16384",
      "--no-enable-prefix-caching",
      "--mm-processor-cache-gb",
      "0",
      "--tensor-parallel-size",
      "1"
    ],
    "docker_command": "docker run --gpus all \\\n  --privileged --ipc=host -p 8000:8000 \\\n  -v ~/.cache/huggingface:/root/.cache/huggingface \\\n  vllm/vllm-openai:latest PaddlePaddle/PaddleOCR-VL-1.5 \\\n  --trust-remote-code \\\n  --max-num-batched-tokens 16384 \\\n  --no-enable-prefix-caching \\\n  --mm-processor-cache-gb 0 \\\n  --tensor-parallel-size 1",
    "docker_argv": [
      "docker",
      "run",
      "--gpus",
      "all",
      "--privileged",
      "--ipc=host",
      "-p",
      "8000:8000",
      "-v",
      "~/.cache/huggingface:/root/.cache/huggingface",
      "vllm/vllm-openai:latest",
      "PaddlePaddle/PaddleOCR-VL-1.5",
      "--trust-remote-code",
      "--max-num-batched-tokens",
      "16384",
      "--no-enable-prefix-caching",
      "--mm-processor-cache-gb",
      "0",
      "--tensor-parallel-size",
      "1"
    ],
    "strategy_spec": {
      "name": "single_node_tp",
      "deploy_type": "single_node",
      "display_name": "Tensor Parallel",
      "short_label": "TP",
      "orientation": "latency",
      "description": "Single-node tensor parallel. Splits the model across all local GPUs. TP size is set to the GPU count at deploy time. The simplest multi-GPU strategy — works for all model architectures.\n",
      "hardware_match": {
        "min_gpus": 1,
        "max_gpus": 8,
        "multi_node": false
      },
      "vllm_args": [],
      "parallel_flag": "--tensor-parallel-size"
    },
    "hardware_profile": {
      "brand": "NVIDIA",
      "generation": "hopper",
      "compute_arch": "sm90",
      "display_name": "H200",
      "description": "NVIDIA H200 SXM 141 GB HBM3e · 8-GPU HGX node",
      "gpu_count": 8,
      "vram_gb": 1128,
      "multi_node": false
    },
    "alternatives": {
      "multi_node_tp": "/PaddlePaddle/PaddleOCR-VL-1.5/strategies/multi_node_tp.json",
      "kv_store_centralized_mooncake": "/PaddlePaddle/PaddleOCR-VL-1.5/strategies/kv_store_centralized_mooncake.json",
      "kv_store_distributed_mooncake": "/PaddlePaddle/PaddleOCR-VL-1.5/strategies/kv_store_distributed_mooncake.json"
    },
    "by_hardware": {
      "h200": "/PaddlePaddle/PaddleOCR-VL-1.5/hw/h200.json",
      "h100": "/PaddlePaddle/PaddleOCR-VL-1.5/hw/h100.json",
      "b200": "/PaddlePaddle/PaddleOCR-VL-1.5/hw/b200.json",
      "gb200": "/PaddlePaddle/PaddleOCR-VL-1.5/hw/gb200.json",
      "b300": "/PaddlePaddle/PaddleOCR-VL-1.5/hw/b300.json",
      "gb300": "/PaddlePaddle/PaddleOCR-VL-1.5/hw/gb300.json",
      "mi300x": "/PaddlePaddle/PaddleOCR-VL-1.5/hw/mi300x.json",
      "mi325x": "/PaddlePaddle/PaddleOCR-VL-1.5/hw/mi325x.json",
      "mi350x": "/PaddlePaddle/PaddleOCR-VL-1.5/hw/mi350x.json",
      "mi355x": "/PaddlePaddle/PaddleOCR-VL-1.5/hw/mi355x.json"
    }
  },
  "model": {
    "model_id": "PaddlePaddle/PaddleOCR-VL-1.5",
    "min_vllm_version": "0.11.1",
    "architecture": "dense",
    "parameter_count": "0.9B",
    "active_parameters": "0.9B",
    "context_length": 131072,
    "base_args": [
      "--trust-remote-code",
      "--max-num-batched-tokens",
      "16384",
      "--no-enable-prefix-caching",
      "--mm-processor-cache-gb",
      "0"
    ],
    "base_env": {},
    "install": {
      "pip": {
        "command": "uv venv\nsource .venv/bin/activate\nuv pip install -U vllm --torch-backend auto"
      },
      "docker": {
        "command": "docker pull vllm/vllm-openai:latest"
      },
      "extras": [
        {
          "note": "PaddlePaddle runtime (install in a separate venv from vllm to avoid conflicts)",
          "command": "uv pip install paddlepaddle-gpu==3.2.1 --extra-index-url https://www.paddlepaddle.org.cn/packages/stable/cu126/"
        },
        {
          "note": "PaddleOCR document-parsing helpers (1.5 ships under the same paddleocr[doc-parser] extra)",
          "command": "uv pip install -U \"paddleocr[doc-parser]\""
        },
        {
          "note": "Safetensors loader used by the doc-parser path",
          "command": "uv pip install safetensors"
        }
      ]
    }
  },
  "features": {
    "text_only": {
      "description": "Skip loading the vision encoder for text-only workloads — frees VRAM for KV cache. Mutually exclusive with encoder_parallel.",
      "args": [
        "--language-model-only"
      ]
    },
    "encoder_parallel": {
      "description": "Run the vision encoder in data-parallel mode — avoids TP comm overhead on the small encoder. Mutually exclusive with text_only.",
      "args": [
        "--mm-encoder-tp-mode",
        "data"
      ]
    }
  },
  "opt_in_features": [
    "text_only",
    "encoder_parallel"
  ],
  "variants": {
    "default": {
      "precision": "bf16",
      "vram_minimum_gb": 2,
      "description": "BF16 weights — small footprint, runs on most GPUs"
    }
  },
  "kv_offload_support": {
    "offloading_cpu": "verified",
    "offloading_fs": "verified"
  },
  "hardware_overrides": {
    "amd": {
      "extra_args": [],
      "extra_env": {
        "SAFETENSORS_FAST_GPU": "1"
      }
    }
  },
  "guide": "## Overview\n\n[PaddleOCR-VL-1.5](https://huggingface.co/PaddlePaddle/PaddleOCR-VL-1.5) is the next\ngeneration of PaddleOCR-VL — same 0.9B architecture (NaViT-style dynamic-resolution\nvision encoder + ERNIE-4.5-0.3B LM), with substantial accuracy gains and new tasks:\n\n- **94.5% on OmniDocBench v1.5** (SOTA)\n- **Text spotting** — line-level localization + recognition in one pass\n- **Seal recognition** — new task with SOTA results\n- **Irregular-shape localization** — polygonal detection under skew/warping\n- **Multilingual** — adds Tibetan and Bengali\n- Cross-page table merging and paragraph-heading recognition\n\nArchitecture is identical to PaddleOCR-VL, so the vLLM launch command and feature\nflags are the same.\n\n## Prerequisites\n\n- Hardware: 1x GPU (small VRAM footprint)\n- vLLM >= 0.11.1 (nightly if not released yet)\n- AMD ROCm wheels require Python 3.12, ROCm 7.2.3, and glibc >= 2.35.\n\n### Install vLLM (NVIDIA)\n\n```bash\nuv venv\nsource .venv/bin/activate\nuv pip install -U vllm --pre \\\n  --extra-index-url https://wheels.vllm.ai/nightly \\\n  --extra-index-url https://download.pytorch.org/whl/cu129 \\\n  --index-strategy unsafe-best-match\n```\n\n### Install vLLM (AMD ROCm)\n\n```bash\nuv venv --python 3.12\nsource .venv/bin/activate\nuv pip install vllm --extra-index-url https://wheels.vllm.ai/rocm\n```\n\n## Launch command\n\n```bash\nvllm serve PaddlePaddle/PaddleOCR-VL-1.5 \\\n  --trust-remote-code \\\n  --max-num-batched-tokens 16384 \\\n  --no-enable-prefix-caching \\\n  --mm-processor-cache-gb 0\n```\n\nAMD MI300X/MI325X/MI355X:\n\n```bash\nexport SAFETENSORS_FAST_GPU=1\n\nvllm serve PaddlePaddle/PaddleOCR-VL-1.5 \\\n  --trust-remote-code \\\n  --max-num-batched-tokens 16384 \\\n  --mm-processor-cache-gb 0\n```\n\nTip: OCR workloads don't benefit much from prefix caching or image reuse, so disable\nthose to avoid hashing/caching overhead.\n\n## Client Usage\n\nTask-specific prompts (note the two new tasks `spotting` and `seal`):\n\n```python\nfrom openai import OpenAI\n\nclient = OpenAI(api_key=\"EMPTY\", base_url=\"http://localhost:8000/v1\", timeout=3600)\n\nTASKS = {\n    \"ocr\": \"OCR:\",\n    \"table\": \"Table Recognition:\",\n    \"formula\": \"Formula Recognition:\",\n    \"chart\": \"Chart Recognition:\",\n    \"spotting\": \"Spotting:\",\n    \"seal\": \"Seal Recognition:\",\n}\n\nresponse = client.chat.completions.create(\n    model=\"PaddlePaddle/PaddleOCR-VL-1.5\",\n    messages=[{\n        \"role\": \"user\",\n        \"content\": [\n            {\"type\": \"image_url\", \"image_url\": {\"url\": \"https://.../receipt.png\"}},\n            {\"type\": \"text\", \"text\": TASKS[\"spotting\"]},\n        ],\n    }],\n    temperature=0.0,\n)\nprint(response.choices[0].message.content)\n```\n\n## Offline Inference with PP-DocLayoutV2\n\nUse separate venvs for `vllm` and `paddlepaddle` to avoid conflicts. If you see\n\"The model PaddleOCR-VL-1.5-0.9B does not exist.\", add\n`--served-model-name PaddleOCR-VL-1.5-0.9B`.\n\n```bash\nuv pip install paddlepaddle-gpu==3.2.1 --extra-index-url https://www.paddlepaddle.org.cn/packages/stable/cu126/\nuv pip install -U \"paddleocr[doc-parser]\"\nuv pip install safetensors\n```\n\n```python\nfrom paddleocr import PaddleOCRVL\n\npipeline = PaddleOCRVL(\n    vl_rec_model_name=\"PaddleOCR-VL-1.5-0.9B\",\n    vl_rec_backend=\"vllm-server\",\n    vl_rec_server_url=\"http://localhost:8000/v1\",\n    layout_detection_model_name=\"PP-DocLayoutV2\",\n    layout_detection_model_dir=\"/path/to/your/PP-DocLayoutV2/\",\n)\n\noutput = pipeline.predict(\"https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/paddleocr_vl_demo.png\")\nfor i, res in enumerate(output):\n    res.save_to_json(save_path=f\"output_{i}.json\")\n    res.save_to_markdown(save_path=f\"output_{i}.md\")\n```\n\n## References\n\n- [PaddleOCR-VL-1.5 on Hugging Face](https://huggingface.co/PaddlePaddle/PaddleOCR-VL-1.5)\n- [PaddleOCR GitHub](https://github.com/PaddlePaddle/PaddleOCR)\n- [vLLM support tracking issue](https://github.com/vllm-project/vllm/issues/33554)\n",
  "source": {
    "source": "vllm",
    "repo": "vllm-project/vllm",
    "ref": "main",
    "sha": "389ffebe555705c85337025d5df108d0384d365e",
    "path": "recipes/models/PaddlePaddle/PaddleOCR-VL-1.5.yaml",
    "edit_url": "https://github.com/vllm-project/vllm/edit/main/recipes/models/PaddlePaddle/PaddleOCR-VL-1.5.yaml",
    "overlays": []
  }
}