使用Tensorflow服务为Keras模型提供服务

时间:2018-11-19 00:12:35

标签: python tensorflow keras tensorflow-serving

Tensorflow 1.12 release notes指出:“现在可以将Keras模型直接导出为SavedModel格式(tf.contrib.saved_model.save_keras_model()),并与Tensorflow服务一起使用”。。所以我试了一下-

我使用单行用此op导出了一个简单模型。但是,Tensorflow服务无法识别该模型。我猜问题出在docker调用上,也许是模型定义中缺少'signature_defs'。感谢您提供有关缺少的步骤的信息。

1。训练模型并将其导出到TF服务

这是基于杰森·布朗利(Jason Brownlee)的first NN(由于其简单性而选择)的代码

(作为简短CSV文件的培训数据为here):

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.contrib.saved_model import save_keras_model
import numpy

# fix random seed for reproducibility
numpy.random.seed(7)

# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]

# create model
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# Fit the model
model.fit(X, Y, epochs=150, batch_size=10)

# evaluate the model
scores = model.evaluate(X, Y)
print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))

# calculate predictions
predictions = model.predict(X)
# round predictions
rounded = [round(x[0]) for x in predictions]
print(rounded)

# Save the model for serving
path = '/TensorFlow_Models/Keras_serving/saved_model' # full path of where to save the model
save_keras_model(model, path)

2。设置Tensorflow服务器

可以通过docker或自己的构建来设置服务器。 TF建议使用docker(TF ref)。接下来,并基于TF blogTF Serving Tutorial

  1. here安装Docker
  2. 获取最新的TF服务版本:
  

docker pull tensorflow /服务

  1. 使用此模型(TF ref)激活TF服务:
  

docker run -p 8501:8501 --name NNN --mount   类型=绑定,源= SSS,目标= TTT -e MODEL_NAME = MMM -t   tensorflow /服务&

如果可以确认,我将很高兴

  • NNN-docker容器名称-例如,用于 杀死进程。可以任意设置(例如:mydocker)。
  • MMM-模型的名称,似乎可以任意设置。
  • SSS-模型所在的文件夹,完整路径。
  • TTT-该设置为什么?

3。客户

服务器可以通过gRPC或RESTful API获取请求。假设我们使用RESTful API,则可以使用curl(here is a TF example)访问模型。但是我们如何设置模型的输入/输出呢?是否需要SignatureDefs(ref)?

全部,而“ Keras模型现在可以直接导出为SavedModel格式(tf.contrib.saved_model.save_keras_model()并与Tensorflow服务一起使用” ,如TF1.12发行说明所述,有一种方法可以实际服务于模型。我很乐意完成此操作。

3 个答案:

答案 0 :(得分:2)

您对NNN和SSS都是正确的。 NNN可以是任意的,如果未指定,则docker将为其赋予一个随机名称。

对于MMM,最好给它起一个有意义的名字。

对于TTT,这是关于docker run命令的常规信息,您可以参考docker doc。这是您在容器内映射(绑定)SSS的位置,通常将其设置为/models/$MODEL_NAME。如果进入此容器并打开/models/$MODEL_NAME,您将看到与SSS中相同的版本文件夹。

RESTful API的输入与TensorFlow代码中模型的输入相同,在您的示例中为X = dataset[:,0:8]

如果您在保存the example in doc之类的模型时未定义签名,则无需提供服务。

答案 1 :(得分:1)

如果要使用Keras开箱即用创建API端点服务器。我建议您检查BentoML(https://github.com/bentoml/bentoml)。

这是一个开放源代码python库,可简化在云中服务和部署机器学习模型的过程。 披露:我是BentoML的创建者之一

以下是使用BentoML(https://github.com/bentoml/gallery/blob/master/keras/fashion-mnist/keras-fashion-mnist.ipynb)的Keras模型的示例

只需几行代码,您就可以将模型,预处理代码和依赖项打包成标准化的格式,从而可以分发到不同的格式(Docker,CLI工具,Spark UDF等)并将其部署到不同的云平台(Sagemaker) ,Lambda,Kubernetes)

在Jupyter笔记本中完成模型训练之后。您可以添加BentoService规范以标准化捆绑包格式创建模型

%%writefile my_model.py

from bentoml import api, artifacts, env, BentoService
from bentoml.artifact import KerasModelArtifact
from bentoml.handlers import DataframeHandler

@env(pip_dependencies=['keras', 'tensorflow==1.14.0'])
@artifacts([KerasModelArtifact('model')])
class KerasModelService(BentoService):

    @api(DataframHandler)
    def predict(self, df):
        return self.artifacts.model.predict(df)

在下一个单元格中,您可以打包模型并保存。

# 1) import the custom BentoService defined above
from my_model import KerasModelService

# 2) `pack` it with required artifacts
keras_svc = KerasModelService.pack(model=model)

# 3) save your BentoSerivce to file archive
saved_path = keras_svc.save()

这些将打包您的模型,预处理代码,依赖关系,并为您生成Dockerfile和其他文件。

使用此捆绑包,您可以轻松启动具有REST API端点的Docker容器。

cd saved_path && docker build -t keras-model .

如有任何疑问,请随时与我联系。

答案 2 :(得分:0)

谢谢您的提问,或多或少与我有关 tensorflow-serving signature for an XOR

我确切地添加了您对TTT的怀疑