让我们说有人给我一个TF SavedModel,我想在我的机器上的4个GPU上复制这个模型,这样我就可以在批量数据上并行地进行推理。有什么好的例子说明如何做到这一点?
我可以用这种方式加载保存的模型:
def load_model(self, saved_model_dirpath):
'''Loads a model from a saved model directory - this should
contain a .pb file and a variables directory'''
signature_key = tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY
input_key = 'input'
output_key = 'output'
meta_graph_def = tf.saved_model.loader.load(self.sess, [tf.saved_model.tag_constants.SERVING],
saved_model_dirpath)
signature = meta_graph_def.signature_def
input_tensor_name = signature[signature_key].inputs[input_key].name
output_tensor_name = signature[signature_key].outputs[output_key].name
self.input_tensor = self.sess.graph.get_tensor_by_name(input_tensor_name)
self.output_tensor = self.sess.graph.get_tensor_by_name(output_tensor_name)
..但这需要我有一个会话句柄。对于我自己编写的模型,我可以访问推理函数,我可以调用它并使用with tf.device()
包装它,但在这种情况下,我不知道如何提取推理函数出于保存的模型。我应该加载4个单独的会话还是有更好的方法?无法找到很多关于此的文档,但如果我错过了某些内容,请提前道歉。谢谢!
答案 0 :(得分:1)
目前TensorFlow中不支持此用例。不幸的是,"复制推理功能"仅基于SavedModel(基本上是带有一些元数据的计算图),是一个相当复杂(并且很脆弱,如果实现的)图形转换问题。
如果您无法访问生成此模型的源代码,最好将SavedModel加载到4个单独的图形中,每次将目标设备重写到相应的GPU。然后,分别运行每个图表/会话。
请注意,您可以同时多次调用List<kvp<int, kvp<int, string>>>
,因为sess.run()
在实际计算时释放GIL。您只需要几个Python线程。