在单个 GPU 上并行拟合多个 Keras 模型

Posted

技术标签:

【中文标题】在单个 GPU 上并行拟合多个 Keras 模型【英文标题】:Parallel fitting of multiple Keras Models on single GPU 【发布时间】:2018-06-01 19:02:09 【问题描述】:

我正在尝试在单个 GPU 上并行安装多个小型 Keras 模型。由于某些原因,我需要将它们从列表中删除并一次一步地训练它们。因为我对标准的多处理模块并不幸运,所以我使用了 pathos。

我试图做的是这样的:

from pathos.multiprocessing import ProcessPool as Pool
import tensorflow as tf
import keras.backend as K

def multiprocess_step(self, model):
    K.set_session(sess)
    with sess.graph.as_default():
        model = step(model, sess)
        return model

def step(model, sess):
    K.set_session(sess)
    with sess.graph.as_default():
        model.fit(x=data['X_train'], y=data['y_train'],
               batch_size=batch_size
               validation_data=(data['X_test'], data['y_test']), 
               verbose=verbose,
               shuffle=True,
               initial_epoch=self.step_num - 1)
        return model

config = tf.ConfigProto()
config.gpu_options.allow_growth = True
config.gpu_options.visible_device_list = "0"
sess = tf.Session(config=config)

K.set_session(sess)
with sess.graph.as_default():
    pool = Pool(8).map
    model_list = pool(multiprocess_step, model_list)

但无论我尝试什么,我都会不断收到错误消息,声称模型似乎不在同一张图上...

ValueError: Tensor("training/RMSprop/Variable:0", shape=(25, 352), dtype=float32_ref) must be from the same graph as Tensor("RMSprop/rho/read:0", shape=(), dtype=float32).

异常源自 model.fit() 行,所以即使我尝试在每个可能的位置设置会话图,我也一定做错了什么?

有人有类似的经历吗?

【问题讨论】:

尝试在其进程中声明每个模型及其会话。 delaring 是指创建一个全新的模型,然后将权重加载到其中? 是的!您的问题可能来自在不同进程中创建的新会话/图表,并且没有在外部声明原始节点。 【参考方案1】:

在Keras issue tracker 上提出了以下建议。与使用多处理相比,我不确定该方法的相对优点。

in_1 = Input()
lstm_1 = LSTM(...)(in_1)
out_1 = Dense(...)(lstm_1)

in_2 = Input()
lstm_2 = LSTM(...)(in_2)
out_2 = Dense(...)(lstm_2)

model_1 = Model(input=in_1, output=out_1)
model_2 = Model(input=in_2, output=out_2)

model = Model(input = [in_1, in_2], output = [out_1, out_2])
model.compile(...)
model.fit(...)

model_1.predict(...)
model_2.predict(...)

【讨论】:

【参考方案2】:

考虑到keras的后端设置为tensorflow。您可以使用代码并为多个模型调用/多个模型加载进行并行处理。

def model1(dir_model):
    model = os.path.join(dir_model, 'model.json')
    dir_weights = os.path.join(dir_model, 'model.h5')
    graph1 = Graph()
    with graph1.as_default():
        session1 = Session(graph=graph1, config=config)
        with session1.as_default():
            with open(model, 'r') as data:
                model_json = data.read()
            model_1 = model_from_json(model_json)
            model_1.load_weights(dir_weights)
    return model_1,gap_weights,session1,graph1

def model_2(dir_model):
    model = os.path.join(dir_model, 'model.json')
    dir_weights = os.path.join(dir_model, 'model.h5')
    graph2 = Graph()
    with graph2.as_default():
        session2 = Session(graph=graph2, config=config)
        with session2.as_default():
            with open(model, 'r') as data:
                model_json = data.read()
            model_2 = model_from_json(model_json)
            model_2.load_weights(dir_weights)
    return model_2,session2,graph2

并为调用特定模型进行以下实验。 对于模型 1 预测,请执行以下操作

K.set_session(session2)
with graph2.as_default():
     img_pred[img_name] = 
patch_dict[np.argmax(np.squeeze(model_2.predict(img_invoke)))

对于模型 2,它遵循与

K.set_session(session2)
with graph2.as_default():
     img_pred[img_name] = 
patch_dict[np.argmax(np.squeeze(model_2.predict(img_invoke)))]

【讨论】:

以上是关于在单个 GPU 上并行拟合多个 Keras 模型的主要内容,如果未能解决你的问题,请参考以下文章

深度学习并行运算原理 以及 keras实现GPU并行

一旦模型拟合,Keras 如何评估单个图像

keras使用多GPU并行训练模型 | keras multi gpu training

使用单个 GPU 进行 keras 模型预测的多处理

具有推理功能的 TensorFlow + Keras 多 GPU 模型

如何使用 gpu 并行训练 tensorflow.keras 模型? TensorFlow 版本 2.5.0