如果我想训练Keras模型并拥有多个可用的GPU,有几种方法可以有效地使用它们:
-
将每个GPU分配给不同的模型,并并行训练它们(例如,用于超参数调整或不同架构之间的比较(。例如,我将model1分配给GPU1,将model2分配给GPU2,在一次全局数据加载操作之后,Keras将在每个GPU上为每个模型并行运行model.fit((。
-
划分一个模型并在所有GPU上并行训练。这是通过将模型划分为顺序块,然后计算整个模型的所有梯度来完成的。它的实现方式不适用于不同的独立模型。
-
在不同的GPU上对数据进行细分并将不同批次的数据输入到同一型号。
似乎有很多关于的文件
https://keras.io/guides/distributed_training/
https://www.run.ai/guides/multi-gpu/keras-multi-gpu-a-practical-guide/
https://www.pyimagesearch.com/2017/10/30/how-to-multi-gpu-training-with-keras-python-and-deep-learning/
但我找不到任何解决方案,而且要求它的帖子也没有解决方案:
在不同的GPU上同时训练多个keras/tensorflow模型
似乎,在这些选项已经可用的情况下,还可以选择为每个模型分配不同的GPU,并并行训练,这应该是微不足道的。我有什么东西不见了吗?
编辑:一个提议的解决方案就是运行不同的python脚本。但这并不是最优的,因为它将每个GPU按脚本划分,而不是按模型划分,这意味着脚本的所有其他部分都需要冗余地运行两次。如果数据加载部分非常昂贵,那么效率将非常低,因为两个脚本都将竞争数据访问。
其中一个解决方案是使用TFRecords,尽管我知道这并不完全是所需要的。这是OP描述的场景,我们将在其中运行不同的python脚本——每个脚本都对应于同一模型的一些变体。关于训练ANN,你应该意识到,在大多数情况下,当GPU繁忙时,CPU相对空闲。在加载数据集时,有两种情况:
-
一开始就加载整个数据集(
n
是同一模型的不同变体-这是内存中n
倍于同一数据集的数据,这对大数据来说可能是致命的,我们加载数据的时间是n
倍( -
创建为每个批次查询的数据序列/测试生成器(内存问题已部分解决,但随后我们可能会花费更多时间等待从不同磁盘位置读取的数据等(
2的问题。场景是,在每个批次之后,我们必须等待下一个批次被加载、准备(如增强等(并转移到GPU。TensorFlow提供TFRecords,这是一种用于存储数据的二进制格式。除了格式本身之外,还有API,用于查询以这种格式存储的数据,其想法是当GPU繁忙时,我们可以用CPU异步准备下一批,从而解决瓶颈。这在这里描述得很好:
https://www.tensorflow.org/guide/data_performance
当然,这里没有一个全局加载功能,但这是低内存使用率和快速数据集访问之间的一个很好的折衷。根据CPU与GPU相比所做的工作,这可能是您问题的部分解决方案。