把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的最新版本
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
进入docker内部后,我们可以查看下python的版本号
可以看到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:
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:
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:
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的文件夹,具备如下格式:
识别模型同理。
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,如下图
调整对应的并发数,以及设备
2、启动服务可运行如下命令:
# 启动服务,运行日志保存在log.txt
python3 web_service.py --config=config.yml &>log.txt &
成功启动服务后,log.txt中会打印类似如下日志
3、可以在本机直接检测服务是否运行正常
python3 pipeline_http_client.py
如果出现如上图的结果,恭喜你已经将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
然后在客户端输入以下命令,指定需要处理的图片地址
python3 pipeline_http_client.py --image_dir=/Users/shaoshuai.shao/Desktop/WechatIMG190.jpeg
返回OCR处理结果如下