Tensorflow不提供servable的任何版本<;模型>;在基本路径下找到

Tensorflow不提供servable的任何版本<;模型>;在基本路径下找到,tensorflow,deep-learning,object-detection,tensorflow-serving,Tensorflow,Deep Learning,Object Detection,Tensorflow Serving,我按照教程使用tensorflow服务使用我的对象检测模型。我正在使用生成模型。我使用exporter创建了一个冻结模型(生成的冻结模型使用python脚本工作) 冻结的图形目录包含以下内容(变量目录中没有任何内容) 变数/ 已保存的_model.pb 现在,当我尝试使用以下命令为模型提供服务时 tensorflow_model_server --port=9000 --model_name=ssd --model_base_path=/serving/ssd_frozen/ 它总是让我明白

我按照教程使用
tensorflow服务
使用我的对象检测模型。我正在使用生成模型。我使用exporter创建了一个冻结模型(生成的冻结模型使用python脚本工作)

冻结的图形目录包含以下内容(变量
目录中没有任何内容)

变数/

已保存的_model.pb

现在,当我尝试使用以下命令为模型提供服务时

tensorflow_model_server --port=9000 --model_name=ssd --model_base_path=/serving/ssd_frozen/
它总是让我明白

tensorflow_serving/model_servers/server_core.cc:421](重新)添加 型号:ssd 2017-08-07 10:22:43.892834:W tensorflow_服务/sources/storage_path/file_system_storage_path_source.cc:262] 在基本路径/服务/ssd\u下未找到可服务ssd的版本/ 2017-08-07 10:22:44.892901:W tensorflow_服务/sources/storage_path/file_system_storage_path_source.cc:262] 在基本路径/服务/ssd\u下未找到可服务ssd的版本/


我也有同样的问题,原因是对象检测api在导出检测模型时没有指定模型的版本。但是,tensorflow服务要求您分配检测模型的版本号,以便您可以选择不同版本的模型来提供服务。在您的情况下,您应该将检测模型(.pb文件和变量文件夹)放在以下文件夹下: /服务/ssd\u冻结/1/。这样,您将把模型分配给版本1,tensorflow服务将自动加载此版本,因为您只有一个版本。默认情况下,tensorflow服务将自动提供最新版本(即最大版本数)


注意,在您创建1/文件夹之后,仍然需要将model_base_path设置为--model_base_path=/serving/ssd_freezed/

对于tf serving的新版本,正如您所知,它不再支持SessionBundle导出的模型格式,而是现在保存的ModelBuilder

我认为最好从旧的模型格式恢复会话,然后通过SavedModelBuilder将其导出。您可以使用它指示模型的版本

    def export_saved_model(version, path, sess=None):
        tf.app.flags.DEFINE_integer('version', version, 'version number of the model.')
        tf.app.flags.DEFINE_string('work_dir', path, 'your older model  directory.')
        tf.app.flags.DEFINE_string('model_dir', '/tmp/model_name', 'saved model directory')
        FLAGS = tf.app.flags.FLAGS

        # you can give the session and export your model immediately after training 
        if not sess: 
            saver = tf.train.import_meta_graph(os.path.join(path, 'xxx.ckpt.meta'))
            saver.restore(sess, tf.train.latest_checkpoint(path))

        export_path = os.path.join(
            tf.compat.as_bytes(FLAGS.model_dir),
            tf.compat.as_bytes(str(FLAGS.version)))
        builder = tf.saved_model.builder.SavedModelBuilder(export_path)

        # define the signature def map here
        # ...

        legacy_init_op = tf.group(tf.tables_initializer(), name='legacy_init_op')
        builder.add_meta_graph_and_variables(
            sess, [tf.saved_model.tag_constants.SERVING],
            signature_def_map={
                'predict_xxx':
                    prediction_signature
            },
            legacy_init_op=legacy_init_op
        )

        builder.save()
        print('Export SavedModel!')
您可以在示例中找到上面代码的主要部分。 最后,它将以可以提供的格式生成SavedModel


在like-service/model\u name/0000123/saved\u model.pb下创建一个版本文件夹

上面的答案已经解释了为什么在model文件夹中保留版本号很重要。按照下面的链接,这里他们有不同的已建模型集,您可以将其作为参考


我是在运行Ubuntu的个人电脑上做这件事的,而不是在Docker上。注意,我在一个名为“服务”的目录中。这是我保存文件夹“mobile_weight”的地方。我必须创建一个新文件夹,“0000123”内的“手机重量”。我的路径看起来像服务->移动重量->0000123->(变量文件夹和保存的模型.pb)

tensorflow服务教程中的命令应该如下所示(更改模型名称和目录):

所以我的整个终端屏幕看起来像:

murage@murage-HP-Spectre-x360-Convertible:~/Desktop/serving$ nohup tensorflow_model_server   --rest_api_port=8501   --model_name=model_weight   --model_base_path=/home/murage/Desktop/serving/mobile_weight >server.log 2>&1

该错误消息也可能是由于
--volume
参数的问题而导致的

确保您的
--volume
装载实际上是正确的,并指向模型的dir,因为这是一个一般性的“模型未找到””错误,但它看起来更复杂

如果在windows上只使用
cmd
,否则很容易在cygwin或gitbash中意外使用linux文件路径和linux分隔符。即使使用正确的文件结构,如果不使用windows绝对路径,也可能出现OP错误

#using cygwin
$ echo $TESTDATA
/home/username/directory/serving/tensorflow_serving/servables/tensorflow/testdata

$ docker run -t --rm -p 8501:8501 -v "$TESTDATA/saved_model_half_plus_two_cpu:/models/half_plus_two" -e MODEL_NAME=half_plus_two tensorflow/serving
2021-01-22 20:12:28.995834: W tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc:267] No versions of servable half_plus_two found under base path /models/half_plus_two. Did you forget to name your leaf directory as a number (eg. '/1/')?
然后使用相同的未更改的文件结构调用相同的命令,但使用windows文件分隔符调用完整的windows路径,该命令可以工作:

#using cygwin
$ export TESTDATA="$(cygpath -w "/home/username/directory/serving/tensorflow_serving/servables/tensorflow/testdata")"
$ echo $TESTDATA
C:\Users\username\directory\serving\tensorflow_serving\servables\tensorflow\testdata

$ docker run -t --rm -p 8501:8501 -v "$TESTDATA\\saved_model_half_plus_two_cpu:/models/half_plus_two" -e MODEL_NAME=half_plus_two tensorflow/serving 
2021-01-22 21:10:49.527049: I tensorflow_serving/core/basic_manager.cc:740] Successfully reserved resources to load servable {name: half_plus_two version: 1}

我知道我在这个线程上要迟到了,但是您可以使用他的初始命令输出命令的预期完整值吗?谢谢@contractorwolf已经两年了,我想不起细节了,但我相信你们不需要对上面的命令做任何修改就可以让它正常工作。我还认为对象检测API应该解决这个问题。很抱歉没有帮到你。谢谢你的回复@xinyaowan我最终发现你的答案是正确的,但我没有完全理解,直到我像你建议的那样到处玩并创建了一个编号文件夹。然后它与上面的命令一起工作。非常感谢!如果你能解释为什么这样做会有帮助,这个答案的价值会大大增加:)例如,我可能会尝试一下,但仍然不知道为什么这样可以解决问题。上面的答案解释了为什么在model文件夹中保留版本号很重要。下面的链接,如果您将看到,每个模型都有类似00000123的版本
#using cygwin
$ export TESTDATA="$(cygpath -w "/home/username/directory/serving/tensorflow_serving/servables/tensorflow/testdata")"
$ echo $TESTDATA
C:\Users\username\directory\serving\tensorflow_serving\servables\tensorflow\testdata

$ docker run -t --rm -p 8501:8501 -v "$TESTDATA\\saved_model_half_plus_two_cpu:/models/half_plus_two" -e MODEL_NAME=half_plus_two tensorflow/serving 
2021-01-22 21:10:49.527049: I tensorflow_serving/core/basic_manager.cc:740] Successfully reserved resources to load servable {name: half_plus_two version: 1}