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

lef*_*ion 5 keras tensorflow

我想对神经网络上的参数进行网格搜索。我有两个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)
Run Code Online (Sandbox Code Playgroud)

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

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

lef*_*ion 2

可以在此处找到此问题的解决方案。然而,softmax 激活函数目前仅在 CPU 上运行。需要指挥cpu执行dense层:

with tf.device('cpu:0')
Run Code Online (Sandbox Code Playgroud)

CPU 和 GPU 之间的切换似乎不会导致明显的速度减慢。但对于 LSTM,最好在 CPU 上运行整个模型。