|一键启动在线推理服务,轻松实现在线部署,这有个「炼丹」利器( 三 )


本例将部署图像分割的 RPC 服务 , RPC 服务与前面的 Web 服务相比 , 对于用户来说最大的差异是要编写客户端脚本 , 通过客户端脚本来使用推理服务 。 而对于服务端来说 , 同样只需要一条命令就可以启动服务 。 下面我们来介绍具体的实现过程 。
1. 获取示例模型文件
使用 paddle-serving-app 下载图像分割模型示例文件 。
python -m paddle_serving_app.package --get deeplabv3+cityscapestar xf deeplabv3+cityscapes.tar.gz
解压后将会生成服务端和客户端的部署文件 seg_server_conf 和 seg_client_conf 。 其中 seg_server_conf 是在服务端使用 , 而 seg_client_conf 需要转存到客户端使用 。
2. 启动推理服务
使用如下命令启动图像分割在线服务 , 服务端口号为 9393 。
python -m paddle_serving_server_gpu.serve --model seg_server_conf --port 9393 --gpu_ids 0
3. 启动客户端
本示例中 , 需要对图像做预处理和后处理 , 这是因为图像在输入到模型网络之前需要经过预处理将原始图像进行尺寸的转换 , 变成 numpy.array 格式的像素值矩阵 。 而模型的输出是一个矩阵 , 矩阵值可以标记不同的区域 , 但是并不直观 。 需要经过后处理来将推理结果可视化 , 即将矩阵转化为图片 。
上述预处理和后处理操作 , 将会通过少量代码在客户端调用 paddle-serving-app 来实现 。 图像分割服务客户端代码(Seg_Client.py)如下:
from paddle_serving_client import Client# 从app模块中获取图像预处理方法from paddle_serving_app.reader import Sequential, File2Image, Resize, SegPostprocessimport sysimport cv2# 创建客户端client = Client()# 加载客户端的配置文件client.load_client_config(''seg_client_conf/serving_client_conf.prototxt'')# 连接服务 , X.X.X.X为服务端的地址client.connect([''X.X.X.X:9393''])# 图像预处理 , 从文件中读取图像 , 统一图像尺寸为512*512并做像素插值preprocess = Sequential( [File2Image(), Resize( (512, 512), interpolation=cv2.INTER_LINEAR)])# 分割任务的后处理算子 , 参数为训练时的分割类别数 , 本例为19类分割postprocess = SegPostprocess(19) # 在线预估filename = ''munster.png''im = preprocess(filename)fetch_map = client.predict(feed={''image'': im}, fetch=[''arg_max_0.tmp_0''])fetch_map[''filename''] = filename# 图像后处理postprocess(fetch_map)
用户可以在自己的电脑上执行下面的命令来调用 Seg_Client.py 脚本使用推理服务 。
python Seg_Client.py
推理成功后会在当前目录生成一张图像分割结果图片 。
原始图像:
|一键启动在线推理服务,轻松实现在线部署,这有个「炼丹」利器
本文插图

后处理后的推理结果图像:
|一键启动在线推理服务,轻松实现在线部署,这有个「炼丹」利器
本文插图

部署中文情感分析服务
情感分析任务是对于一条中文语句 , 来判断这条语句的情感属于积极还是消极 , 如下图所示 。
|一键启动在线推理服务,轻松实现在线部署,这有个「炼丹」利器
本文插图

本示例任务的整体流程如下图所示 , 原始的语句会进行多次预处理 , 并且待分析句子将会通过 LAC 模型进行切词处理 , 然后将切词的结果交给 Senta 模型做情感分析推理 , 总之 , 我们可以把使用 Senta 模型推理之前的部分都看做 Senta 模型输入数据的预处理 。
|一键启动在线推理服务,轻松实现在线部署,这有个「炼丹」利器
本文插图

本例将使用 Web 服务的形式进行部署 。 在部署 Web 服务的场景中 , 上述数据预处理操作都会在服务端通过编写脚本实现 。 具体操作步骤如下所示:


推荐阅读