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 blog和TF Serving Tutorial:
docker pull tensorflow /服务
docker run -p 8501:8501 --name NNN --mount 类型=绑定,源= SSS,目标= TTT -e MODEL_NAME = MMM -t tensorflow /服务&
如果可以确认,我将很高兴
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发行说明所述,有一种方法可以实际服务于模型。我很乐意完成此操作。
答案 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的怀疑