Tensorflow 1.12 release notes表示:"Keras models can now be directly exported to the SavedModel format(tf.contrib.saved_model.save_keras_model()) and used with Tensorflow Serving" . 所以我试了一下 -
我使用单行导出了一个简单的模型 . 但是,Tensorflow服务无法识别模型 . 我想问题出在docker调用上,并且可能在模型定义中缺少'signature_defs' . 我会感谢有关缺失步骤的信息 .
1. Training and exporting the model to TF serving :
这是基于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. Setting up Tensorflow Server :
服务器可以通过docker或自己的构建来设置 . TF建议使用泊坞窗(TF ref) . 在此之后,基于TF blog和TF Serving Tutorial:
-
安装Docker(来自here)
-
获取最新的TF服务版本:
docker pull tensorflow / serving
- 使用此模型激活TF服务(TF ref):
docker run -p 8501:8501 --name NNN --mount type = bind,source = SSS,target = TTT -e MODEL_NAME = MMM -t tensorflow / serving&
如果有人能证实,我会很高兴:
-
NNN - 泊坞窗容器名称 - 例如,用于终止进程 . 它可以任意设置(例如:mydocker) .
-
MMM - 模型的名称,似乎是任意设置的 .
-
SSS - 模型所在的文件夹,完整路径 .
-
TTT - What should be this set to ?
3. the client
服务器可以通过gRPC或RESTful API获取请求 . 假设我们使用RESTful API,可以使用curl(here is a TF example)访问模型 . 但是我们如何设置模型的输入/输出? SignatureDefs需要(ref)吗?
All in all ,而"Keras models can now be directly exported to the SavedModel format(tf.contrib.saved_model.save_keras_model()) and used with Tensorflow Serving",如TF1.12发行说明中所述,有一种方法可以实际为模型服务 . 我很乐意完成这个想法 .
2 回答
感谢您提出的问题,或多或少与我的问题有关tensorflow-serving signature for an XOR
我完全补充你对TTT的怀疑
你对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,那么就没有必要进行服务 .