【问题标题】:Serving a Keras model with Tensorflow Serving使用 Tensorflow Serving 为 Keras 模型提供服务
【发布时间】:2019-04-21 08:22:05
【问题描述】:

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

我已经使用单行导出了一个带有此操作的简单模型。但是,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. 安装 Docker(来自here
  2. 获取最新的 TF 服务版本:

docker 拉张量流/服务

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

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

如果有人能确认我会很高兴:

  • 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 Serving 一起使用”,正如 TF1.12 发行说明中所述,要真正为模型服务,还有一条路要走。我会很高兴有关于完成这个的想法。

【问题讨论】:

标签: python tensorflow keras tensorflow-serving


【解决方案1】:

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

我准确地补充了您对 TTT 的疑虑

【讨论】:

    【解决方案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,则在服务中不需要。

    【讨论】:

      【解决方案3】:

      如果您想使用开箱即用的 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 notebook 中完成模型训练后。您可以添加 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 .
      

      如果您有任何问题,请随时联系我。

      【讨论】:

        猜你喜欢
        • 2017-09-24
        • 2016-09-11
        • 2018-09-29
        • 1970-01-01
        • 2019-03-17
        • 2021-05-19
        • 1970-01-01
        • 2018-09-12
        • 2018-02-01
        相关资源
        最近更新 更多