【问题标题】:Is it possible to train multiple Keras models in parallel on multiple GPUs in a single python script?是否可以在单个 python 脚本中在多个 GPU 上并行训练多个 Keras 模型?
【发布时间】:2020-12-15 16:39:31
【问题描述】:

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

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

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

  3. 潜水数据并将不同批次的数据输入不同 GPU 上的同一模型。

似乎有很多关于 2) 和 3) 的文档

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/

但我找不到 1) 的任何解决方案,并且要求它的帖子没有解决方案:

Train multiple keras/tensorflow models on different GPUs simultaneously

看起来,在这些选项已经可用的情况下,还可以选择为每个模型分配不同的 GPU 并进行并行训练,这应该是微不足道的。有什么我遗漏的吗?

编辑:一种建议的解决方案是运行不同的 python 脚本。但这并不是最优的,因为它是按脚本划分每个 GPU,而不是按模型划分,这意味着脚本的所有其他部分将需要运行两次,冗余。如果数据加载部分很昂贵,这将非常低效,因为两个脚本将竞争数据访问。

【问题讨论】:

  • 在我看来 1) 可以通过两次执行 python 训练脚本来轻松实现,模型和 GPU 设备作为参数传递(或硬编码)。
  • @Tinu 是的,但是我没有将 GPU 分配给模型,而是将 GPU 分配给整个脚本。这意味着我必须为每个脚本加载相同的数据集。
  • 你考虑过使用TFRecords吗?我很高兴分享答案
  • @Proko 感谢您的建议,但这解决了另一个问题(如何有效地存储和读取数据)。我仍然认为将 GPU 分配给脚本中的模型并允许多重/并行训练有明显的优势,但我还不能相信这不是一件事
  • 你找到解决办法了吗?

标签: python tensorflow keras deep-learning


【解决方案1】:

其中一个解决方案是使用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 相比需要做多少工作,这可能是您问题的部分解决方案。

【讨论】:

  • 我不清楚如何使用 TFRecord 在 OPs 问题中实现 #1。有没有人有更多细节或例子?
猜你喜欢
  • 2018-06-01
  • 2018-12-02
  • 1970-01-01
  • 2020-03-26
  • 2017-12-19
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
相关资源
最近更新 更多