PaddleOCR系列(二)--hubserving & pdserving & hub install


一、各種部署方式特點及注意事項

簡稱

  • hubserving=PaddleHub Serving

  • pdserving=PaddleHub Serving

  • hub 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版本的paddlepaddlewhl在這並且只能使用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版本,不再贅述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM