将模型从tensorflow SavedModel加载到mutliple GPU上

时间:2018-05-21 04:50:14

标签: tensorflow multi-gpu

让我们说有人给我一个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个单独的会话还是有更好的方法?无法找到很多关于此的文档,但如果我错过了某些内容,请提前道歉。谢谢!

1 个答案:

答案 0 :(得分:1)

目前TensorFlow中不支持此用例。不幸的是,"复制推理功能"仅基于SavedModel(基本上是带有一些元数据的计算图),是一个相当复杂(并且很脆弱,如果实现的)图形转换问题。

如果您无法访问生成此模型的源代码,最好将SavedModel加载到4个单独的图形中,每次将目标设备重写到相应的GPU。然后,分别运行每个图表/会话。

请注意,您可以同时多次调用List<kvp<int, kvp<int, string>>> ,因为sess.run()在实际计算时释放GIL。您只需要几个Python线程。