点击左上方蓝字关注我们
在深度学习的产业应用中,千万不要认为炼制出神丹就万事大吉了,企业还需要面临一个挑战,那就是大规模推理部署。对工业级部署而言,要求的条件往往非常繁多且苛刻,模型大小、业务应用、硬件性能等条件的差异,都会影响模型部署的方式。而理想的部署方式,往往会让推理的效率更高,AI赋能产业的落地更加事半功倍。
飞桨支持多种部署方式,包括高性能的服务器部署、多平台的端侧部署、网页端的web部署以及快捷的服务化部署,企业可以根据业务需求灵活选择。
Paddle Serving是飞桨服务化部署框架,为AI+落地的最后一公里提供专业、可靠、易用的服务。Paddle Serving 秉承模型即服务(Model As A Service,MAAS)的理念,让用户在使用飞桨框架成功完成模型训练的那一刻,收获的不再只是模型,而是同时拥有了该模型的推理服务。用户可以在短短的几分钟内,将模型迅速的转化为一个可以在服务器端部署的远程服务。
对企业而言,如果业务场景复杂,需要灵活的按需扩展,选择Paddle Serving进行部署就再正确不过。比如在IFAW与百度合作开发的“濒危动物AI守护者”项目中,利用AI技术升级传统的检测手段,模型的输入和输出更新频繁,使用Paddle Serving进行部署,短时间完成了从模型到远程服务的转化过程。
在全新的飞桨框架2.0 RC下,Paddle Serving 0.4.0版本有如下三点核心升级。
支持Pipeline Serving全异步设计的推理服务部署框架,实验证明,OCR任务的吞吐量提升1.5倍,GPU利用率提升1倍。
支持NVIDIA TensorRT高性能推理库,实现模型推理低延迟、高吞吐。
支持多系统、多语言客户端,覆盖更多的部署场景。
亮点一:支持Pipeline Serving全异步设计的的推理服务部署框架
在AI工业落地时,多个深度学习模型组合使用是解决现实问题的常规手段。以卡证识别任务为例,图文识别需要图像预处理、图像表示计算、文本切词、语义表示计算和匹配计算等多个模型共同使用。但多模型应用设计复杂,为了降低开发和维护难度,同时保证服务高可用,通常会采用串行或简单的并行方式,但此时延时仅达到可用状态,而GPU利用率偏低。
Pipeline Serving是一个全异步设计的推理服务部署框架,其Server端基于图执行引擎设计,能够并行处理同一阶段模型的计算,从而大大提升了GPU利用率,加快推理的效率。
如下图所示,图执行引擎由 OP 和 Channel 两部分构成,相连接的 OP 之间会共享一个 Channel。Request通过RPC方式将数据输入到图执行引擎(默认支持auto-batching),执行结果会返回给请求端。
默认情况下,OP根据输入的Channel数据,访问Paddle Serving 的单模型服务,并将结果存在输出的Channel中;OP也支持用户自定义,包括 preprocess,process,postprocess 三个函数都可以由用户继承和实现;RequestOp 和ResponseOp是用于处理 Pipeline Server RPC请求和返回结果的特殊OP。
Channel 是 OP 之间共享数据的数据结构,负责共享数据或者共享数据状态信息,可以理解为一个缓冲队列。用户只需要定义 OP 间的关系,在编译期,图引擎负责分析整个图的依赖关系,并自动生成Channel。
下图为图执行引擎中 Channel 的设计,采用 input buffer 和 output buffer 进行多 OP 输入或多 OP 输出的数据对齐,中间采用一个 Queue 进行缓冲。
图执行引擎采用异步IO的方式,能够支持大量并发的请求。在每个请求过程中,由于OP之间采用Channel共享数据,各个OP可以异步多线程/多进程并行处理请求。
以下图为例,用户的请求Request-1和Request-2可以由不同的入口OP实例OP-1 InstanceA和OP-1 InstanceB并行处理。OP-1节点处理完成后将数据输出到Channel中,OP-2节点(实例A/B)异步从Channel中获取数据处理后输出Response-1和Response-2。由于OP-1和OP-2并不是串行在一个进程/线程中,在OP-2节点还在处理时,OP-1的节点可同时处理新来的请求Request-3和Request-4,这样的设计大大提高了GPU利用率,使得推理的效率有一个大幅度的提升。
Pipeline Serving实验结论
OCR任务的实际推理效果如下图所示,在非Pipeline模式下,QPS最大为12,GPU利用率为30%;Pipeline模式下,在单GPU卡、进程Det=4、Rec=2、batch =1的情况下,QPS为29.6,吞吐量约为非Pipeline模式的 2.5倍,GPU利用率为60%,约为非Pipeline模式的2倍。后续随着batch、进程数量的逐步增加,吞吐量和GPU利用率还会有更大提升。
Pipeline Serving使用示例
Paddle Serving编译部署相关环境配置和操作请参见:
https://github.com/PaddlePaddle/Serving
本文默认在docker运行环境下,以IMDB模型的部署为例。用户可以通过修改Pipeline配置文件config.yml,设置DAG图引擎结构、OP节点和Channel等基本信息,相关示例在python/examples/pipeline。
目前Pipeline模型的部署支持两种模式:远端模式(RPC和HTTP)和本地模式(Local_Predictor)。
远端模式(RPC/HTTP)
1. 获取模型
cd python/examples/pipeline/imdb_model_ensemble
sh get_data.sh
2. 启动服务端
python -m paddle_serving_server_gpu.serve --model imdb_cnn_model --port 9292 &> cnn.log &
python -m paddle_serving_server_gpu.serve --model imdb_bow_model --port 9393 &> bow.log &
python test_pipeline_server.py &>pipeline.log &
3. 启动RPC客户端
python test_pipeline_client.py
4. HTTP推理
curl -X POST -k http://localhost:9999/prediction -d '{"key": ["words"], "value": ["i am very sad | 0"]}'
本地模式(Local_Predictor)
通过修改
python/examples/pipeline/imdb_model_ensemble/config.yml
文件中的“client_type”字段,切换本地和rpc模式,参考
python/examples/pipeline/ocr/config.yml的配置。
client_type: local_predictor
client_type: brpc
注意:本地推理方式config.yml文件中OP配置不能包含server_endpoints节点,且本地推理方式无须启动服务端。
亮点二:支持NVIDIA TensorRT高性能推理库,实现模型推理低延迟、高吞吐
在全新版本中,Paddle Serving支持使用NVIDIA TensorRT对模型推理进行加速。NVIDIA TensorRT是高性能的深度学习推理库,可为深度学习的推理应用程序提供低延迟、高吞吐量。飞桨采用子图的形式对TensorRT进行集成,从而提升模型的推理性能。
集成TensorRT版本编译方法请参见:
https://github.com/PaddlePaddle/Serving/blob/v0.4.0/doc/COMPILE_CN.md
使用TensorRT进行推理时,只需要启动PaddleServing服务时添加命令行参数--use_trt即可。以波士顿房价预测任务为例,使用TensorRT启动RPC推理服务的命令如下所示:
python -m paddle_serving_server.serve --model uci_housing_model --thread 10 --port 9292 –use_trt
亮点三:支持多平台、多语言客户端,提升使用便捷性
Paddle Serving目前支持在Linux/Windows/Mac上编译部署:
1) Linux
在原生Linux系统配置编译部署环境的详细步骤请参见:
https://github.com/PaddlePaddle/Serving/blob/develop/doc/COMPILE_CN.md
但飞桨更推荐开发者使用Docker编译,因为Docker中已经集成了Paddle Serving的编译环境。在Docker中运行的详细步骤请参见:
https://github.com/PaddlePaddle/Serving/blob/develop/doc/RUN_IN_DOCKER_CN.md
2)Windows
受限第三方库的支持,目前原生Windows系统只支持用web service的方式搭建local predictor推理服务,相关步骤请参考:
https://github.com/PaddlePaddle/Serving/blob/develop/doc/WINDOWS_TUTORIAL_CN.md
如果想体验全部的服务,需要使用Docker for Windows来模拟Linux的运行环境,部署步骤如下:
1. 安装Docker for Windows之后启动docker的linux engine,下载相关镜像。
docker pull hub.baidubce.com/paddlepaddle/serving:latest-devel
2. 启动docker。
docker run --rm -dit --name serving_devel -v $PWD:/Serving
hub.baidubce.com/paddlepaddle/serving:latest-devel
3. 进入docker环境。
其余操作与Linux系统下使用Docker编译部署方法完全一致。
docker exec -it serving_devel bash
cd /Serving
3)Mac
Mac系统目前需要使用Docker for Mac来模拟Linux的运行环境,部署步骤与Windows系统一致。
支持C++、Python、Java、Go多语言客户端
Paddle Serving支持包括C++、Python、Java、Go等多种语言。需要注意的是,多语言客户端要与多语言服务端配套使用,当前版本下(0.4.0),服务端需要将Server改为MultiLangServer(如果是以命令行启动的话,只需要添加--use_multilang参数)。
Java客户端参考文档:
https://github.com/PaddlePaddle/Serving/blob/develop/doc/JAVA_SDK_CN.md
Go客户端参考文档:
https://github.com/PaddlePaddle/Serving/blob/develop/doc/IMDB_GO_CLIENT_CN.md
以上三点就是Paddle Serving 0.4.0版本给开发者带来的全新升级。飞桨部署的研发工程师们期望能给开发者带来更加易用、更加丰富的部署方案,如果各位开发者对于飞桨部署有任何意见或建议,欢迎Issue联系我们,也可以STAR给我们多一些鼓励和支持。
Paddle Serving github地址:
https://github.com/PaddlePaddle/Serving
如在使用过程中有问题,可加入官方QQ群进行交流:1108045677。
如果您想详细了解更多飞桨的相关内容,请参阅以下文档。
·飞桨官网地址·
https://www.paddlepaddle.org.cn/
·飞桨开源框架项目地址·
GitHub: https://github.com/PaddlePaddle/Paddle
Gitee: https://gitee.com/paddlepaddle/Paddle
微信号 : PaddleOpenSource
飞桨(PaddlePaddle)以百度多年的深度学习技术研究和业务应用为基础,是中国首个开源开放、技术领先、功能完备的产业级深度学习平台,包括飞桨开源平台和飞桨企业版。飞桨开源平台包含核心框架、基础模型库、端到端开发套件与工具组件,持续开源核心能力,为产业、学术、科研创新提供基础底座。飞桨企业版基于飞桨开源平台,针对企业级需求增强了相应特性,包含零门槛AI开发平台EasyDL和全功能AI开发平台BML。EasyDL主要面向中小企业,提供零门槛、预置丰富网络和模型、便捷高效的开发平台;BML是为大型企业提供的功能全面、可灵活定制和被深度集成的开发平台。