PaddleOCR基于PaddleHub Serving的服务部署(docker环境)

文章目录

  • 1 CPU还是GPU版本
  • 2 GPU版本docker环境搭建
    • 2.1 docker基础镜像拉取
    • 2.2 运行镜像并赋予显卡资源
    • 2.3 检查容器内部基础环境
      • 2.3.1 python环境
      • 2.3.2 cuda和cudnn环境
      • 2.3.3 glibc环境
    • 2.4 配置CUDA_VISIBLE_DEVICES环境变量
    • 2.5 拉取工程代码
    • 2.6 基于PaddleHub Serving的服务部署
      • 2.6.1 准备环境
      • 2.6.2 下载轻量的==推理==模型
      • 2.6.3 修改模型路径
      • 2.6.4 安装服务模块
      • 2.6.5 自定义修改服务模块
      • 2.6.6 配置文件启动服务(支持CPU、GPU)
      • 2.6.7 发送预测请求

官方文档:https://github.com/PaddlePaddle/PaddleOCR

1 CPU还是GPU版本

gpu版本需要cuda和cudnn,这两个软件比较大,构建出来的docker镜像大小达到的10g,加上paddleocr达到12g。
本文将分别讲解gpu版本和cpu版本的环境搭建。

2 GPU版本docker环境搭建

官方推荐基础环境:

  • PaddlePaddle >= 2.0.0 (2.1.2)
  • python3.7
  • glibc 2.23
  • CUDA10.1 / CUDA10.2
  • CUDNN 7.6

CUDA看作是一个工作台,上面配有很多工具,如锤子、螺丝刀等。cuDNN是基于CUDA的深度学习GPU加速库,有了它才能在GPU上完成深度学习的计算。它就相当于工作的工具,比如它就是个扳手。但是CUDA这个工作台买来的时候,并没有送扳手。想要在CUDA上运行深度神经网络,就要安装cuDNN,就像你想要拧个螺帽就要把扳手买回来。这样才能使GPU进行深度神经网络的工作,工作速度相较CPU快很多。

2.1 docker基础镜像拉取

docker镜像地址:
https://github.com/PaddlePaddle/Serving/blob/develop/doc/Docker_Images_CN.md

# 首次运行需创建一个docker容器,再次运行时不需要运行当前命令
# 如果使用CUDA10,请运行以下命令拉取容器
# 如果是CUDA11+CUDNN8,推荐使用镜像registry.baidubce.com/paddlepaddle/paddle:2.1.3-gpu-cuda11.2-cudnn8
docker pull registry.baidubce.com/paddlepaddle/paddle:2.1.3-gpu-cuda10.2-cudnn7

2.2 运行镜像并赋予显卡资源

–gpus=“device=6”: 这里让其感知宿主机的6号卡。
–storage-opt:因为生成的容器即将大于10g,这里给30g。
-it:代表终端交互
/bin/bash: 一个守护进程命令,保证容器运行不退出

docker run --name ppocr -p 8075:8868 -it --gpus="device=6" -e NVIDIA_DRIVER_CAPABILITIES=compute,utility -e NVIDIA_VISIBLE_DEVICES=all --storage-opt size=30G  registry.baidubce.com/paddlepaddle/paddle:2.1.3-gpu-cuda10.2-cudnn7 /bin/bash 

运行此命令后,便进入了ppocr容器内部。

2.3 检查容器内部基础环境

2.3.1 python环境

终端输入python,显示3.4版本

2.3.2 cuda和cudnn环境

注意宿主机需要安装好cuda驱动

λ 1e7c36db9018 /usr/local/cuda nvcc -V

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Wed_Oct_23_19:24:38_PDT_2019
Cuda compilation tools, release 10.2, V10.2.89

2.3.3 glibc环境

λ 1e7c36db9018 /usr/local/cuda ldd --version

ldd (Ubuntu GLIBC 2.23-0ubuntu11.2) 2.23
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

2.4 配置CUDA_VISIBLE_DEVICES环境变量

如果不配置cuda环境变量会报错:
RuntimeError: Environment Variable CUDA_VISIBLE_DEVICES is not set correctly. If you wanna use gpu, please set CUDA_VISIBLE_DEVICES via export CUDA_VISIBLE_DEVICES=cuda_device_id.

vim ~/.bashrc 

在底部添加
export CUDA_VISIBLE_DEVICES=0

wq保存
source  ~/.bashrc 

为什么我们的环境变量是0号卡,因为我们容器内部只有一个显卡,所以就是0号卡

2.5 拉取工程代码

默认在home目录下

【推荐】git clone https://github.com/PaddlePaddle/PaddleOCR

如果因为网络问题无法pull成功,也可选择使用码云上的托管:

git clone https://gitee.com/paddlepaddle/PaddleOCR

注:码云托管代码可能无法实时同步本github项目更新,存在3~5天延时,请优先使用推荐方式。

然后进入到PaddleOCR目录下

2.6 基于PaddleHub Serving的服务部署

这里官方已经给了详细的介绍,建议熟读官方文档:
https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.4/deploy/hubserving/readme.md

hubserving服务部署目录下包括检测、识别、2阶段串联三种服务包,请根据需求选择相应的服务包进行安装和启动。目录结构如下:

deploy/hubserving/
└─ ocr_cls 分类模块服务包
└─ ocr_det 检测模块服务包
└─ ocr_rec 识别模块服务包
└─ ocr_system 检测+识别串联服务包
每个服务包下包含3个文件。以2阶段串联服务包为例,目录如下:

deploy/hubserving/ocr_system/
└─ init.py 空文件,必选
└─ config.json 配置文件,可选,使用配置启动服务时作为参数传入
└─ module.py 主模块,必选,包含服务的完整逻辑
└─ params.py 参数文件,必选,包含模型路径、前后处理参数等参数

但是还是遇到了不少的坑,这里记录下。

2.6.1 准备环境

当前目录
/home/PaddleOCR

# 安装paddlehub  
# paddlehub 需要 python>3.6.2
pip3 install paddlehub==2.1.0 --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple

# 安装requirements.txt依赖
pip  install -r requirements.txt -i https://pypi.douban.com/simple

2.6.2 下载轻量的推理模型

安装服务模块前,需要准备推理模型并放到正确路径。默认使用的是PP-OCRv2模型,默认模型路径为:
检测模型:./inference/ch_PP-OCRv2_det_infer/
识别模型:./inference/ch_PP-OCRv2_rec_infer/
方向分类器:./inference/ch_ppocr_mobile_v2.0_cls_infer/

模型库:
可以前往自行查找对应的推理模型进行下载
https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.4/doc/doc_ch/models_list.md

# 进入/home/PaddleOCR/deploy/hubserving/ocr_system下
cd /home/PaddleOCR/deploy/hubserving/ocr_system

# 下载并解压检测模型
wget https://paddleocr.bj.bcebos.com/PP-OCRv2/chinese/ch_PP-OCRv2_det_infer.tar && tar -xf ch_PP-OCRv2_det_infer.tar && rm -rf ch_PP-OCRv2_det_infer.tar 

# 下载并解压识别模型
wget https://paddleocr.bj.bcebos.com/PP-OCRv2/chinese/ch_PP-OCRv2_rec_infer.tar && tar -xf ch_PP-OCRv2_rec_infer.tar && rm -rf ch_PP-OCRv2_rec_infer.tar 

# 下载并解压方向分类器
wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar && tar -xf ch_ppocr_mobile_v2.0_cls_infer.tar && rm -rf ch_ppocr_mobile_v2.0_cls_infer.tar 

2.6.3 修改模型路径

vim params.py 修改三个dir,注意要绝对路径

def read_params():
    cfg = Config()

    #params for text detector
    cfg.det_algorithm = "DB"
    cfg.det_model_dir = "/home/PaddleOCR/deploy/hubserving/ocr_system/ch_PP-OCRv2_det_infer/"
    cfg.det_limit_side_len = 960
    cfg.det_limit_type = 'max'

    #DB parmas
    cfg.det_db_thresh = 0.3
    cfg.det_db_box_thresh = 0.5
    cfg.det_db_unclip_ratio = 1.6
    cfg.use_dilation = False
    cfg.det_db_score_mode = "fast"

    #EAST parmas
    cfg.det_east_score_thresh = 0.8
    cfg.det_east_cover_thresh = 0.1
    cfg.det_east_nms_thresh = 0.2

    #params for text recognizer
    cfg.rec_algorithm = "CRNN"
    cfg.rec_model_dir = "/home/PaddleOCR/deploy/hubserving/ocr_system//ch_PP-OCRv2_rec_infer/"

    cfg.rec_image_shape = "3, 32, 320"
    cfg.rec_char_type = 'ch'
    cfg.rec_batch_num = 30
    cfg.max_text_length = 25

    cfg.rec_char_dict_path = "/home/PaddleOCR/ppocr/utils/ppocr_keys_v1.txt"
    cfg.use_space_char = True

    #params for text classifier
    cfg.use_angle_cls = True
    cfg.cls_model_dir = "/home/PaddleOCR/deploy/hubserving/ocr_system/ch_ppocr_mobile_v2.0_cls_infer/"
    cfg.cls_image_shape = "3, 48, 192"
    cfg.label_list = ['0', '180']
    cfg.cls_batch_num = 30
    cfg.cls_thresh = 0.9

    cfg.use_pdserving = False

2.6.4 安装服务模块

PaddleOCR提供3种服务模块,根据需要安装所需模块。
注意需要在/home/PaddleOCR目录下
在Linux环境下,安装示例如下:

cd /home/PaddleOCR

# 安装检测服务模块:  
hub install deploy/hubserving/ocr_det/

# 或,安装分类服务模块:  
hub install deploy/hubserving/ocr_cls/

# 或,安装识别服务模块:  
hub install deploy/hubserving/ocr_rec/

# 或,安装检测+识别串联服务模块:  
hub install deploy/hubserving/ocr_system/

安装完毕后可在/home/PaddleOCR目录下执行
hub list命令查看

# 查看hub配置
hub config

grep: warning: GREP_OPTIONS is deprecated; please use an alias or script
The current configuration is shown below.
log:
  enable: true
  level: DEBUG
server: http://paddlepaddle.org.cn/paddlehub

# 修改日志级别
hub config log.level==INFO

2.6.5 自定义修改服务模块

如果需要修改服务逻辑,你一般需要操作以下步骤(以修改ocr_system为例):

  • 1、 停止服务
    hub serving stop --port/-p XXXX

  • 2、 到相应的module.pyparams.py等文件中根据实际需求修改代码。
    例如,如果需要替换部署服务所用模型,则需要到params.py中修改模型路径参数det_model_dirrec_model_dir,如果需要关闭文本方向分类器,则将参数use_angle_cls置为False,当然,同时可能还需要修改其他相关参数,请根据实际情况修改调试。 强烈建议修改后先直接运行module.py调试,能正确运行预测后再启动服务测试。

  • 3、 卸载旧服务包
    hub uninstall ocr_system

  • 4、 安装修改后的新服务包
    hub install deploy/hubserving/ocr_system/

  • 5、重新启动服务
    hub serving start -m ocr_system

2.6.6 配置文件启动服务(支持CPU、GPU)

启动命令:hub serving start -c config.json

cd /home/PaddleOCR

hub serving start -c deploy/hubserving/ocr_system/config.json 

grep: warning: GREP_OPTIONS is deprecated; please use an alias or script
[2022-01-11 06:38:35,848] [ WARNING] - The _initialize method in HubModule will soon be deprecated, you can use the __init__() to handle the initialization of the object
use gpu:  True
CUDA_VISIBLE_DEVICES:  0
grep: warning: GREP_OPTIONS is deprecated; please use an alias or script
grep: warning: GREP_OPTIONS is deprecated; please use an alias or script
grep: warning: GREP_OPTIONS is deprecated; please use an alias or script
 * Serving Flask app "paddlehub.serving.app_compat" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:8868/ (Press CTRL+C to quit)

其中,config.json格式如下:

{
    "modules_info": {
        "ocr_system": {
            "init_args": {
                "version": "1.0.0",
                "use_gpu": true
            },
            "predict_args": {
            }
        }
    },
    "port": 8868,
    "use_multiprocess": false,
    "workers": 2
}
  • init_args中的可配参数与module.py中的_initialize函数接口一致。其中,当use_gpu为true时,表示使用GPU启动服务。
  • predict_args中的可配参数与module.py中的predict函数接口一致。

注意:

  • 使用配置文件启动服务时,其他参数会被忽略。
  • 如果使用GPU预测(即,use_gpu置为true),则需要在启动服务之前,设置CUDA_VISIBLE_DEVICES环境变量,如:export CUDA_VISIBLE_DEVICES=0,否则不用设置。
  • use_gpu不可与use_multiprocess同时为true。

如,使用GPU 3号卡启动串联服务:

export CUDA_VISIBLE_DEVICES=3
hub serving start -c deploy/hubserving/ocr_system/config.json

2.6.7 发送预测请求

这里查看官方文档即可:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.4/deploy/hubserving/readme.md

配置好服务端,可使用以下命令发送预测请求,获取预测结果:
python /home/PaddleOCR/tools/test_hubserving.py http://127.0.0.1:8868/predict/ocr_system /ocr/

你可能感兴趣的:(python,paddlepaddle,docker,深度学习,python)