是否可以在一个python脚本中在多个GPU上并行训练多个Keras模型



如果我想训练Keras模型并拥有多个可用的GPU,有几种方法可以有效地使用它们:

  1. 将每个GPU分配给不同的模型,并并行训练它们(例如,用于超参数调整或不同架构之间的比较(。例如,我将model1分配给GPU1,将model2分配给GPU2,在一次全局数据加载操作之后,Keras将在每个GPU上为每个模型并行运行model.fit((。

  2. 划分一个模型并在所有GPU上并行训练。这是通过将模型划分为顺序块,然后计算整个模型的所有梯度来完成的。它的实现方式不适用于不同的独立模型。

  3. 在不同的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相对空闲。在加载数据集时,有两种情况:

  1. 一开始就加载整个数据集(n是同一模型的不同变体-这是内存中n倍于同一数据集的数据,这对大数据来说可能是致命的,我们加载数据的时间是n倍(

  2. 创建为每个批次查询的数据序列/测试生成器(内存问题已部分解决,但随后我们可能会花费更多时间等待从不同磁盘位置读取的数据等(

2的问题。场景是,在每个批次之后,我们必须等待下一个批次被加载、准备(如增强等(并转移到GPU。TensorFlow提供TFRecords,这是一种用于存储数据的二进制格式。除了格式本身之外,还有API,用于查询以这种格式存储的数据,其想法是当GPU繁忙时,我们可以用CPU异步准备下一批,从而解决瓶颈。这在这里描述得很好:

https://www.tensorflow.org/guide/data_performance

当然,这里没有一个全局加载功能,但这是低内存使用率和快速数据集访问之间的一个很好的折衷。根据CPU与GPU相比所做的工作,这可能是您问题的部分解决方案。

最新更新