Tensorflow serving 在基本路径下找不到可服务版本 <MODEL>

Tensorflow serving No versions of servable <MODEL> found under base path

我正在关注 this tutorial to use tensorflow serving using my object detection model. I am using tensorflow object detection for generating the model. I have created a frozen model using this 导出器(使用 python 脚本生成的冻结模型 有效 )。

冻结图目录包含以下内容(variables 目录中没有任何内容)

variables/

saved_model.pb

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

tensorflow_model_server --port=9000 --model_name=ssd --model_base_path=/serving/ssd_frozen/

它总是显示我

...

tensorflow_serving/model_servers/server_core.cc:421] (Re-)adding model: ssd 2017-08-07 10:22:43.892834: W tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc:262] No versions of servable ssd found under base path /serving/ssd_frozen/ 2017-08-07 10:22:44.892901: W tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc:262] No versions of servable ssd found under base path /serving/ssd_frozen/

...

我有同样的问题,原因是对象检测 api 在导出检测模型时没有分配模型的版本。但是,tensorflow serving 需要您分配检测模型的版本号,以便您可以选择不同版本的模型进行服务。在您的情况下,您应该将检测模型(.pb 文件和变量文件夹)放在文件夹下: /serving/ssd_frozen/1/.这样,您会将模型分配给版本 1,并且 tensorflow serving 将自动加载该版本,因为您只有一个版本。默认情况下,tensorflow serving 会自动服务最新版本(即最大版本数)。

注意,创建1/文件夹后,model_base_path仍然需要设置为--model_base_path=/serving/ssd_frozen/.

对于新版本的tf serving,如您所知,它不再支持以前通过SessionBundle 导出的模型格式,而是现在支持SavedModelBuilder。

我想最好从旧模型格式恢复会话,然后通过 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!')

您可以在 tf 服务示例中找到上面代码的主要部分。 最后,它将以可以提供的格式生成 SavedModel。

在 like - serving/model_name/0000123/saved_model.pb

下创建一个版本文件夹

上面的答案已经解释了为什么在模型文件夹中保留版本号很重要。按照下面link,这里有不同的搭建模型,大家可以参考一下。

https://github.com/tensorflow/serving/tree/master/tensorflow_serving/servables/tensorflow/testdata

我是在我的个人计算机上执行此操作的 运行 Ubuntu,而不是 Docker。注意我在一个名为“serving”的目录中。这是我保存文件夹“mobile_weight”的地方。我必须在“mobile_weight”中创建一个新文件夹“0000123”。我的路径看起来像 serving->mobile_weight->0000123->(variables folder and saved_model.pb)

tensorflow 服务教程中的命令应如下所示(更改 model_name 和您的目录):

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

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

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 安装正确并指向模型的目录,因为这是一般的“找不到模型”错误,但它看起来更多复杂。

如果在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}