使用Docker部署和使用PaddleOCR-VL
·
使用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}")
评价
执行效率,确实有点慢。
服务器日志

执行结果

更多推荐
所有评论(0)