FAILED_PRECONDITION:错误:SavedModel目录gs:// mybucket1 /预计只包含[saved_model.pb,saved_model.pbtxt]

时间:2017-09-12 06:51:06

标签: python machine-learning google-cloud-platform google-cloud-ml google-cloud-ml-engine

我正在尝试使用谷歌云平台部署模型来支持预测。

我使用以下指令训练模型(本地)

    ~/$ 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'格式保存的模型

my-bucket-image

最后,我添加了一段代码,我将模型保存在存储桶中。

  regressor = tf.estimator.DNNRegressor(feature_columns=feature_columns,
                                    hidden_units=[40, 30, 20],
                                    model_dir="gs://my-bucket1/test2",
                                    optimizer='RMSProp'
                                    )

2 个答案:

答案 0 :(得分:2)

您会注意到屏幕截图中的文件为graph.pbtxt,而需要saved_model.pb{txt}

请注意,仅重命名文件通常是不够的。如果重新启动并且需要恢复,训练过程会定期输出检查点。但是,这些检查点(和相应的图表)是 training 图表。训练图往往包含文件阅读器,输入队列,丢失层等不适合服务的内容。

相反,TensorFlow要求您明确导出单独的图表以供服务。您可以通过以下两种方式之一完成此操作:

  1. 培训期间(通常在培训结束后)
  2. 作为训练后的单独过程。
  3. 训练期间/之后

    为此,我将推荐您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)

我在这里有同样的错误信息,在我的情况下有两个问题:

  1. 带有拼写错误的存储分区的路径
  2. 错误的saved_file.pbtxt(第一条错误消息我将另一个重命名的.pbtxt文件与我的模型类放在同一个存储桶中,这使得问题在修正路径后仍然存在)
  3. 删除错误的文件并更正路径后,该命令有效。 我希望这也有帮助。