PaddleOCR服务化部署@Linux X86

3,635 阅读4分钟

把OCR服务部署在服务端功能无非两大类:

  • 训练模型:需要在拥有GPU的机器上不断地训练,优化,调参
  • 提供模型推演服务:部署最终的推理模型,并且对外提供实时的OCR服务

所以本篇基本是围绕第二类来实战,将最终的推理模型部署到后端Linux服务器上,并使用CPU来对外提供实时服务。

Paddle的官方文档写的还是比较准确的,基本跟随一步步操作即可

安装环境

服务器Linux版本:CentOS 7.9 64位

服务器CPU&内存:2C4G

服务器公网IP:130.24.57.130

PaddleOCR运行环境准备@Linux服务器

Linux用户可选择Anaconda或Docker两种方式运行。推荐使用Docker环境,PaddleOCR的开发训练流程可以均在Docker环境下运行。

使用Docker部署的方式优点就是对应的软件版本都已经帮你安排好,无须再下载对应的环境软件,比如python就直接帮你下载好了,解决了软件版本匹配维护的问题。

对应的docker镜像选择可以到DockerHub获取与你机器适配的镜像。

由于我的机器是x86 64位,所以要选择没有gpu的最新版本

image.png

OK,然后我们登录到服务器上,下载对应的docker镜像。如果之前机器上没有安装docker可以首先安装下docker环境。

# 拉取镜像
docker pull paddlepaddle/paddle:2.4.1

# 创建一个名字为ppocr的docker容器,并将当前目录映射到容器的/paddle目录下
# 如果您希望在CPU环境下使用docker,使用docker而不是nvidia-docker创建docker
sudo docker run --name ppocr -v $PWD:/paddle --network=host -it paddlepaddle/paddle:2.4.1 /bin/bash

运行完后输入如下命令查看是否docker启动成功

docker ps -a

返回结果如下:

CONTAINER ID   IMAGE                       COMMAND                  CREATED        STATUS                    PORTS                                                                                                      NAMES
09152a912a40   paddlepaddle/paddle:2.4.1   "/bin/bash"              20 hours ago   Up 3 hours                                                                                                                           ppocr

STATUS下面是UP状态,即说明启动成功

docker启动成功后,我们就可以进入docker内部

sudo docker container exec -it ppocr /bin/bash

image.png

进入docker内部后,我们可以查看下python的版本号

image.png

可以看到Paddle的Docker环境默认是配置了3.7版本的Python。这个很重要,后面需要根据Python的版本来下载对应的Paddle Serving的wheel安装软件。

随后就要下载PaddleOCR的git代码到服务器本地

git clone https://github.com/PaddlePaddle/PaddleOCR

# 进入到工作目录
cd PaddleOCR/deploy/pdserving/

随后准备PaddleServing的运行环境,包括Server,Client,App

对应的下载地址可以根据自己服务器的配置选择,下载地址

由于我的服务器是CPU,Python3.7版本的,故选择对应的stable whl

下载并安装Paddle-Serving-Server:

image.png

wget https://paddle-serving.bj.bcebos.com/test-dev/whl/paddle_serving_server-0.8.3-py3-none-any.whl
pip3 install paddle_serving_server-0.8.3-py3-none-any.whl

下载并安装paddle-serving-client:

image.png

wget https://paddle-serving.bj.bcebos.com/test-dev/whl/paddle_serving_client-0.8.3-cp37-none-any.whl
pip3 install paddle_serving_client-0.8.3-cp37-none-any.whl

下载并安装paddle-serving-app:

image.png

wget https://paddle-serving.bj.bcebos.com/test-dev/whl/paddle_serving_app-0.8.3-py3-none-any.whl
pip3 install paddle_serving_app-0.8.3-py3-none-any.whl

模型转换

使用PaddleServing做服务化部署时,需要将保存的inference模型转换为serving易于部署的模型。

首先,下载PP-OCR的inference模型

# 下载并解压 OCR 文本检测模型
wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_infer.tar -O ch_PP-OCRv3_det_infer.tar && tar -xf ch_PP-OCRv3_det_infer.tar
# 下载并解压 OCR 文本识别模型
wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_rec_infer.tar -O ch_PP-OCRv3_rec_infer.tar &&  tar -xf ch_PP-OCRv3_rec_infer.tar

接下来,用安装的paddle_serving_client把下载的inference模型转换成易于server部署的模型格式。

# 转换检测模型
python3 -m paddle_serving_client.convert --dirname ./ch_PP-OCRv3_det_infer/ \
                                         --model_filename inference.pdmodel          \
                                         --params_filename inference.pdiparams       \
                                         --serving_server ./ppocr_det_v3_serving/ \
                                         --serving_client ./ppocr_det_v3_client/

# 转换识别模型
python3 -m paddle_serving_client.convert --dirname ./ch_PP-OCRv3_rec_infer/ \
                                         --model_filename inference.pdmodel          \
                                         --params_filename inference.pdiparams       \
                                         --serving_server ./ppocr_rec_v3_serving/  \
                                         --serving_client ./ppocr_rec_v3_client/

检测模型转换完成后,会在当前文件夹多出ppocr_det_v3_serving 和ppocr_det_v3_client的文件夹,具备如下格式:

image.png

image.png

识别模型同理。

Paddle Serving pipeline部署

1、确认工作目录下文件结构:

pdserver目录包含启动pipeline服务和发送预测请求的代码,包括:

__init__.py
config.yml            # 启动服务的配置文件
ocr_reader.py         # OCR模型预处理和后处理的代码实现
pipeline_http_client.py   # 发送pipeline预测请求的脚本
web_service.py        # 启动pipeline服务端的脚本

由于服务器使用CPU没有GPU,并且配置比较低,2C4G。故需要修改config.yml,如下图

调整对应的并发数,以及设备

image.png

2、启动服务可运行如下命令:

# 启动服务,运行日志保存在log.txt
python3 web_service.py --config=config.yml &>log.txt &

成功启动服务后,log.txt中会打印类似如下日志

image.png

3、可以在本机直接检测服务是否运行正常

python3 pipeline_http_client.py

image.png

如果出现如上图的结果,恭喜你已经将PaddleOCR的服务化搭建成功。

4、将服务器的端口开放

由于docker在启动的时候就是用了和宿主机一样的网络配置--network=host,即在本机发布了9998的端口对外提供服务,该端口号配置可以在第1步里面的config.yml里面修改。

那么就需要在服务器上将端口9998设置为对外开放。

客户端验证部署

在本地机器上下载PaddleOCR的代码

git clone https://github.com/PaddlePaddle/PaddleOCR

# 进入到工作目录
cd PaddleOCR/deploy/pdserving/

随后修改pipeline_http_client.py中的url设置为对应服务器的公网IP

image.png

然后在客户端输入以下命令,指定需要处理的图片地址

python3 pipeline_http_client.py  --image_dir=/Users/shaoshuai.shao/Desktop/WechatIMG190.jpeg

返回OCR处理结果如下

image.png

引用

[PPOCR服务化部署]

[PaddleOCR运行环境准备]

[最新的Paddle-Serving wheel包安装包下载地址]