Tensorflow / keras multi_gpu_model未拆分为多个GPU

时间:2019-03-06 17:46:49

标签: python tensorflow keras multi-gpu

我遇到了一个问题,即我无法成功地将训练批次拆分为多个GPU。如果使用multi_gpu_model中的tensorflow.keras.utils,则tensorflow在所有可用(例如2个)gpu上分配全部内存,但是如果nvidia-smi仅将第一个(gpu [0])用于100%被监视。

我现在正在使用tensorflow 1.12。

在单个设备上测试

model = getSimpleCNN(... some parameters)

model .compile()
model .fit()

正如预期的那样,数据由cpu加载,并且模型在gpu [0]上以97%-100%gpu的利用率运行: enter image description here

创建一个multi_gpu模型

如multi_gpu_model here的tensorflow api中所述,未更改模型定义的设备范围。

from tensorflow.keras.utils import multi_gpu_model

model = getSimpleCNN(... some parameters)
parallel_model = multi_gpu_model(model, gpus=2, cpu_merge=False)  # weights merge on GPU (recommended for NV-link)

parallel_model.compile()
parallel_model.fit()

如时间轴所示,cpu现在不仅加载数据,而且还在进行其他一些计算。注意:第二个GPU几乎什么都不做: enter image description here

问题

使用四个GPU时,效果甚至恶化。第一个的利用率高达100%,而其余的只有短暂的窥视。

是否有解决此问题的解决方案?如何正确训练多个GPU?

tensorflow.keras.utilskeras.utils之间是否存在导致意外行为的差异?

1 个答案:

答案 0 :(得分:0)

我只是遇到了同样的问题。 在我的情况下,问题来自使用返回模型的getSimpleCNN()函数。 请注意您的firm.data X Date Return 2019-01-25 0.007523323 2019-01-28 -0.004778901 2019-01-29 0.004801849 Y Date Return 2019-01-25 0.019767443 2019-01-28 -0.001900380 2019-01-29 -0.006473724 函数,因为我不知道其中包含什么,所以我的最佳建议是不使用此函数而在代码中顺序构建模型。