我正在尝试使用谷歌云平台部署模型来支持预测。
我使用以下指令训练模型(本地)
~/$ gcloud ml-engine local train --module-name trainer.task --package-path trainer
一切正常(...):
INFO:tensorflow:Restoring parameters from gs://my-bucket1/test2/model.ckpt-45000
INFO:tensorflow:Saving checkpoints for 45001 into gs://my-bucket1/test2/model.ckpt.
INFO:tensorflow:loss = 17471.6, step = 45001
[...]
Loss: 144278.046875
average_loss: 1453.68
global_step: 50000
loss: 144278.0
INFO:tensorflow:Restoring parameters from gs://my-bucket1/test2/model.ckpt-50000
Mean Square Error of Test Set = 593.1018482
但是,当我运行以下命令来创建版本时,
gcloud ml-engine versions create Mo1 --model mod1 --origin gs://my-bucket1/test2/ --runtime-version 1.3
然后我收到以下错误。
ERROR: (gcloud.ml-engine.versions.create) FAILED_PRECONDITION: Field: version.deployment_uri
Error: SavedModel directory gs://my-bucket1/test2/ is expected to contain exactly one
of: [saved_model.pb, saved_model.pbtxt].- '@type': type.googleapis.com/google.rpc.BadRequest
fieldViolations:- description: 'SavedModel directory gs://my-bucket1/test2/ is expected
to contain exactly one of: [saved_model.pb, saved_model.pbtxt].'
field: version.deployment_uri
这是我的水桶的截图。我有一个'pbtxt'格式保存的模型
最后,我添加了一段代码,我将模型保存在存储桶中。
regressor = tf.estimator.DNNRegressor(feature_columns=feature_columns,
hidden_units=[40, 30, 20],
model_dir="gs://my-bucket1/test2",
optimizer='RMSProp'
)
答案 0 :(得分:2)
您会注意到屏幕截图中的文件为graph.pbtxt
,而需要saved_model.pb{txt}
。
请注意,仅重命名文件通常是不够的。如果重新启动并且需要恢复,训练过程会定期输出检查点。但是,这些检查点(和相应的图表)是 training 图表。训练图往往包含文件阅读器,输入队列,丢失层等不适合服务的内容。
相反,TensorFlow要求您明确导出单独的图表以供服务。您可以通过以下两种方式之一完成此操作:
训练期间/之后
为此,我将推荐您Census sample。
首先,您需要一个"服务输入功能",例如
def serving_input_fn():
"""Build the serving inputs."""
inputs = {}
for feat in INPUT_COLUMNS:
inputs[feat.name] = tf.placeholder(shape=[None], dtype=feat.dtype)
features = {
key: tf.expand_dims(tensor, -1)
for key, tensor in inputs.iteritems()
}
return tf.contrib.learn.InputFnOps(features, None, inputs)
您可以简单地致电:
regressor.export_savedmodel("path/to/model", serving_input_fn)
或者,如果您正在使用learn_runner
/ Experiment
,则需要将以下ExportStrategy
传递给Experiment
的构造函数:
export_strategies=[saved_model_export_utils.make_export_strategy(
serving_input_fn,
exports_to_keep=1,
default_output_alternative_key=None,
)]
培训后
几乎与上面完全相同的步骤,但只是在一个单独的Python脚本中,您可以在训练结束后运行(在您的情况下,这是有益的,因为您不必重新训练)。基本思想是构建Estimator
,使用培训中使用的model_dir
,然后按上述方式调用导出,如:
def serving_input_fn():
"""Build the serving inputs."""
inputs = {}
for feat in INPUT_COLUMNS:
inputs[feat.name] = tf.placeholder(shape=[None], dtype=feat.dtype)
features = {
key: tf.expand_dims(tensor, -1)
for key, tensor in inputs.iteritems()
}
return tf.contrib.learn.InputFnOps(features, None, inputs)
regressor = tf.contrib.learn.DNNRegressor(
feature_columns=feature_columns,
hidden_units=[40, 30, 20],
model_dir="gs://my-bucket1/test2",
optimizer='RMSProp'
)
regressor.export_savedmodel("my_model", serving_input_fn)
编辑09/12/2017
您的培训代码需要稍微改动一下。您正在使用tf.estimator.DNNRegressor
,但这是在TensorFlow 1.3中引入的; CloudML Engine仅正式支持TensorFlow 1.2,因此您需要使用tf.contrib.learn.DNNRegressor
。它们非常相似,但一个显着的区别是您需要使用fit
方法而不是train
。
答案 1 :(得分:0)
我在这里有同样的错误信息,在我的情况下有两个问题:
删除错误的文件并更正路径后,该命令有效。 我希望这也有帮助。