如何在Keras中的两个不同GPU上并行运行两个模型

时间:2018-05-22 20:56:19

标签: tensorflow keras

我想对神经网络上的参数进行网格搜索。我有两个GPU,我想在第一个GPU上运行一个模型,在第二个GPU上运行另一个具有不同参数的模型。没有工作的第一次尝试是这样的:

with tf.device('/gpu:0'):
    model_1 = sequential()
    model_1.add(embedding) // the embeddings are defined earlier in the code
    model_1.add(LSTM(50))
    model_1.add(Dense(5, activation = 'softmax'))
    model_1.compile(loss = 'categorical_crossentropy', optimizer = 'adam')
    model_1.fit(np.array(train_x), np.array(train_y), epochs = 15, batch_size = 15)
with tf.device('/gpu:1'):
    model_2 = sequential()
    model_2.add(embedding)
    model_2.add(LSTM(100))
    model_2.add(Dense(5, activation = 'softmax'))
    model_2.compile(loss = 'categorical_crossentropy', optimizer = 'adam')
    model_2.fit(np.array(train_x), np.array(train_y), epochs = 15, batch_size = 15)

编辑:我再次运行我的代码并没有收到错误。但是,这两个模型是顺序运行而不是并行运行。这里可以做多线程吗?那是我的下一次尝试。

网上有很多关于将多个GPU与keras一起使用的讨论,但是当涉及同时运行多个模型时,讨论仅限于在单个GPU上运行多个模型。关于多个GPU的讨论也限于数据并行化和设备并行化。我不相信我想做任何事情,因为我不打算打破一个模型来运行多个gpus。是否可以在带有两个GPU的keras中同时运行两个独立的模型?

3 个答案:

答案 0 :(得分:0)

您可以使用multi_gpu_model(参考here

首先定义您的模型

model = sequential()
model.add(embedding) // the embeddings are defined earlier in the code
model.add(LSTM(50))
model.add(Dense(5, activation = 'softmax'))

并创建一个包含2个GPU的multi_gpu_model

parallel_model = multi_gpu_model(model, gpus=2)

如果要分割输入并在2个GPU上处理它,这将有效。它不会涵盖您在两个GPU上使用两种不同型号的用例。

答案 1 :(得分:0)

可以找到解决此问题的方法here。但是,softmax激活功能仅在CPU上运行。有必要指导cpu执行密集层:

.custom-checkbox .custom-control-input:checked~.custom-control-label::before {
    background-color: #caca4c;
}
.custom-control-input:checked~.custom-control-label::before {
    color: #fff;
    background-color: #caca4c;
}

在cpu和gpu之间切换似乎没有引起明显的减速。但是使用LSTM,最好在cpu上运行整个模型。

答案 2 :(得分:-2)

因为您的代码是顺序的。您可以尝试线程化以并行运行2个块。 Google的“ python多线程”将帮助您获得许多示例。