飞桨模型保存_飞桨实战笔记:自编写模型如何在服务器和移动端部署

如果你对经典的CNN模型比较熟悉的话,那么SSD也并不难理解。SSD大体上来说是将图片分为6种不同大小的 格,找到目标中心的落点,确定物体的位置。在分成不同 格之后,会在此之上取到不同数目的先验框,对先验框进行回归、分类预测。先验框的数目足够多,几乎能够涵盖整个图片,因此我们可以找到包含物体的很多个先验框,最后进行非极大抑制就能得到正确结果。

?

通过一个表格我们能够知道我们从不同层中得到的先验框尺寸和数目:

?

需要注意的是Paddle Serving目前不支持arm64架构,并且对一些依赖包的版本有要求,所以强烈建议使用Docker进行部署。

首先我们pull到Docker 镜像:

# Run CPU Docker

docker pull hub.baidubce.com/paddlepaddle/serving:0.2.0

docker run -p 9292:9292 –name test -dit hub.baidubce.com/paddlepaddle/serving:0.2.0

docker exec -it test bash

# Run GPU Docker

nvidia-docker pull hub.baidubce.com/paddlepaddle/serving:0.2.0-gpu

nvidia-docker run -p 9292:9292 –name test -dit hub.baidubce.com/paddlepaddle/serving:0.2.0-gpu

nvidia-docker exec -it test bash

进入容器之后,由于官方缩减了镜像的大小,我们需要手动安装需要的依赖包:

python3 -m pip install paddle_serving_server sentencepiece opencv-python pillow -i https://pypi.tuna.tsinghua.edu.cn/simple

镜像使用的系统是Centos 7,注意直接运行Python的话指向的是Python 2.7.5,你需要使用python3。(Python 2即将停止维护,pip在后续版本也可能不提供支持)。

Paddle Serving与直接利用模型不同的是,除了需要导出inference model以外还需要生成配置文件,定义Feed和Fetch的内容。如果你非常熟悉保存预测模型的接口,那么这并不是一件难事。从零开始训练一个模型,并应用到Paddle Serving,你可以参考官方的端到端从训练到部署全流程

这里我们可以直接利用上文提到的AI Studio的开源项目进行提取,真正的提取代码仅需要两行:

import paddle_serving_client.io as serving_io

serving_io.save_model(

“ssd_model”,

“ssd_client_conf”,

{‘image’: img},

{“prediction”: box},

inference_program)

前两行定义了我们的模型和客户端配置文件保存位置,后面的两个dict分别表示feed和fetch的内容,官方文档的例子表示这是我们在训练模型时的输入和输出。这里的img和box即为输入 络的img和 络输出的box,我们看下两个的结构。

img:

name: “img”

type {

type: LOD_TENSOR

lod_tensor {

tensor {

data_type: FP32

dims: -1

dims: 3

dims: 300

dims: 300

}

lod_level: 0

}

}

persistable: false

box:

name: “concat_0.tmp_0”

type {

type: LOD_TENSOR

lod_tensor {

tensor {

data_type: FP32

dims: 1917

dims: 4

}

lod_level: 0

}

}

persistable: false

可以在保存预测模型的时候保存Paddle Serving需要的配置项,或者之后从训练的代码中提取出img和box,进行保存。得到Paddle Serving需要的相关文件之后,利用下面的代码将其部署到服务器上(均在容器内进行,保证生成的模型和客户端配置和服务器脚本在同一目录之下):

import os

import sys

import base64

import numpy as np

import importlib

from paddle_serving_app import ImageReader

from multiprocessing import freeze_support

from paddle_serving_server.web_service import WebService

class ImageService(WebService):

def preprocess(self, feed={}, fetch=[]):

reader = ImageReader(image_shape=[3, 300, 300],

image_mean=[0.5, 0.5, 0.5],

image_std=[0.5, 0.5, 0.5])

feed_batch = []

for ins in feed:

if “image” not in ins:

raise (“feed data error!”)

sample = base64.b64decode(ins[“image”])

img = reader.process_image(sample)

feed_batch.append({“image”: img})

return feed_batch, fetch

image_service = ImageService(name=”image”)

image_service.load_model_config(“./ssd_model/”)

image_service.prepare_server(

workdir=”./work”, port=int(9292), device=”cpu”)

image_service.run_server()

image_service.run_flask()

在代码中先对得到的image进行了resize,然后交给模型处理。这里使用的是CPU进行预测,需要的话可以修改几行代码使其能够在GPU上预测。使用Paddle Serving并不需要安装飞桨,所以不会对服务器造成负担。Paddle Serving内置了数据预处理功能,因此可以直接对图片进行裁剪等操作。

在客户端上,仅仅需要几行代码就能够从服务端获取预测结果:

import requests

import base64

import json

import time

import os

import sys

py_version = sys.version_info[0]

def predict(image_path, server):

if py_version == 2:

image = base64.b64encode(open(image_path).read())

else:

image = base64.b64encode(open(image_path, “rb”).read()).decode(“utf-8”)

req = json.dumps({“feed”: [{“image”: image}], “fetch”: [“prediction”]})

r = requests.post(

server, data=req, headers={“Content-Type”: “application/json”}, timeout=60)

try:

print(r.json()[“result”][“prediction”])

except ValueError:

print(r.text)

return r

if __name__ == “__main__”:

server = “http://[ip]:[port]/image/prediction”

image_list = os.listdir(“./images”)

start = time.time()

for img in image_list:

image_file = “./images/” + img

res = predict(image_file, server)

end = time.time()

print(end – start)

对图片进行base64编码,发送到服务端,获取结果,非常简洁和方便。在实际部署的过程中,可以在服务端进行反代和鉴权,只需要写一个中间件即可,这也是模型即服务带给大家的便利之处。

写在最后

从一开始熟悉怎么去使用飞桨深度学习平台,怎么让脚本跑起来,到现在开始逐步读懂论文,了解模型的架构,看官方文档,过程中遇到了不少问题。通过分析飞桨官方图像分类示例,查看和修改源码,输出调试信息,还在飞桨官方QQ群中得到了不少帮助,学到了很多东西,并最终完成了这次实践。非常感谢提供帮助的朋友们。飞桨经过多轮更新,在模型训练和部署上也变得非常简单,相信会吸引越来越多的开发者使用。

参考链接:

如果您加入官方QQ群,您将遇上大批志同道合的深度学习同学。飞桨PaddlePaddle交流3群:703252161。

如果您想详细了解更多飞桨的相关内容,请参阅以下文档。

官 地址:

飞桨开源框架项目地址:

GitHub:

Gitee:

相关资源:渣浆泵的计算机选型软件及应用.rar-制造文档类资源-CSDN文库

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年11月21日
下一篇 2020年11月21日

相关推荐