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}
我正在关注 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}