我遇到了一个问题,即我无法成功地将训练批次拆分为多个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的利用率运行:
如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几乎什么都不做:
使用四个GPU时,效果甚至恶化。第一个的利用率高达100%,而其余的只有短暂的窥视。
是否有解决此问题的解决方案?如何正确训练多个GPU?
tensorflow.keras.utils
和keras.utils
之间是否存在导致意外行为的差异?
答案 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
函数,因为我不知道其中包含什么,所以我的最佳建议是不使用此函数而在代码中顺序构建模型。