Kindle君 2018-09-13
机器学习中最有趣(也很有趣)的部分是利用你花时间训练的模型。虽然有很多关于如何训练模型的资源,但我们经常发现很难弄清楚如何部署使用训练模型进行推理的系统(即进行预测)。TFServe是一个框架,旨在通过HTTP服务器以简单方便的方式为tensorflow模型提供服务。
TFServe是一个建立在apistar之上的微框架。要安装它,只需运行:
$ pip install tfserve
让我们从这个常见的场景开始。在ImageNet上谷歌为图像分类训练了一个Tensorflow Inception CNN 模型。您希望构建一个使用此模型进行推理的HTTP服务。
从描述中可以看出,这个模型接收224x224的RGB图像,并返回最可能的类(来自ImageNet中可用的1000个类)。下载模型,得到一frozen_graph.pb(或类似)文件。
现在怎么办呢?这就是tfserve发挥作用的地方:
你需要5个部分:
输入和输出张量名称
您可能知道,每个tensorflow graph张量都由唯一名称标识。创建图时会声明此名称。您需要指定tfserve输入张量的名称。输出张量也是如此。
但我从一些Tensorflow回购下载了这个模型,我不知道输入/输出张量名称!
只需使用 tfserve.helper.estimate_io_tensors函数来了解可能的i / o张量供您选择。
例如,
> import tfserve import helper > helper.estimate_io_tensors("frozen_model.pb") Possible INPUT tensors: import/img:0 Possible OUTPUT tensors: pred/out:0 pred/softmax_out:0
编码函数
实现接收HTTP请求正文数据的函数,并将dict映射输入张量名称输出到输入numpy值。
在图像分类示例之后,该encode函数将接收HTTP请求正文中提供的二进制数据,并应将dict映射“ import/img:0” 输出到224x224归一化的RGB numpy图像,Python代码如下:
def encode(request_data): with tempfile.NamedTemporaryFile(mode="wb", suffix=".jpg") as f: f.write(request_data) img = PIL.Image.open(f.name).resize((224, 224)) img = np.asarray(img) / 255. return {"import/img:0": img}
解码函数
实现一个函数,该函数接收dict映射输出张量名称以输出numpy值并返回HTTP响应。
在图像分类示例之后,该decode函数将接收到具有类概率的1000大小数组的dict映射pred/softmax_out:0。我希望返回一个JSON对象,如:
{ class: "german shepard", prob: 0.98, }
其中包含有关最可能的类的信息。
然后,decode函数将是,Python代码如下:
def decode(outputs): p = outputs["pred/softmax_out:0"] index = np.argmax(p) return { "class": index_to_class_name(index), "prob": float(p[index]) }
运行服务器
您现在可以运行提供上述所有5个部分的服务器(模型路径,输入张量,输出张量encode和decode函数),python示例如下:
from tfserve import TFServeApp app = TFServeApp("frozen_graph.pb", ["import/img:0"], ["pred/softmax_out:0"], encode, decode) app.run('127.0.0.1', 5000, debug=True)
服务器将在127.0.0.1:5000启动并运行。为了运行模型,您应该将POST请求发送到/并将二进制映像作为请求体。您应该在decode函数中实现JSON响应。
您可以在请求正文中提供任何类型的数据。您只需要在encode函数中正确处理它,以便为图形的输入张量提供信息。
此外,您可以在HTTP响应中返回任何类型的数据(除了JSON对象,它可能包含带有分段信息的二进制图像)。您只需要在decode函数中构建响应。
使用tfserve,运行tensorflow训练模型非常简单容易。只需提供模型路径,输入/输出张量名称,将encode请求数据转换为输入张量的decode函数以及将输出张量转换为响应的函数。tfserve将处理其余的事情。