gpu版本需要cuda和cudnn,这两个软件比较大,构建出来的docker镜像大小达到的10g,加上paddleocr达到12g。
本文将分别讲解gpu版本和cpu版本的环境搭建。
官方推荐基础环境:
CUDA看作是一个工作台,上面配有很多工具,如锤子、螺丝刀等。cuDNN是基于CUDA的深度学习GPU加速库,有了它才能在GPU上完成深度学习的计算。它就相当于工作的工具,比如它就是个扳手。但是CUDA这个工作台买来的时候,并没有送扳手。想要在CUDA上运行深度神经网络,就要安装cuDNN,就像你想要拧个螺帽就要把扳手买回来。这样才能使GPU进行深度神经网络的工作,工作速度相较CPU快很多。
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
–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容器内部。
终端输入python,显示3.4版本
注意宿主机需要安装好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
λ 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.
如果不配置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号卡
默认在home目录下
【推荐】git clone https://github.com/PaddlePaddle/PaddleOCR
如果因为网络问题无法pull成功,也可选择使用码云上的托管:
git clone https://gitee.com/paddlepaddle/PaddleOCR
注:码云托管代码可能无法实时同步本github项目更新,存在3~5天延时,请优先使用推荐方式。
然后进入到PaddleOCR目录下
这里官方已经给了详细的介绍,建议熟读官方文档:
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 参数文件,必选,包含模型路径、前后处理参数等参数
但是还是遇到了不少的坑,这里记录下。
当前目录
/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
安装服务模块前,需要准备推理模型并放到正确路径。默认使用的是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
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
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
如果需要修改服务逻辑,你一般需要操作以下步骤(以修改ocr_system为例):
1、 停止服务
hub serving stop --port/-p XXXX
2、 到相应的module.py
和params.py
等文件中根据实际需求修改代码。
例如,如果需要替换部署服务所用模型,则需要到params.py
中修改模型路径参数det_model_dir
和rec_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
启动命令: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
}
注意:
如,使用GPU 3号卡启动串联服务:
export CUDA_VISIBLE_DEVICES=3
hub serving start -c deploy/hubserving/ocr_system/config.json
这里查看官方文档即可: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/