我正在尝试keras
使用多个线程(和tensorflow
后端)训练具有不同参数值的多个模型.我已经看到了在多个线程中使用相同模型的一些示例,但在这种特殊情况下,我遇到了有关冲突图等的各种错误.这是我希望能够做的一个简单示例:
from concurrent.futures import ThreadPoolExecutor
import numpy as np
import tensorflow as tf
from keras import backend as K
from keras.layers import Dense
from keras.models import Sequential
sess = tf.Session()
def example_model(size):
model = Sequential()
model.add(Dense(size, input_shape=(5,)))
model.add(Dense(1))
model.compile(optimizer='sgd', loss='mse')
return model
if __name__ == '__main__':
K.set_session(sess)
X = np.random.random((10, 5))
y = np.random.random((10, 1))
models = [example_model(i) for i in range(5, 10)]
e = ThreadPoolExecutor(4)
res_list = [e.submit(model.fit, X, y) for model in models]
for …
Run Code Online (Sandbox Code Playgroud) concurrency multithreading python-multithreading keras tensorflow
如果我想训练 Keras 模型并拥有多个可用的 GPU,有多种有效使用它们的方法:
将每个 GPU 分配给不同的模型,并并行训练它们(例如,用于超参数调整或不同架构之间的比较)。例如,我将 model1 分配给 GPU1,将 model2 分配给 GPU2,在一次全局数据加载操作之后,Keras 会在每个 GPU 上并行运行每个模型的 model.fit()。
划分一个模型并在所有 GPU 上并行训练。这是通过将模型分割成连续的块,然后计算整个模型的所有梯度来完成的。它的实现方式不适用于不同的独立模型。
挖掘数据并将不同批次输入到不同 GPU 上的同一模型。
似乎有很多关于 2) 和 3) 的文档
https://keras.io/guides/distributed_training/
https://www.run.ai/guides/multi-gpu/keras-multi-gpu-a-practical-guide/
但我找不到 1) 的任何解决方案,并且要求它的帖子没有解决方案:
在不同的 GPU 上同时训练多个 keras/tensorflow 模型
看起来,既然这些选项已经可用,那么为每个模型分配不同的 GPU 并并行训练的选项应该很简单。我有什么遗漏的吗?
编辑:一种建议的解决方案是运行不同的 python 脚本。但这并不是最优的,因为它是按脚本划分每个 GPU,而不是按模型划分,这意味着脚本的所有其他部分都需要冗余地运行两次。如果数据加载部分很昂贵,这将非常低效,因为两个脚本都会竞争数据访问。