Je suivais this tutoriel pour utiliser tensorflow serving
en utilisant mon modèle de détection d'objet. J'utilise détection d'objets tensorflow pour générer le modèle. J'ai créé un modèle figé en utilisant ce exportateur (le modèle gelé généré fonctionne en utilisant python = script).
Le répertoire du graphe figé a le contenu suivant (rien sur le répertoire variables
)
variables /
saved_model.pb
Maintenant, lorsque j'essaie de servir le modèle à l'aide de la commande suivante,
tensorflow_model_server --port=9000 --model_name=ssd --model_base_path=/serving/ssd_frozen/
Ça me montre toujours
...
tensorflow_serving/model_servers/server_core.cc: 421] (Re-) ajout du modèle: ssd 2017-08-07 10: 22: 43.892834: W tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc: 262] Aucune version de ssd servable trouvée sous la base chemin/service/ssd_frozen/2017-08-07 10: 22: 44.892901: W tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc: 262] Aucune version de ssd servable trouvée sous chemin de base/service/ssd_frozen /
...
J'ai eu le même problème, la raison en est que l'API de détection d'objet n'attribue pas de version de votre modèle lors de l'exportation de votre modèle de détection. Cependant, la diffusion tensorflow vous oblige à attribuer un numéro de version de votre modèle de détection, afin que vous puissiez choisir différentes versions de vos modèles à diffuser. Dans votre cas, vous devez placer votre modèle de détection (fichier .pb et dossier de variables) sous le dossier:/servant/ssd_frozen/1 /. De cette façon, vous affecterez votre modèle à la version 1, et le service tensorflow chargera automatiquement cette version car vous n'avez qu'une seule version. Par défaut, le service tensorflow servira automatiquement la dernière version (c'est-à-dire le plus grand nombre de versions).
Remarque: après avoir créé le dossier 1 /, le chemin_modèle_base doit toujours être défini sur --model_base_path =/service/ssd_frozen /.
Pour la nouvelle version de tf servant, comme vous le savez, il ne prend plus en charge le format de modèle utilisé pour être exporté par SessionBundle mais maintenant SavedModelBuilder.
Je suppose qu'il est préférable de restaurer une session à partir de votre ancien modèle, puis de l'exporter par SavedModelBuilder. Vous pouvez indiquer la version de votre modèle avec.
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!')
vous pouvez trouver la partie principale du code ci-dessus dans l'exemple de service tf. Enfin, il générera le SavedModel dans un format qui peut être servi.
Créez un dossier de version sous like - service/nom_modèle/0000123/modèle_enregistré.pb
La réponse ci-dessus a déjà expliqué pourquoi il est important de conserver un numéro de version dans le dossier du modèle. Suivez le lien ci-dessous, ici ils ont différents ensembles de modèles construits, vous pouvez le prendre comme référence.
https://github.com/tensorflow/serving/tree/master/tensorflow_serving/servables/tensorflow/testdata