本教程将详细介绍如何在本地环境中使用Docker部署 PaddleOCR-VL,同时包含VLLM推理模型加速的部署过程,以及踩过的一些坑

目前本人测试了效果确实非常强大,同时响应速度也很快,相比于传统的OCR精准太多了

OK老样子直接开始正题吧。 

一、效果展示

首先在部署前先看看效果如何,下面包含官方给出的案例图和本人测试的效果图:

上面为官网给出的效果图,后面根据实际情况测试了一下效果确实非常不错,

二、PaddleOCR-VL 部署全流程

ok废话不多说,直接开始部署吧,飞浆安装指南参考:

​https://www.paddlepaddle.org.cn/documentation/docs/zh/install/docker/linux-docker.html

https://www.paddleocr.ai/main/version3.x/pipeline_usage/PaddleOCR-VL.html

1、安装飞浆框架:

这边使用docker拉取镜像

CPU:
docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0
GPU:
docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-gpu-cuda11.8-cudnn8.9

2、启动docker并映射8080端口号

docker run --name paddle_docker -p 6063:8080 -it  babc044da8f0 /bin/bash

3、进入docker环境:

docker exec -it <容器名或容器ID> /bin/bash

4、安装推理包:

目前这个项目中只用到 paddleocr[doc-parser],如果需要更全的功能可使用 paddleocr[all]

# 只希望使用基础文字识别功能(返回文字位置坐标和文本内容)
python -m pip install "paddleocr[doc-parser]" -i https://pypi.tuna.tsinghua.edu.cn/simple
# 希望使用文档解析、文档理解、文档翻译、关键信息抽取等全部功能
# python -m pip install "paddleocr[all]"

# 安装相关依赖
python -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/
python -m pip install https://paddle-whl.bj.bcebos.com/nightly/cu126/safetensors/safetensors-0.6.2.dev0-cp38-abi3-linux_x86_64.whl

5、安装libGL.so.1:

这部分是需要进入容器后手动安装,这里是一个坑,在官方的文档中并没有介绍到这个依赖

导致报错了很多次之后才找到解决的方案是因为缺少了一个 libGL.so.1

# 更新包列表
apt-get update

# 安装 OpenCV 所需的系统依赖
apt-get install -y libgl1 libglib2.0-0 libsm6 libxrender1 libxext6

# 如果需要更多图形相关依赖,可以安装:
apt-get install -y libglu1-mesa libgl1-mesa-glx

6、本地化服务部署

6.1 启动VLLM推理框架(需要先部署 VLLM 服务)

VLLM部署这部分等讲完VL模型部署后再说,先放在后面

6.1.1 测试VLLM推理模型是否可用

虽然是在同一台机器,由于是不同的docker的原因,因此我这里使用的是

host.docker.internal 而不是 localhost

# (测试是否启动成功:)
curl.exe http://localhost:8118/health
# 在另一个容器内部测试:
curl http://host.docker.internal:8118/health
6.1.2 创建yaml并修改

server_url 必需要修改成VLLM能够正常请求的api接口

# 创建yaml文件:
paddlex --get_pipeline_config PaddleOCR-VL
vim /home/PaddleOCR-VL.yaml

修改下面内容:
VLRecognition:
  ...
  genai_config:
    backend: vllm-server
    server_url: http://127.0.0.1:8118/v1
6.1.3 通过yaml启动

paddlex --install serving 网络波动较大,如果失败了多重试几次即可

# 安装服务依赖
paddlex --install serving
# 通过yaml的方式进行启动服务:
paddlex --serve --pipeline /home/PaddleOCR-VL.yaml

6.2 不使用VLLM推理框架,直接部署

# 安装服务依赖:
paddlex --install serving
# 启动服务:
paddlex --serve --pipeline PaddleOCR-VL


paddlex --serve --pipeline {产线名称或产线配置文件路径} [{其他命令行选项}]
名称	说明
--pipeline	产线名称或产线配置文件路径。
--device	产线部署设备。默认为 cpu(如 GPU 不可用)或 gpu:0(如 GPU 可用)。
--host	服务器绑定的主机名或 IP 地址。默认为0.0.0.0。
--port	服务器监听的端口号。默认为8080。
--use_hpip	如果指定,则启用高性能推理插件。
--serial_number	高性能推理插件使用的序列号。只在启用高性能推理插件时生效。 请注意,并非所有产线、模型都支持使用高性能推理插件,详细的支持情况请参考PaddleX 高性能推理指南。
--update_license	如果指定,则进行联网激活。只在启用高性能推理插件时生效。

7、在python端调用

详情API文档:https://www.paddleocr.ai/main/version3.x/pipeline_usage/PaddleOCR-VL.html#43

import base64
import requests
import pathlib

API_URL = "http://localhost:8080/layout-parsing" # 服务URL

image_path = "./demo.jpg"

# 对本地图像进行Base64编码
with open(image_path, "rb") as file:
    image_bytes = file.read()
    image_data = base64.b64encode(image_bytes).decode("ascii")

payload = {
    "file": image_data, # Base64编码的文件内容或者文件URL
    "fileType": 1, # 文件类型,1表示图像文件
}

# 调用API
response = requests.post(API_URL, json=payload)

# 处理接口返回数据
assert response.status_code == 200
result = response.json()["result"]
for i, res in enumerate(result["layoutParsingResults"]):
    print(res["prunedResult"])
    md_dir = pathlib.Path(f"markdown_{i}")
    md_dir.mkdir(exist_ok=True)
    (md_dir / "doc.md").write_text(res["markdown"]["text"])
    for img_path, img in res["markdown"]["images"].items():
        img_path = md_dir / img_path
        img_path.parent.mkdir(parents=True, exist_ok=True)
        img_path.write_bytes(base64.b64decode(img))
    print(f"Markdown document saved at {md_dir / 'doc.md'}")
    for img_name, img in res["outputImages"].items():
        img_path = f"{img_name}_{i}.jpg"
        pathlib.Path(img_path).parent.mkdir(exist_ok=True)
        with open(img_path, "wb") as f:
            f.write(base64.b64decode(img))
        print(f"Output image saved at {img_path}")

使用以下命令可以验证 PaddlePaddle 是否安装成功:

python -c “import paddle; print(paddle.version)”

8、 部署成功后二次启动:

docker start PaddleOCR_VL

docker exec -it PaddleOCR_VL /bin/bash

# 下面二选一
paddlex --serve --pipeline /home/PaddleOCR-VL.yaml
paddlex --serve --pipeline PaddleOCR-VL

  下面是启动成功的效果图:

三、VLLM推理框架部署

1、 下载模型并启动

这里有两种方式,其中一个是官网的PaddleOCR-VL-0.9B模型,另外一个是我个人部署的Qwen3模型,下面主要是讲官网的PaddleOCR-VL-0.9B模型,另外一个感兴趣的朋友也可以试一下

1.1 使用官方的PaddleOCR-VL-0.9B模型:

# 拉取VLLM镜像
docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-genai-vllm-server:latest 

# 启动镜像并执行
docker run -it --name PaddleOCR-VL_VLLM --gpus all -p 8118:8118 ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-genai-vllm-server:latest paddleocr genai_server --model_name PaddleOCR-VL-0.9B --host 0.0.0.0 --port 8118 --backend vllm

1.2 非官方的部署方式(Qwen3-0.6B)

docker pull vllm/vllm-openai:latest
## 启用国内镜像安装QWen3(8000->8118):
# https://docs.vllm.ai/en/latest/deployment/docker/?h=docker

docker run --runtime nvidia --gpus all --name PaddleOCR_VL_VLLM -v ~/.cache/huggingface:/root/.cache/huggingface --env "HF_ENDPOINT=https://hf-mirror.com" -p 8118:8000 --ipc=host vllm/vllm-openai:latest --model Qwen/Qwen3-0.6B

启动后看一下日志,出现下面结果的就是部署成功了,下面测试一下

2、测试是否启动成功

回到PaddleOCR的docker中测试接口是否能同

# 在本地测试:
curl.exe http://localhost:8118/health
# 在不同的Docker容器内部测试:
curl http://host.docker.internal:8118/health

或者直接进行提问,可以在下面的content中写入想提问的问题

curl http://host.docker.internal:8118/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
  "messages": [
    {
      "role": "user", 
      "content": "不必解释,直接回答markdown json 格式内容```json\n{\"1\":2}```"
    }
  ],
  "temperature": 0.01,
  "repetition_penalty": 1.8,
  "top_p": 0.9,
  "top_k": 20,
  "max_tokens": 1000,
  "stop": ["\n\n"],
  "chat_template_kwargs": {"enable_thinking": false}
}'

3、PaddleOCR_VL连接到VLLM模型

这个时候VLLM模型已经部署成功了,回到PaddleOCR_VL的docker环境

如果使用VLLM模型的话,必须要以yaml的方式进行启动

# 创建yaml文件:
paddlex --get_pipeline_config PaddleOCR-VL
vim /home/PaddleOCR-VL.yaml

修改下面内容:
VLRecognition:
  ...
  genai_config:
    backend: vllm-server
    server_url: http://127.0.0.1:8118/v1

启动服务即可

# 安装服务依赖
paddlex --install serving
# 通过yaml的方式进行启动服务:
paddlex --serve --pipeline /home/PaddleOCR-VL.yaml

基本上按照这个步骤操作都是没问题的,当然如果帮忙部署的话欢迎私信(白嫖怪勿扰,看着给就行)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐