使用Docker部署和使用PaddleOCR-VL

关注公众号: 朋蛋、码上小明

1 简介

PaddleOCR-VL是百度开源PaddlePaddle生态下PaddleOCR的子项目,是一款先进、高效的文档解析模型,专为文档中的元素识别设计。从PaddlePaddle的布局的生态来看确实很厉害,目前虽然跟国外的框架有一定的差距和存在一些BUG,但这是国产的必经之路,需要慢慢成长。自己安装部署的版本兼容问题,真是太大了。

PaddleOCR-VL(PaddleOCR)-文档解析的模型

# 官网地址
https://www.paddleocr.ai/latest/version3.x/pipeline_usage/PaddleOCR-VL.html

PaddleOCR-文字识别与文档解析基座

# 官网地址
https://www.paddleocr.ai/latest/

# Github
https://github.com/PaddlePaddle/PaddleOCR

PaddleX-实现产线级别的模型训练、推理与部署

# 官网地址
https://paddlepaddle.github.io/PaddleX/latest/

# Github
https://github.com/PaddlePaddle/PaddleX

PaddlePaddle-生态基座

# 官网地址
https://www.paddlepaddle.org.cn/

# Github地址
https://github.com/PaddlePaddle

2 Docker安装服务

2.1 官网VLM镜像安装

⚠️ 我使用的是离线版本,镜像下载的速度太慢了,所以,我就自己制作了一个镜像。

.env文件的内容

API_IMAGE_TAG_SUFFIX=latest-offline
VLM_BACKEND=vllm
VLM_IMAGE_TAG_SUFFIX=latest-offline

compose.yaml的内容

⚠️ 文件中的变量对应上面环境变量中的内容,可以直接替换

services:
  paddleocr-vl-api:
    image: ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-vl:${API_IMAGE_TAG_SUFFIX}
    container_name: paddleocr-vl-api
    ports:
      - 8080:8080
    depends_on:
      paddleocr-vlm-server:
        condition: service_healthy
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              device_ids: ["0"]
              capabilities: [gpu]
    # TODO: Allow using a regular user
    user: root
    restart: unless-stopped
    environment:
      - VLM_BACKEND=${VLM_BACKEND:-vllm}
    command: /bin/bash -c "paddlex --serve --pipeline /home/paddleocr/pipeline_config_${VLM_BACKEND}.yaml"
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://localhost:8080/health || exit 1"]

  paddleocr-vlm-server:
    image: ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-genai-${VLM_BACKEND}-server:${VLM_IMAGE_TAG_SUFFIX}
    container_name: paddleocr-vlm-server
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              device_ids: ["0"]
              capabilities: [gpu]
    # TODO: Allow using a regular user
    user: root
    restart: unless-stopped
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://localhost:8080/health || exit 1"]
      start_period: 300s

如果使用 Python API(PaddleOCRVL客户端)调用,可以使用下面的方式部署。

docker run -itd \
--name paddleocrvl\
--gpus all \
-p 8118:8118 \
ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-genai-vllm-server:latest-offline \
paddleocr genai_server \
--model_name PaddleOCR-VL-0.9B \
--host 0.0.0.0 \
--port 8118 \
--backend vllm

2.2 自己制作VLM镜像

(1)下载Python镜像

我的CUDA是13.0

docker pull nvidia/cuda:13.0.2-cudnn-devel-ubuntu24.04

(2)创建容器

docker run -itd \
--name paddleocr-vl-cuda \
nvidia/cuda:13.0.2-cudnn-devel-ubuntu24.04

(3)创建环境

# 进入容器
docker exec -it paddleocr-vl-cuda /bin/bash

# 更新apt
apt update

# 安装Python3.12
apt install python3.12

# 安装虚拟环境
apt install python3.12-venv

# 进入目录
cd /home

# 创建虚拟环境
python3.12 -m venv paddleocrvl

# 启动虚拟环境
source /home/paddleocrvl/bin/activate

(4)安装软件包

注意:我使用的是CUDA的版本是13.0

# 安装paddlepaddle-gpu
python -m pip install paddlepaddle-gpu==3.2.2 -i https://www.paddlepaddle.org.cn/packages/stable/cu130/

# 安装paddleocr
python -m pip install -U "paddleocr[doc-parser]" -i https://pypi.tuna.tsinghua.edu.cn/simple

# 安装safetensors
python -m pip install https://paddle-whl.bj.bcebos.com/nightly/cu126/safetensors/safetensors-0.6.2.dev0-cp38-abi3-linux_x86_64.whl

Safetensors是Hugging Face开发的一种新型模型文件格式,专为安全、高效存储和加载深度学习模型的张量数据(如权重和参数)而设计,旨在替代传统格式(如PyTorch的.pt/.pth或TensorFlow的.ckpt)。

(5)安装paddlex的插件

# 安装服务插件的依赖
paddlex --install serving

# 安装PaddleOCR-VL和下载模型
paddlex --serve --pipeline PaddleOCR-VL

错误1

安装paddlex插件出错(缺少cuda的内容)

ImportError: libGL.so.1: cannot open shared object file: No such file or directory

解决方法

# 更新软件包
apt-get update

# 安装依赖
apt-get install mesa-utils -y

错误2

paddlex启动服务serve

ImportError: libcuda.so.1: cannot open shared object file: No such file or directory

解决方法

# 安装驱动
apt install nvidia-driver-580

(6)保存镜像

在保存镜像前,添加启动脚本

添加脚本

# 进入home目录,在homez中添加启动脚本
cd /home

# 创建启动脚本
touch start.sh

# 编辑内容,需要安装vim(apt install vim)
vim start.sh

start.sh文件内容

启动paddleOCR-VL模型

# Activate python
source /home/paddleocrvl/bin/activate

# start paddleocr
paddlex --serve --pipeline PaddleOCR-VL

保存镜像

docker commit -m "paddlepaddle" paddleocr-vl-cuda paddleocr-vl-cuda:3.2.2

(7)创建容器

docker run -itd \
--name paddleocr-vl-cuda-v1 \
-p 8081:8080 \
--runtime nvidia \
--gpus all \
paddleocr-vl-cuda:3.2.2 \
/bin/bash \./home/start.sh

2.3 使用Python连接

Python代码如下

import base64
import requests
import pathlib

API_URL = "http://192.168.0.104:8081/layout-parsing" # 服务URL

image_path = "E:/test/img-test1/page-0.png"

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

payload = {
	# Base64编码的文件内容或者文件URL
    "file": image_data, 
    # 文件类型,1表示图像文件,
    "fileType": 1,
    # 是否返回图像,默认返回
    # "visualize": True,
    """
    # 这个功能在特定需求下很有用
    # 如果只识别表格,返回html格式的表格
    # 也可填写参数为 ocr、formula、table 和 chart。
    "promptLabel": "table",
    # 检测文件方向默认True,使用特殊需求时要设置False
    "useLayoutDetection": False
    """
}

# 调用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}")

评价

执行效率,确实有点慢。

服务器日志

在这里插入图片描述

执行结果

在这里插入图片描述

更多推荐