将模型从 tensorflow SavedModel 加载到多个 GPU

Loading a model from tensorflow SavedModel onto mutliple GPUs

假设有人递给我一个 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 个单独的会话还是有更好的方法?找不到太多关于此的文档,但如果我遗漏了什么,请提前致歉。谢谢!

TensorFlow 目前不支持此用例。不幸的是,"replicating the inference function" 仅基于 SavedModel(它基本上是具有一些元数据的计算图)是一个相当复杂(如果实施的话也很脆弱)的图转换问题。

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

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