PaddleOCR系列(二)--hubserving & pdserving & hub install
一、各种部署方式特点及注意事项
简称
hubserving=PaddleHub Servingpdserving=PaddleHub Servinghub install=指通过paddlehub库直接安装部署服务
部署方式
都是基于
Docker进行部署,Docker环境搭建参照该博文如果你对
Docker比较熟悉,可以直接拉取该项目,对应的方式及版本都做了归类git pull https://github.com/steinvenic/PaddleOCR-Docker.git
如果被墙可以使用镜像站git pull https://github.com.cnpmjs.org/steinvenic/PaddleOCR-Docker.git
各服务特点
pdserving更适合企业级部署,性能更高,摘取官方的介绍:
支持客户端和服务端之间高并发和高效通信
支持 工业级的服务能力 例如模型管理,在线加载,在线A/B测试等
支持 多种编程语言 开发客户端,例如C++, Python和Java
hubserving可以理解为源码方式安装某个服务,配置型强hub install其实和hubserving方式一样,都使用paddlehub库进行部署的,其首次进行识别的的时候,会自动下载模型文件,真正一条命令就可以运行起来一个服务,部署起来超简单。
不足之处在于我现在还没找到对于相关模块的配置。只有paddlehub自己的一些启动参数可配置。如果你的显卡比较好,又想快点部署,优先考虑采用本方式。低端显卡要是使用此种方式,会导致显存迅速拉满,然后不可用,我现在也没找到解决办法。
相同配置的硬件,使用该种方式,CPU版相较于hubserving明显速度变慢很多,估计是某些参数没设置好,请酌情使用,GPU版本未测试
除了本文的OCR,还有很多有趣的服务通过此种方式可快速搭建,详见
注意事项
- 相同价格的硬件,识别速度上还是
GPU速度更快,优先选择GPU - 部署方式上优先选择
pdserving方式 - 如果你没有显卡,只能用
CPU的话,一定要确认你的CPU要支持AVX指令集,验证方法:lscpu | grep avx
没有AVX指令的话,部署起来比较困难,而且识别速度应该会很慢。
如果你真想部署的话,要安装对应的noavx版本的paddlepaddle,whl包在这并且只能使用Python3.8,这个我暂时没时间验证是否能安装成功。等后面有时间了再研究一下... - 当你使用
wget获取资源的时候,如果发现速度很慢,只有几十KB,你可以尝试一下Ctrl+C取消后再重新获取,这个问题是什么导致的我也不清楚 - 如果你使用的是阿里云或者其他(非百度)的云平台获取资源的时候,速度奇慢,我想是被百度限制了,这时候你可能需要在本地下载好再传到你机器上,当然你也可以使用代理的方式
- 当你真想部署成一个可靠的服务时,
GPU显存我感觉最少要16 GB - 当你在阿里云上使用
pdserving方式部署,有可能遇到显存被瞬间填满,机器卡死的情况。我本以为是PaddleServing造成的现存泄露,我也一直在纠结这个问题。但在百度的aistudio上,同样16G显存,aistudio是正常的
二、pdserving方式部署
GPU
Dockerfile:
FROM paddlepaddle/paddle:2.1.0-gpu-cuda10.2-cudnn7
LABEL maintainer="steinven@qq.com"
LABEL version="1.0"
LABEL description="PaddleOCR pdserving GPU version"
#github网速太慢或被墙,现用的cnpmjs加速,也可以更换为码云
ENV REPO_LINK=https://github.com.cnpmjs.org/PaddlePaddle/PaddleOCR.git
#模型数据
ENV orc_detect_model=https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar
ENV orc_recognition_model=https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar
#whl包,开发测试阶段,未上传到pypi
ENV paddle_serving_client_test=https://paddle-serving.bj.bcebos.com/test-dev/whl/paddle_serving_client-0.0.0-cp37-none-any.whl
#安装所需的库文件
RUN pip3.7 install --upgrade pip paddle-serving-server-gpu==0.6.1.post101 paddle-serving-app==0.6.1 -i https://mirror.baidu.com/pypi/simple \
&& git clone $REPO_LINK /PaddleOCR \
&& pip3.7 install -r /PaddleOCR/requirements.txt -i https://mirror.baidu.com/pypi/simple
#下载模型数据并解压
WORKDIR /PaddleOCR/deploy/pdserving
ADD $orc_detect_model .
ADD $orc_recognition_model .
ADD $paddle_serving_client_test .
RUN for f in *.tar; do tar xf "$f"; done;rm -fr *.tar \
&& pip3.7 install paddle_serving_client-0.0.0-cp37-none-any.whl \
&& python3.7 -m paddle_serving_client.convert --dirname ./ch_ppocr_mobile_v2.0_det_infer/ \
--model_filename inference.pdmodel \
--params_filename inference.pdiparams \
--serving_server ./ppocr_det_mobile_2.0_serving/ \
--serving_client ./ppocr_det_mobile_2.0_client/ \
&& python3.7 -m paddle_serving_client.convert --dirname ./ch_ppocr_mobile_v2.0_rec_infer/ \
--model_filename inference.pdmodel \
--params_filename inference.pdiparams \
--serving_server ./ppocr_rec_mobile_2.0_serving/ \
--serving_client ./ppocr_rec_mobile_2.0_client/ \
&& rm -fr *.tar
EXPOSE 9998
ENTRYPOINT ["/bin/bash","-c","python3.7 web_service.py"]
构建镜像
docker build -t pdserving_gpu:v1 .
运行
docker run -itd --network=host --gpus all --name pdserving_gpu pdserving_gpu:v1
修改配置
查看运行日志发现没有错误后,低端显卡的话,别先进行测试。我们需要修改一下配置文件。
默认的配置对显卡要求较高,需要修改一下QPS,默认的两个并发参数分别为8、4,现在拿我的GeForce 750 2GB显存,我需要把它改成2、1
- 进入容器:
docker exec -it pdserving_gpu /bin/bash - 打开配置文件
vim /PaddleOCR/deploy/pdserving/config.yml,找到下图对应的两个参数,进行修改

- 重启
docker容器:docker restart pdserving_gpu - 测试:
# coding:utf-8
import base64
import json
import os
import requests
def cv2_to_base64(image):
return base64.b64encode(image).decode('utf8')
url = "http://172.16.71.33:9998/ocr/prediction"
test_img_dir = r"C:\Users\eric\Desktop\pre_ocr_images"
for idx, img_file in enumerate(os.listdir(test_img_dir)):
with open(os.path.join(test_img_dir, img_file), 'rb') as file:
image_data1 = file.read()
image = cv2_to_base64(image_data1)
for i in range(1):
data = {"key": ["image"], "value": [image]}
r = requests.post(url=url, data=json.dumps(data))
print(r.json())
print("==> total number of test imgs: ", len(os.listdir(test_img_dir)))
CPU
Dockerfile:
FROM paddlepaddle/paddle:2.1.0
LABEL maintainer="steinven@qq.com"
LABEL version="1.0"
LABEL description="PaddleOCR pdserving CPU version"
#github网速太慢或被墙,现用的cnpmjs加速,也可以更换为码云
ENV REPO_LINK=https://github.com.cnpmjs.org/PaddlePaddle/PaddleOCR.git
#模型数据
ENV orc_detect_model=https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar
ENV orc_recognition_model=https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar
#whl包,开发测试阶段,未上传到pypi
ENV paddle_serving_client_test=https://paddle-serving.bj.bcebos.com/test-dev/whl/paddle_serving_client-0.0.0-cp37-none-any.whl
#安装所需的库文件
RUN pip3.7 install --upgrade pip paddle-serving-server==0.6.1 paddle-serving-app==0.6.1 -i https://mirror.baidu.com/pypi/simple \
&& git clone $REPO_LINK /PaddleOCR \
&& pip3.7 install -r /PaddleOCR/requirements.txt -i https://mirror.baidu.com/pypi/simple
#下载模型数据并解压
WORKDIR /PaddleOCR/deploy/pdserving
ADD $orc_detect_model .
ADD $orc_recognition_model .
ADD $paddle_serving_client_test .
RUN for f in *.tar; do tar xf "$f"; done;rm -fr *.tar \
&& pip3.7 install paddle_serving_client-0.0.0-cp37-none-any.whl \
&& python3.7 -m paddle_serving_client.convert --dirname ./ch_ppocr_mobile_v2.0_det_infer/ \
--model_filename inference.pdmodel \
--params_filename inference.pdiparams \
--serving_server ./ppocr_det_mobile_2.0_serving/ \
--serving_client ./ppocr_det_mobile_2.0_client/ \
&& python3.7 -m paddle_serving_client.convert --dirname ./ch_ppocr_mobile_v2.0_rec_infer/ \
--model_filename inference.pdmodel \
--params_filename inference.pdiparams \
--serving_server ./ppocr_rec_mobile_2.0_serving/ \
--serving_client ./ppocr_rec_mobile_2.0_client/ \
&& rm -fr *.tar
EXPOSE 9998
ENTRYPOINT ["/bin/bash","-c","python3.7 web_service.py"]
构建镜像
docker build -t pdserving_cpu:v1 .
运行
docker run -itd --network=host --name pdserving_cpu pdserving_cpu:v1
后续测试请参见上方的GPU版本,不再赘述
三、hubserving方式部署
GPU版
Dockerfile:
FROM paddlepaddle/paddle:2.1.0-gpu-cuda10.2-cudnn7
LABEL maintainer="steinven@qq.com"
LABEL version="1.0"
LABEL description="PaddleOCR hubserving GPU version"
#github网速太慢或被墙,现用的cnpmjs加速,也可以更换为码云
ENV REPO_LINK=https://github.com.cnpmjs.org/PaddlePaddle/PaddleOCR.git
#模型数据,现用的ch_ppocr_mobile_v2.0_xx,为中英文超轻量OCR模型,因为源码参数中配置的就为该模型,
#所以不用修改源码。如果切换为服务端模型,记得修改deploy/hubserving/ocr_system/params.py下对应的模型位置
ENV orc_detect_model=https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar
ENV orc_direction_model=https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar
ENV orc_recognition_model=https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar
#安装所需的库文件
RUN pip3.7 install --upgrade pip paddlehub -i https://mirror.baidu.com/pypi/simple \
&& git clone $REPO_LINK /PaddleOCR \
&& pip3.7 install -r /PaddleOCR/requirements.txt -i https://mirror.baidu.com/pypi/simple \
&& mkdir -p /PaddleOCR/inference
#下载模型数据并解压
WORKDIR /PaddleOCR/inference/
ADD $orc_detect_model .
ADD $orc_direction_model .
ADD $orc_recognition_model .
RUN for f in *.tar; do tar xf "$f"; done;rm -fr *.tar
WORKDIR /PaddleOCR
EXPOSE 8868
ENTRYPOINT ["/bin/bash","-c","export CUDA_VISIBLE_DEVICES=0 && hub install deploy/hubserving/ocr_system/ && hub serving start -c deploy/hubserving/ocr_system/config.json "]
构建docker镜像
docker build -t hubserving_gpu:v1 .
运行
docker run -itd --network=host --gpus all --name hubserving_gpu hubserving_gpu:v1
检查运行状态,查看是否有错误,查看端口号
docker logs -f hubserving_gpu
客户端测试:
# coding:utf-8
import base64
import json
import os
import traceback
import cv2
import requests
test_img_dir = './imgs/1'
def cv2_to_base64(image):
data = cv2.imencode('.jpg', image)[1]
return base64.b64encode(data.tostring()).decode('utf8')
for idx, img_file in enumerate(os.listdir(test_img_dir)):
try:
data = {'images': [cv2_to_base64(cv2.imread(os.path.join(test_img_dir, img_file)))]}
headers = {"Content-type": "application/json"}
url = "http://172.16.71.33:8868/predict/ocr_system"
r = requests.post(url=url, headers=headers, data=json.dumps(data))
print(r.text)
print(r.json()["results"])
except:
traceback.print_exc()
continue
CPU版
Dockerfile
FROM paddlepaddle/paddle:2.1.0
LABEL maintainer="steinven@qq.com"
LABEL version="1.0"
LABEL description="PaddleOCR hubserving CPU version"
#github网速太慢或被墙,现用的cnpmjs加速,也可以更换为码云
ENV REPO_LINK=https://github.com.cnpmjs.org/PaddlePaddle/PaddleOCR.git
#模型数据,现用的ch_ppocr_mobile_v2.0_xx,为中英文超轻量OCR模型,因为源码参数中配置的就为该模型,
#所以不用修改源码。如果切换为服务端模型,记得修改deploy/hubserving/ocr_system/params.py下对应的模型位置
ENV orc_detect_model=https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar
ENV orc_direction_model=https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar
ENV orc_recognition_model=https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar
#安装所需的库文件
RUN pip3.7 install --upgrade pip paddlehub -i https://mirror.baidu.com/pypi/simple \
&& git clone $REPO_LINK /PaddleOCR \
&& pip3.7 install -r /PaddleOCR/requirements.txt -i https://mirror.baidu.com/pypi/simple \
&& mkdir -p /PaddleOCR/inference
#下载模型数据并解压
WORKDIR /PaddleOCR/inference/
ADD $orc_detect_model .
ADD $orc_direction_model .
ADD $orc_recognition_model .
RUN for f in *.tar; do tar xf "$f"; done;rm -fr *.tar
WORKDIR /PaddleOCR
EXPOSE 8868
ENTRYPOINT ["/bin/bash","-c","hub install deploy/hubserving/ocr_system/ && hub serving start -m ocr_system -p 8868"]
构建镜像
docker build -t hubserving_cpu:v1 .
运行
docker run -itd --network=host --name hubserving_cpu hubserving_cpu:v1
后续测试请参见上方的GPU版本,不再赘述
四、hub install方式部署
GPU版
Dockerfile
FROM paddlepaddle/paddle:2.1.0-gpu-cuda10.2-cudnn7
LABEL maintainer="steinven@qq.com"
LABEL version="1.0"
LABEL description="hub install GPU version"
ENV CUDA_VISIBLE_DEVICES=0
#安装所需的库文件
RUN pip3.7 install --upgrade pip paddlehub shapely pyclipper -i https://mirror.baidu.com/pypi/simple
ENTRYPOINT ["/bin/bash","-c","hub serving start -m chinese_ocr_db_crnn_server"]
构建镜像
docker build -t hub_install_gpu:v1 .
运行
docker run -itd --network=host --gpus all --name hub_install_gpu hub_install_gpu:v1
测试
# coding:utf-8
import base64
import json
import os
import cv2
import requests
def cv2_to_base64(image):
data = cv2.imencode('.jpg', image)[1]
return base64.b64encode(data.tostring()).decode('utf8')
url = "http://172.16.71.33:8866/predict/chinese_ocr_db_crnn_server"
test_img_dir = './images1'
for idx, img_file in enumerate(os.listdir(test_img_dir)):
data = {'images': [cv2_to_base64(cv2.imread(os.path.join(test_img_dir, img_file)))]}
headers = {"Content-type": "application/json"}
r = requests.post(url=url, headers=headers, data=json.dumps(data))
print(r.json()["results"])
CPU版
Dockerfile
FROM paddlepaddle/paddle:2.1.0
LABEL maintainer="steinven@qq.com"
LABEL version="1.0"
LABEL description="hub install CPU version"
#安装所需的库文件
RUN pip3.7 install --upgrade pip paddlehub shapely pyclipper -i https://mirror.baidu.com/pypi/simple
ENTRYPOINT ["/bin/bash","-c","hub serving start -m chinese_ocr_db_crnn_server"]
构建镜像
docker build -t hub_install_cpu:v1 .
运行
docker run -itd --network=host --name hub_install_cpu hub_install_cpu:v1
后续测试请参见上方的GPU版本,不再赘述
PaddleOCR系列(二)--hubserving & pdserving & hub install的更多相关文章
- ANDROID Porting系列二、配置一个新产品
ANDROID Porting系列二.配置一个新产品 详细说明 下面的步骤描述了如何配置新的移动设备和产品的makefile运行android. 1. 目录//vendor/创建一个公 ...
- ldap配置系列二:jenkins集成ldap
ldap配置系列二:jenkins集成ldap jenkins简介 jenkins是一个独立的.开放源码的自动化服务器,它可以用于自动化与构建.测试.交付或部署软件相关的各种任务. jenkins官方 ...
- 搜索引擎ElasticSearchV5.4.2系列二之ElasticSearchV5.4.2+kibanaV5.4.2+x-packV5.4.2安装
相关博文: 搜索引擎ElasticSearchV5.4.2系列一之ES介绍 搜索引擎ElasticSearchV5.4.2系列二之ElasticSearchV5.4.2+klanaV5.4.2+x-p ...
- Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群
Redis总结(五)缓存雪崩和缓存穿透等问题 前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...
- SonarQube系列二、分析dotnet core/C#代码
[前言] 本系列主要讲述sonarqube的安装部署以及如何集成jenkins自动化分析.netcore项目.目录如下: SonarQube系列一.Linux安装与部署 SonarQube系列二.分析 ...
- Grafana +Zabbix 系列二
Grafana +Zabbix 系列二 Grafana 简介补充 Grafana自身并不存储数据,数据从其他地方获取.需要配置数据源 Grafana支持从Zabbix中获取数据 Grafana优化图形 ...
- 前端构建大法 Gulp 系列 (二):为什么选择gulp
系列目录 前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gul ...
- WPF入门教程系列二十三——DataGrid示例(三)
DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...
- Web 开发人员和设计师必读文章推荐【系列二十九】
<Web 前端开发精华文章推荐>2014年第8期(总第29期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
随机推荐
- XCTF练习题---MISC---Ditf
XCTF练习题---MISC---Ditf flag:flag{Oz_4nd_Hir0_lov3_For3ver} 解题步骤: 1.观察题目,下载附件 2.这道题是安恒办的一场比赛题目,下载附件以后是 ...
- Django模板相关
1.母版 想象一个举着火炬的手,除了火炬这个手还能举棒球棍.举雷神之锤.举拖拉机钥匙等等,举得东西不同给人整体感觉就不同. 母版就相当于这个手(实际为一个html文件),其他相关的html文件就相当于 ...
- Water 2.6.3 发布,一站式服务治理平台
Water(水孕育万物...) Water 为项目开发.服务治理,提供一站式解决方案(可以理解为微服务架构支持套件).基于 Solon 框架开发,并支持完整的 Solon Cloud 规范:已在生产环 ...
- 使用本地自签名证书为 React 项目启用 https 支持
简介 现在是大前端的时代,我们在本地开发 React 项目非常方便.这不是本文的重点,今天要分享一个话题是,如何为这些本地的项目,添加 https 的支持.为什么要考虑这个问题呢?主要有几个原因 如果 ...
- linux系统平均负载高(load average)
系统平均负载高(load average) 问题现象 两个案例都是:系统平均负载高,但cpu,内存,磁盘io都正常 什么是系统平均负载 平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进 ...
- 关键字 global和nonlocal
globale 表示从全局把一个变量(比如a)引入局部,后面的变量全是此变量a 使用 globale 变量名 # 全局变量一般是不能随意的修改的 # a = 10 # def func(): # ...
- Go内存管理一文足矣
最早学习C.C++语言时,它们都是把内存的管理全部交给开发者,这种方式最灵活但是也最容易出问题,对人员要求极高:后来出现的一些高级语言像Java.JavaScript.C#.Go,都有语言自身解决了内 ...
- 【算法】归并排序(Merge Sort)(五)
归并排序(Merge Sort) 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序 ...
- Map和WeakMap的方法和区别
Map Map是一组键值对的结构,具有极快的查找速度. 一.构造函数不同 let map = new Map(); let weakmap = new WeakMap(); 二.内置函数不同 Map的 ...
- 关于『HTML5』第一弹
关于『HTML5』:第一弹 建议缩放90%食用 祝各位国庆节快乐!!1 经过了「过时的 HTML」.「正当时的 Markdown」的双重洗礼后,我下定决心,好好学习HTML5 这回不过时了吧(其实和 ...