- Paddle Serving服務(wù)化部署實(shí)戰(zhàn)
- 準(zhǔn)備預(yù)測(cè)數(shù)據(jù)和部署環(huán)境
-
環(huán)境準(zhǔn)備
- 安裝 PaddlePaddle 2.0
- 安裝 PaddleOCR
- 準(zhǔn)備PaddleServing的運(yùn)行環(huán)境,
- 模型轉(zhuǎn)換
-
Paddle Serving pipeline部署
- 確認(rèn)工作目錄下文件結(jié)構(gòu):
- 啟動(dòng)服務(wù)可運(yùn)行如下命令:
-
測(cè)試
- Python發(fā)送服務(wù)請(qǐng)求:
- Postman 發(fā)送請(qǐng)求
- 參數(shù)調(diào)整
百度飛槳(PaddlePaddle) - PP-OCRv3 文字檢測(cè)識(shí)別系統(tǒng) 預(yù)測(cè)部署簡(jiǎn)介與總覽
百度飛槳(PaddlePaddle) - PP-OCRv3 文字檢測(cè)識(shí)別系統(tǒng) Paddle Inference 模型推理(離線部署)
百度飛槳(PaddlePaddle) - PP-OCRv3 文字檢測(cè)識(shí)別系統(tǒng) 基于 Paddle Serving快速使用(服務(wù)化部署 - CentOS)
百度飛槳(PaddlePaddle) - PP-OCRv3 文字檢測(cè)識(shí)別系統(tǒng) 基于 Paddle Serving快速使用(服務(wù)化部署 - Docker)推薦
Paddle Serving 是飛槳服務(wù)化部署框架,能夠幫助開發(fā)者輕松實(shí)現(xiàn)從移動(dòng)端、服務(wù)器端調(diào)用深度學(xué)習(xí)模型的遠(yuǎn)程預(yù)測(cè)服務(wù)。 Paddle Serving圍繞常見的工業(yè)級(jí)深度學(xué)習(xí)模型部署場(chǎng)景進(jìn)行設(shè)計(jì),具備完整的在線服務(wù)能力,支持的功能包括多模型管理、模型熱加載、基于Baidu-RPC的高并發(fā)低延遲響應(yīng)能力、在線模型A/B實(shí)驗(yàn)等,并提供簡(jiǎn)單易用的Client API。Paddle Serving可以與飛槳訓(xùn)練框架聯(lián)合使用,從而訓(xùn)練與遠(yuǎn)程部署之間可以無(wú)縫過(guò)度,讓用戶輕松實(shí)現(xiàn)預(yù)測(cè)服務(wù)部署,大大提升了用戶深度學(xué)習(xí)模型的落地效率。
Paddle Serving服務(wù)化部署框架(PIP安裝方式、Docker安裝)
最新wheel包合集
Paddle Serving服務(wù)化部署實(shí)戰(zhàn)
服務(wù)化部署指的是,將模型以服務(wù)的形式進(jìn)行部署,其他的設(shè)備可以通過(guò)發(fā)送請(qǐng)求的形式去訪問(wèn)服務(wù),從而獲取模型服務(wù)的推理結(jié)果。服務(wù)化部署示意圖如下所示。
在模型部署成功后,不同用戶都可以通過(guò)客戶端,以發(fā)送網(wǎng)絡(luò)請(qǐng)求的方式獲得推理服務(wù)。
基于Paddle Serving部署PP-OCRv2系統(tǒng)流程圖
準(zhǔn)備預(yù)測(cè)數(shù)據(jù)和部署環(huán)境
數(shù)據(jù)與模型推理所用數(shù)據(jù)一致。
運(yùn)行Paddle Serving,需要安裝Paddle Serving三個(gè)安裝包:paddle-serving-server、paddle-serving-client 和 paddle-serving-app,命令如下。
https://pypi.tuna.tsinghua.edu.cn/simple/
環(huán)境準(zhǔn)備
虛機(jī)配置:CentOS 7 、 內(nèi)存:12G、CPU:4核
本文版本號(hào):
PaddlePaddle 2.2.2
PaddleOCR 2.6
注意: Python 版本 (Docker 鏡像中的 Python 已經(jīng)集成好,比較方便:Python 3.7.12)
PaddlePaddle 2.4.0 - => Python 3.7.4
PaddlePaddle 2.4.1 + => Python 3.9.0
盡量保持一致,防止麻煩
首先下載PaddleOCR代碼,安裝相關(guān)依賴,具體命令如下
準(zhǔn)備PaddleOCR的運(yùn)行環(huán)境:https://gitee.com/paddlepaddle/PaddleOCR/blob/release/2.6/doc/doc_ch/installation.md
Linux 升級(jí)安裝 Python 3
安裝 PaddlePaddle 2.0
# 注意版本,原來(lái)電腦是 3.8 的。非常麻煩
[root@localhost PaddleOCR]# python -V
Python 3.7.4
[root@localhost PaddleOCR]# pip install -U pip
# 如果您的機(jī)器是CPU,請(qǐng)運(yùn)行以下命令安裝
[root@localhost PaddleOCR]# pip install paddlepaddle==2.2.2 -i https://mirror.baidu.com/pypi/simple
# 如果您的機(jī)器安裝的是CUDA9或CUDA10,請(qǐng)運(yùn)行以下命令安裝
# python3 -m pip install paddlepaddle-gpu==2.2.2 -i https://mirror.baidu.com/pypi/simple
# VQA任務(wù)中需要用到該庫(kù) -- 不安裝也沒(méi)報(bào)錯(cuò)
#[root@localhost PaddleOCR]# pip install paddlenlp==2.0.1 -i https://mirror.baidu.com/pypi/simple
安裝 PaddleOCR
[root@localhost ~]# cd /opt
# 下載代碼
[root@localhost opt]# git clone https://gitee.com/paddlepaddle/PaddleOCR.git
[root@localhost opt]# cd /opt/PaddleOCR
# 安裝運(yùn)行所需要的whl包
[root@localhost PaddleOCR]# pip install -r requirements.txt -i https://mirror.baidu.com/pypi/simple
準(zhǔn)備PaddleServing的運(yùn)行環(huán)境,
步驟如下:
[root@localhost PaddleOCR]# pwd
/opt/PaddleOCR
# 安裝serving,用于啟動(dòng)服務(wù) https://pypi.tuna.tsinghua.edu.cn/simple/paddle-serving-server/
[root@localhost PaddleOCR]# wget https://paddle-serving.bj.bcebos.com/test-dev/whl/paddle_serving_server-0.8.3-py3-none-any.whl
[root@localhost PaddleOCR]# pip install paddle_serving_server-0.8.3-py3-none-any.whl
# GPU 安裝下面地址
# wget https://paddle-serving.bj.bcebos.com/test-dev/whl/paddle_serving_server_gpu-0.8.3.post102-py3-none-any.whl
# pip3 install paddle_serving_server_gpu-0.8.3.post102-py3-none-any.whl
# 如果是cuda10.1環(huán)境,可以使用下面的命令安裝paddle-serving-server
# wget https://paddle-serving.bj.bcebos.com/test-dev/whl/paddle_serving_server_gpu-0.8.3.post101-py3-none-any.whl
# pip3 install paddle_serving_server_gpu-0.8.3.post101-py3-none-any.whl -i https://pypi.tuna.tsinghua.edu.cn/simple
# 安裝client,用于向服務(wù)發(fā)送請(qǐng)求, https://pypi.tuna.tsinghua.edu.cn/simple/paddle-serving-client/
# cp37 => python 3.7, 版本要對(duì)應(yīng),否則報(bào) ERROR: paddle_serving_client-0.8.3-cp37-none-any.whl is not a supported wheel on this platform.
[root@localhost PaddleOCR]# wget https://paddle-serving.bj.bcebos.com/test-dev/whl/paddle_serving_client-0.8.3-cp37-none-any.whl
[root@localhost PaddleOCR]# pip install paddle_serving_client-0.8.3-cp37-none-any.whl -i https://pypi.tuna.tsinghua.edu.cn/simple
# 安裝serving-app https://pypi.tuna.tsinghua.edu.cn/simple/paddle-serving-app/
[root@localhost PaddleOCR]# wget https://paddle-serving.bj.bcebos.com/test-dev/whl/paddle_serving_app-0.8.3-py3-none-any.whl
# 需要單獨(dú)安裝一下,否則 pip install paddle_serving_app-0.8.3-py3-none-any.whl 安裝時(shí)會(huì)報(bào) 安裝 opencv 超時(shí)
[root@localhost PaddleOCR]# pip install opencv-python==3.4.17.61 -i https://pypi.tuna.tsinghua.edu.cn/simple --verbose
[root@localhost PaddleOCR]# pip install paddle_serving_app-0.8.3-py3-none-any.whl -i https://pypi.tuna.tsinghua.edu.cn/simple
模型轉(zhuǎn)換
使用PaddleServing做服務(wù)化部署時(shí),需要將保存的inference模型轉(zhuǎn)換為serving易于部署的模型。
首先,下載PP-OCR的inference模型
[root@localhost PaddleOCR]# cd /opt/PaddleOCR/deploy/pdserving/
# 下載并解壓 OCR 文本檢測(cè)模型
[root@localhost pdserving]# wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_infer.tar -O ch_PP-OCRv3_det_infer.tar && tar -xf ch_PP-OCRv3_det_infer.tar
# 下載并解壓 OCR 文本識(shí)別模型
[root@localhost pdserving]# wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_rec_infer.tar -O ch_PP-OCRv3_rec_infer.tar && tar -xf ch_PP-OCRv3_rec_infer.tar
# 降級(jí),否則轉(zhuǎn)換模型會(huì)報(bào)錯(cuò),-> ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with OpenSSL 1.0.2k-fips 26 Jan 2017
[root@localhost pdserving]# pip install urllib3==1.25.6 -i https://pypi.tuna.tsinghua.edu.cn/simple --verbose
[root@localhost pdserving]# pip show urllib3
Name: urllib3
Version: 1.25.6
接下來(lái),用安裝的paddle_serving_client把下載的inference模型轉(zhuǎn)換成易于server部署的模型格式。
# 轉(zhuǎn)換檢測(cè)模型
[root@localhost pdserving]# python -m paddle_serving_client.convert --dirname ./ch_PP-OCRv3_det_infer/ \
--model_filename inference.pdmodel \
--params_filename inference.pdiparams \
--serving_server ./ppocr_det_v3_serving/ \
--serving_client ./ppocr_det_v3_client/
# 轉(zhuǎn)換識(shí)別模型
[root@localhost pdserving]# python -m paddle_serving_client.convert --dirname ./ch_PP-OCRv3_rec_infer/ \
--model_filename inference.pdmodel \
--params_filename inference.pdiparams \
--serving_server ./ppocr_rec_v3_serving/ \
--serving_client ./ppocr_rec_v3_client/
# 安裝 tree 工具
[root@localhost pdserving]# yum -y install tree
# 查看文件夾
[root@localhost pdserving]# tree -h *_client *_serving
ppocr_det_v3_client
├── [ 214] serving_client_conf.prototxt
└── [ 56] serving_client_conf.stream.prototxt
ppocr_rec_v3_client
├── [ 229] serving_client_conf.prototxt
└── [ 59] serving_client_conf.stream.prototxt
ppocr_det_v3_serving
├── [2.3M] inference.pdiparams
├── [1.3M] inference.pdmodel
├── [ 214] serving_server_conf.prototxt
└── [ 56] serving_server_conf.stream.prototxt
ppocr_rec_v3_serving
├── [ 10M] inference.pdiparams
├── [1.2M] inference.pdmodel
├── [ 229] serving_server_conf.prototxt
└── [ 59] serving_server_conf.stream.prototxt
0 directories, 12 files
[root@localhost pdserving]#
檢測(cè)模型轉(zhuǎn)換完成后,會(huì)在當(dāng)前文件夾多出ppocr_det_v3_serving 和ppocr_det_v3_client的文件夾,具備如下格式:
|- ppocr_det_v3_serving/
|- __model__
|- __params__
|- serving_server_conf.prototxt
|- serving_server_conf.stream.prototxt
|- ppocr_det_v3_client
|- serving_client_conf.prototxt
|- serving_client_conf.stream.prototxt
Paddle Serving pipeline部署
確認(rèn)工作目錄下文件結(jié)構(gòu):
注意: 將PaddleOCR/deploy/pdserving/config.yml文件中的兩個(gè)model_config字段,對(duì)應(yīng)模型轉(zhuǎn)換的文件夾。
pdserver目錄包含啟動(dòng)pipeline服務(wù)和發(fā)送預(yù)測(cè)請(qǐng)求的代碼,包括:
__init__.py
config.yml # 啟動(dòng)服務(wù)的配置文件
ocr_reader.py # OCR模型預(yù)處理和后處理的代碼實(shí)現(xiàn)
pipeline_http_client.py # 發(fā)送pipeline預(yù)測(cè)請(qǐng)求的腳本
web_service.py # 啟動(dòng)pipeline服務(wù)端的腳本
啟動(dòng)服務(wù)可運(yùn)行如下命令:
[root@localhost pdserving]# cd /opt/PaddleOCR/deploy/pdserving/
# 如果報(bào)錯(cuò),執(zhí)行 ImportError: libGL.so.1: cannot open shared object file: No such file or directory
[root@localhost pdserving]# yum -y install libGL
# 啟動(dòng)服務(wù),運(yùn)行日志保存在log.txt
[root@localhost pdserving]# nohup python web_service.py --config=config.yml &>log.txt &
[root@localhost pdserving]# tail -f ./log.txt
成功啟動(dòng)服務(wù)后,log.txt中會(huì)打印類似如下日志
測(cè)試
Python發(fā)送服務(wù)請(qǐng)求:
[root@localhost PaddleOCR]# cd /opt/PaddleOCR/deploy/pdserving/
[root@localhost pdserving]# python pipeline_http_client.py
**********../../doc/imgs/00006737.jpg**********
erro_no:0, err_msg:
('登機(jī)牌', 0.98663443), [[156.0, 27.0], [353.0, 24.0], [354.0, 67.0], [157.0, 70.0]]
('BOARDING PASS', 0.92134), [[422.0, 23.0], [819.0, 15.0], [820.0, 55.0], [423.0, 63.0]]
('序號(hào)SERIALNO.', 0.90068984), [[490.0, 103.0], [663.0, 101.0], [663.0, 120.0], [490.0, 122.0]]
('CLASS', 0.9126972), [[398.0, 106.0], [455.0, 104.0], [456.0, 122.0], [399.0, 124.0]]
('艙位', 0.997319), [[343.0, 107.0], [385.0, 107.0], [385.0, 125.0], [343.0, 125.0]]
('日期 DATE', 0.8522339), [[213.0, 108.0], [317.0, 107.0], [317.0, 127.0], [213.0, 128.0]]
('座位號(hào)SEAT NO', 0.9227149), [[677.0, 99.0], [833.0, 96.0], [833.0, 116.0], [677.0, 119.0]]
('航班 FLIGHT', 0.9386937), [[64.0, 112.0], [191.0, 108.0], [191.0, 128.0], [64.0, 132.0]]
('W', 0.818372), [[406.0, 132.0], [430.0, 132.0], [430.0, 157.0], [406.0, 157.0]]
('035', 0.881623), [[511.0, 130.0], [567.0, 130.0], [567.0, 155.0], [511.0, 155.0]]
('O3DEC', 0.96435463), [[233.0, 138.0], [325.0, 136.0], [325.0, 157.0], [233.0, 159.0]]
('MU2379', 0.99732345), [[83.0, 140.0], [212.0, 137.0], [212.0, 160.0], [83.0, 162.0]]
('登機(jī)口', 0.82893676), [[489.0, 174.0], [553.0, 173.0], [553.0, 193.0], [490.0, 195.0]]
('GATE', 0.99797326), [[566.0, 174.0], [612.0, 172.0], [613.0, 190.0], [567.0, 192.0]]
('始發(fā)地', 0.9969302), [[343.0, 175.0], [409.0, 174.0], [410.0, 194.0], [344.0, 196.0]]
('FROM', 0.9880336), [[404.0, 175.0], [468.0, 175.0], [468.0, 193.0], [404.0, 193.0]]
('登機(jī)時(shí)間BDT', 0.96257985), [[678.0, 170.0], [810.0, 168.0], [810.0, 188.0], [678.0, 190.0]]
('目的地TO', 0.93609524), [[67.0, 181.0], [168.0, 178.0], [168.0, 198.0], [68.0, 202.0]]
('福州', 0.99901855), [[97.0, 207.0], [167.0, 206.0], [168.0, 227.0], [98.0, 229.0]]
('TAIYUAN', 0.950216), [[338.0, 219.0], [473.0, 216.0], [473.0, 235.0], [338.0, 239.0]]
('G11', 0.6856508), [[505.0, 214.0], [553.0, 214.0], [553.0, 235.0], [505.0, 235.0]]
('FUZHOU', 0.9885346), [[91.0, 231.0], [201.0, 227.0], [202.0, 248.0], [91.0, 251.0]]
('身份識(shí)別ID NO', 0.89463985), [[345.0, 240.0], [482.0, 236.0], [482.0, 256.0], [345.0, 259.0]]
('姓名NAME', 0.974122), [[67.0, 251.0], [172.0, 249.0], [172.0, 268.0], [67.0, 270.0]]
('ZHANGQIWET', 0.89279824), [[77.0, 278.0], [262.0, 274.0], [262.0, 294.0], [77.0, 297.0]]
('票號(hào) TKTNO', 0.92473453), [[462.0, 297.0], [578.0, 295.0], [578.0, 315.0], [462.0, 317.0]]
('張祺偉', 0.9672684), [[103.0, 313.0], [208.0, 311.0], [208.0, 334.0], [103.0, 336.0]]
('票價(jià)FARE', 0.9370956), [[70.0, 344.0], [164.0, 341.0], [165.0, 362.0], [70.0, 364.0]]
('ETKT7813699238489/1', 0.9605237), [[346.0, 349.0], [660.0, 347.0], [660.0, 366.0], [346.0, 368.0]]
Postman 發(fā)送請(qǐng)求
Python 讀取圖片 轉(zhuǎn) base64 并生成 JSON
import json
import base64
img_path = r'D:\OpenSource\PaddleOCR-release-2.6\doc\imgs\00006737.jpg';
with open(img_path, 'rb') as file:
image_data1 = file.read()
image = base64.b64encode(image_data1).decode('utf8')
data = {"key": ["image"], "value": [image]}
# 轉(zhuǎn)成 json 字符串
json_str = json.dumps(data)
print(json_str)
{"key": ["image"], "value": ["image base64"]}
將生成的 json - 圖片base64,復(fù)制到 Postman 中執(zhí)行如下
參數(shù)調(diào)整
調(diào)整 config.yml 中的并發(fā)個(gè)數(shù)獲得最大的QPS, 一般檢測(cè)和識(shí)別的并發(fā)數(shù)為2:1
det:
#并發(fā)數(shù),is_thread_op=True時(shí),為線程并發(fā);否則為進(jìn)程并發(fā)
concurrency: 8
...
rec:
#并發(fā)數(shù),is_thread_op=True時(shí),為線程并發(fā);否則為進(jìn)程并發(fā)
concurrency: 4
...
預(yù)測(cè)性能數(shù)據(jù)會(huì)被自動(dòng)寫入 PipelineServingLogs/pipeline.tracer
文件中。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-465531.html
參考:https://gitee.com/paddlepaddle/PaddleOCR/tree/release/2.6/deploy/pdserving文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-465531.html
到了這里,關(guān)于百度飛槳(PaddlePaddle) - PP-OCRv3 文字檢測(cè)識(shí)別系統(tǒng) 基于 Paddle Serving快速使用(服務(wù)化部署 - CentOS 7)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!