使用 vLLM 原生部署 PaddleOCR-VL:高性能、OpenAI 兼容的多模态 OCR 服务

序言

笔者此前曾撰写过一篇关于使用 Paddle 官方提供的 paddlex-genai-vllm-server 部署 PaddleOCR-VL 模型的文章,其中简要介绍了该模型的特性,并对比了其与 DeepSeek-OCR 的差异。

近期,笔者持续关注 vLLM 官方社区对 PaddleOCR-VL 的支持进展------社区已于 2025 年 10 月 30 日正式合并了对该模型的支持 PR。

因此,本文将介绍如何基于 vLLM 官方版本 直接部署 PaddleOCR-VL 模型。

💡 当前 vLLM 的代码同样支持 DeepSeek-OCR,用户可根据需求灵活选择。

介绍

PaddleOCR-VL 是一个专为文档解析设计的最先进(SOTA)且资源高效 的多模态模型。 其核心组件是 PaddleOCR-VL-0.9B ------ 一个紧凑而强大的视觉-语言模型(VLM),集成了基于 NaViT 风格的动态分辨率视觉编码器ERNIE-4.5-0.3B 语言模型,从而实现对文档中文字、表格、公式等元素的高精度识别。

部署

本文介绍两种部署方式:裸机部署与 Kubernetes(k8s)部署。

裸机部署

bash 复制代码
uv venv
source .venv/bin/activate

# v0.11.1 尚未正式发布,需安装 nightly 版本
uv pip install -U vllm \
    --pre \
    --extra-index-url https://wheels.vllm.ai/nightly \
    --extra-index-url https://download.pytorch.org/whl/cu129 \
    --index-strategy unsafe-best-match

⚠️ 注意:截至本文撰写时,vLLM v0.11.1 尚未发布,因此必须使用 nightly 构建版本以获得 PaddleOCR-VL 支持。

启动服务:

bash 复制代码
vllm serve PaddlePaddle/PaddleOCR-VL \
    --trust-remote-code \
    --max-num-batched-tokens 16384 \
    --no-enable-prefix-caching \
    --mm-processor-cache-gb 0

参数说明:

  • --trust-remote-code:因模型包含自定义代码,需显式启用。
  • --no-enable-prefix-caching:OCR 任务通常无重复前缀,关闭可节省显存。
  • --mm-processor-cache-gb 0:禁用多模态处理器缓存,适用于单次推理场景;若需高频调用,可适当调高此值。

Kubernetes(k8s)部署

在生产环境中,大多数场景采用 Kubernetes 进行部署。以下是基于 k8s 的部署方案。

1. 构建镜像

由于 v0.11.1 尚未正式发布,目前需通过源码构建镜像(也可关注官方 nightly 镜像):

bash 复制代码
git clone https://github.com/vllm-project/vllm.git
cd vllm
docker build -t vllm:latest-test -f docker/Dockerfile .

📌 待 v0.11.1 正式发布后,可直接使用官方 PyPI 或 Docker Hub 镜像,无需手动构建。

2. 创建 Deployment

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: paddleocr-vl
  labels:
    app: paddleocr-vl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: paddleocr-vl
  template:
    metadata:
      labels:
        app: paddleocr-vl
    spec:
      containers:
        - name: paddleocr-vl
          image: vllm:latest-test
          command: ["vllm"]
          args:
            - "serve"
            - "/models/PaddleOCR-VL"
            - "--served-model-name=PaddleOCR-VL"
            - "--host=0.0.0.0"
            - "--port=8000"
            - "--trust-remote-code"
            - "--revision=v1"
            - "--max-num-batched-tokens=16384"
            - "--no-enable-prefix-caching"
            - "--mm-processor-cache-gb=0"
          ports:
            - containerPort: 8000
              name: http
              protocol: TCP
          resources:
            limits:
              nvidia.com/gpu: 1
              memory: "16Gi"
              cpu: "4"
            requests:
              memory: "12Gi"
              cpu: "2"
              nvidia.com/gpu: 1
          readinessProbe:
            tcpSocket:
              port: 8000
            initialDelaySeconds: 60
            periodSeconds: 10
            failureThreshold: 5
          volumeMounts:
            - name: shm
              mountPath: /dev/shm
            - name: model-storage
              mountPath: /models/PaddleOCR-VL
      volumes:
        - name: shm
          emptyDir:
            medium: Memory
        - name: model-storage
          hostPath:
            path: /mnt/data/paddleocr-vl/models
            type: Directory

配置说明:

  • /models/PaddleOCR-VL:模型本地挂载路径,请根据实际环境调整。
  • --no-enable-prefix-caching:OCR 场景通常不需要前缀缓存,关闭可减少内存开销。
  • --mm-processor-cache-gb:控制多模态预处理缓存大小,设为 0 表示禁用。

🔔 建议在 GPU 节点上部署,并确保已安装 NVIDIA Device Plugin。

测试

测试用例参考自 vLLM 官方社区文档,代码如下:

python 复制代码
from openai import OpenAI

client = OpenAI(
    api_key="EMPTY",
    base_url="http://localhost:8000/v1",
    timeout=3600
)

# 任务类型提示词
TASKS = {
    "ocr": "OCR:",
    "table": "Table Recognition:",
    "formula": "Formula Recognition:",
    "chart": "Chart Recognition:",
}

messages = [
    {
        "role": "user",
        "content": [
            {
                "type": "image_url",
                "image_url": {
                    "url": "https://ofasys-multimodal-wlcb-3-toshanghai.oss-accelerate.aliyuncs.com/wpf272043/keepme/image/receipt.png"
                }
            },
            {
                "type": "text",
                "text": TASKS["ocr"]
            }
        ]
    }
]

response = client.chat.completions.create(
    model="PaddlePaddle/PaddleOCR-VL",
    messages=messages,
    temperature=0.0,
)
print(f"识别结果: {response.choices[0].message.content}")

✅ 该接口完全兼容 OpenAI 格式,可无缝集成到现有 AI 应用栈中。

总结

通过原生 vLLM 部署 PaddleOCR-VL 模型,具备以下显著优势:

  • OpenAI API 兼容 :自动提供 /v1/chat/completions 接口,可直接接入企业现有的 AI 网关(如 Kong、Traefik、自研网关等)。
  • 高性能推理 :依托 vLLM 的 PagedAttention、连续批处理(continuous batching)等优化技术,实现高吞吐、低延迟的 OCR 服务。
  • 灵活部署:支持裸机、Docker、Kubernetes 等多种部署形态,适配开发、测试与生产全链路。
  • 社区驱动:作为 vLLM 官方支持的模型,未来将持续获得性能优化与新功能更新。
相关推荐
市象4 小时前
字节AI撒“豆”成兵
人工智能
康康的AI博客10 小时前
腾讯王炸:CodeMoment - 全球首个产设研一体 AI IDE
ide·人工智能
中达瑞和-高光谱·多光谱10 小时前
中达瑞和LCTF:精准调控光谱,赋能显微成像新突破
人工智能
mahtengdbb110 小时前
【目标检测实战】基于YOLOv8-DynamicHGNetV2的猪面部检测系统搭建与优化
人工智能·yolo·目标检测
Pyeako10 小时前
深度学习--BP神经网络&梯度下降&损失函数
人工智能·python·深度学习·bp神经网络·损失函数·梯度下降·正则化惩罚
清 澜11 小时前
大模型面试400问第一部分第一章
人工智能·大模型·大模型面试
不大姐姐AI智能体11 小时前
搭了个小红书笔记自动生产线,一句话生成图文,一键发布,支持手机端、电脑端发布
人工智能·经验分享·笔记·矩阵·aigc
虹科网络安全12 小时前
艾体宝方案 | 释放数据潜能 · 构建 AI 驱动的自动驾驶实时数据处理与智能筛选平台
人工智能·机器学习·自动驾驶
Deepoch12 小时前
Deepoc数学大模型:发动机行业的算法引擎
人工智能·算法·机器人·发动机·deepoc·发动机行业