hir*_*hme 5 python deep-learning 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,而不是按模型划分,这意味着脚本的所有其他部分都需要冗余地运行两次。如果数据加载部分很昂贵,这将非常低效,因为两个脚本都会竞争数据访问。
尽管我知道这并不完全是所期望的,但解决方案之一是使用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 相比需要完成的工作量,这可能是您问题的部分解决方案。
| 归档时间: |
|
| 查看次数: |
2465 次 |
| 最近记录: |