zoukankan      html  css  js  c++  java
  • 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:UsersericDesktoppre_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版本,不再赘述

  • 相关阅读:
    184. Department Highest Salary【leetcode】sql,join on
    181. Employees Earning More Than Their Managers【leetcode】,sql,inner join ,where
    178. Rank Scores【leetcode】,sql
    177. Nth Highest Salary【leetcode】,第n高数值,sql,limit,offset
    176. Second Highest Salary【取表中第二高的值】,sql,limit,offset
    118. Pascal's Triangle【LeetCode】,java,算法,杨辉三角
    204. Count Primes【leetcode】java,算法,质数
    202. Happy Number【leetcode】java,hashSet,算法
    41. First Missing Positive【leetcode】寻找第一个丢失的整数,java,算法
    删除
  • 原文地址:https://www.cnblogs.com/steinven/p/14934863.html
Copyright © 2011-2022 走看看