{
  "hf_id": "PaddlePaddle/PaddleOCR-VL-1.6",
  "meta": {
    "title": "PaddleOCR-VL-1.6",
    "slug": "paddleocr-vl-1.6",
    "provider": "PaddlePaddle",
    "description": "PaddleOCR-VL-1.6 (0.9B) — region-aware data optimization + progressive post-training; new SOTA 96.33% on OmniDocBench v1.6, drop-in replacement for 1.5",
    "date_added": "2026-07-11",
    "date_updated": "2026-07-08",
    "tasks": [
      "multimodal"
    ],
    "related_recipes": [
      "PaddlePaddle/PaddleOCR-VL-1.5",
      "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.6 \\\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.6",
      "--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.6 \\\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.6",
      "--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.6/strategies/multi_node_tp.json",
      "kv_store_centralized_mooncake": "/PaddlePaddle/PaddleOCR-VL-1.6/strategies/kv_store_centralized_mooncake.json",
      "kv_store_distributed_mooncake": "/PaddlePaddle/PaddleOCR-VL-1.6/strategies/kv_store_distributed_mooncake.json"
    },
    "by_hardware": {
      "h200": "/PaddlePaddle/PaddleOCR-VL-1.6/hw/h200.json",
      "h100": "/PaddlePaddle/PaddleOCR-VL-1.6/hw/h100.json",
      "b200": "/PaddlePaddle/PaddleOCR-VL-1.6/hw/b200.json",
      "gb200": "/PaddlePaddle/PaddleOCR-VL-1.6/hw/gb200.json",
      "b300": "/PaddlePaddle/PaddleOCR-VL-1.6/hw/b300.json",
      "gb300": "/PaddlePaddle/PaddleOCR-VL-1.6/hw/gb300.json",
      "mi300x": "/PaddlePaddle/PaddleOCR-VL-1.6/hw/mi300x.json",
      "mi325x": "/PaddlePaddle/PaddleOCR-VL-1.6/hw/mi325x.json",
      "mi350x": "/PaddlePaddle/PaddleOCR-VL-1.6/hw/mi350x.json",
      "mi355x": "/PaddlePaddle/PaddleOCR-VL-1.6/hw/mi355x.json"
    }
  },
  "model": {
    "model_id": "PaddlePaddle/PaddleOCR-VL-1.6",
    "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/",
          "brand": "NVIDIA"
        },
        {
          "note": "PaddleOCR document-parsing helpers — 1.6 requires >= 3.6.0 (pipeline_version v1.6)",
          "command": "uv pip install -U \"paddleocr[doc-parser]>=3.6.0\""
        },
        {
          "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.6](https://huggingface.co/PaddlePaddle/PaddleOCR-VL-1.6) upgrades\nPaddleOCR-VL-1.5 with a region-aware data optimization framework (targeted enhancement\nof weak regions found in the previous model) and a progressive post-training recipe\nbased on curated data selection and reinforcement learning:\n\n- **96.33% on OmniDocBench v1.6** (new SOTA), plus new records on OmniDocBench v1.5\n  and Real5-OmniDocBench (scanning, warping, screen-photography, illumination, skew)\n- Major gains in table, Chinese ancient document, and Chinese rare character recognition\n- Improved seal/stamp recognition, text spotting, and chart recognition\n\nThe architecture is **fully compatible with PaddleOCR-VL-1.5** (same 0.9B NaViT-style\ndynamic-resolution vision encoder + ERNIE-4.5-0.3B LM), so migration is plug-and-play:\nthe vLLM launch command and feature flags are unchanged.\n\n## Prerequisites\n\n- Hardware: 1x GPU (small VRAM footprint)\n- vLLM >= 0.11.1\n\n### Install vLLM\n\n```bash\nuv venv\nsource .venv/bin/activate\nuv pip install -U vllm\n```\n\n## Launch command\n\n```bash\nvllm serve PaddlePaddle/PaddleOCR-VL-1.6 \\\n  --trust-remote-code \\\n  --max-num-batched-tokens 16384 \\\n  --no-enable-prefix-caching \\\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 (same task set as 1.5, including `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.6\",\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-DocLayoutV3\n\nUse separate venvs for `vllm` and `paddlepaddle` to avoid conflicts. The 1.6 pipeline\nrequires `paddleocr[doc-parser] >= 3.6.0` and `pipeline_version=\"v1.6\"`, which\nautomatically uses [PP-DocLayoutV3](https://huggingface.co/PaddlePaddle/PP-DocLayoutV3)\nfor layout detection (PP-DocLayoutV2 belongs to the v1 pipeline). Pass\n`vl_rec_api_model_name=\"PaddlePaddle/PaddleOCR-VL-1.6\"` so the client matches the\nmodel name the vLLM server exposes — otherwise it defaults to\n`PaddleOCR-VL-1.6-0.9B` and fails with \"The model PaddleOCR-VL-1.6-0.9B does not exist.\"\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]>=3.6.0\"\nuv pip install safetensors\n```\n\n```python\nfrom paddleocr import PaddleOCRVL\n\npipeline = PaddleOCRVL(\n    pipeline_version=\"v1.6\",\n    vl_rec_backend=\"vllm-server\",\n    vl_rec_server_url=\"http://localhost:8000/v1\",\n    vl_rec_api_model_name=\"PaddlePaddle/PaddleOCR-VL-1.6\",\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.6 on Hugging Face](https://huggingface.co/PaddlePaddle/PaddleOCR-VL-1.6)\n- [Technical report (arXiv)](https://arxiv.org/pdf/2606.03264)\n- [PaddleOCR GitHub](https://github.com/PaddlePaddle/PaddleOCR)\n- [vLLM support PR](https://github.com/vllm-project/vllm/pull/27758)\n",
  "source": {
    "source": "vllm",
    "repo": "vllm-project/vllm",
    "ref": "main",
    "sha": "389ffebe555705c85337025d5df108d0384d365e",
    "path": "recipes/models/PaddlePaddle/PaddleOCR-VL-1.6.yaml",
    "edit_url": "https://github.com/vllm-project/vllm/edit/main/recipes/models/PaddlePaddle/PaddleOCR-VL-1.6.yaml",
    "overlays": []
  }
}