我正在两台不同的机器上深入学习CNN(4-CNN图层和3个FNN图层)模型(用Keras编写,张量流作为后端)。
我有2台机器(A:配备GTX 960显卡GPU,2GB内存和时钟速度:1.17 GHz,B:带特斯拉K40计算GPU,12GB内存和时钟速度:745MHz) 但是当我在A:
上运行CNN模型时 Epoch 1/35
50000/50000 [==============================] - 10s 198us/step - loss: 0.0851 - acc: 0.2323
在B:
Epoch 1/35
50000/50000 [==============================] - 43s 850us/step - loss: 0.0800 - acc: 0.3110
这些数字甚至无法比较。我很擅长深入学习和在GPU上运行代码。有人可以帮我解释为什么数字如此不同?
如果您需要更多数据,请与我们联系。
编辑1 :(添加CPU信息)
答案 0 :(得分:0)
TL; DR:使用更大的批量大小再次进行测量。
这些结果并没有让我感到惊讶。认为昂贵的特斯拉卡(或者说GPU)可以自动更快地完成所有操作,这是一个常见的错误。您必须了解GPU如何工作以利用其功能。
如果您比较设备的基本时钟速度,您会发现您的Xeon CPU速度最快:
这可以让您了解这些设备的运行速度,并给出非常粗略的估计,如果他们一次只做一件事就可以快速判断数字,也就是说,没有并行化。
正如你所看到的,GPU根本不是 (对于某些快速定义),实际上它们非常慢。另请注意K40c实际上比GTX 960慢。 然而,GPU的真正力量来自于它同时处理大量数据的能力!如果您现在再次检查这些设备可以进行多少并行化,您会发现K40c毕竟不是那么糟糕:
同样,这些数字可以让您粗略估计这些设备可以同时执行的操作。
注意:我正在严格简化:绝对没有办法将CPU核心与cuda核心相媲美!它们是非常不同的东西。并且绝不能像这样比较基本时钟频率!只是想知道发生了什么。
因此,您的设备需要能够并行处理大量数据,以便最大化其吞吐量。幸运的是,tensorflow已经为您做到了这一点:它将自动并行化所有重型矩阵乘法,以获得最大吞吐量。然而,如果矩阵具有一定的大小,这只会很快。您的批量大小设置为128,这意味着几乎所有这些矩阵的第一个维度都设置为128.我不知道您的模型的详细信息,但如果其他维度也不大,那么我怀疑大多数K40c在这些矩阵乘法过程中都处于空闲状态。尝试增加批量大小并再次测量。您应该会发现,与GTX 960相比,更大的批量大小将使K40c更快。同样适用于增加型号的容量:增加完全连接层中的单元数量和过滤器数量在卷积层。添加更多图层可能无济于事。 nvidia-smi
工具的输出对于了解GPU的实际繁忙程度也非常有用。
但请注意,更改模型的超参数和/或批量大小当然会对模型成功训练的方式产生巨大影响,当然您也可能会遇到内存限制。
也许如果不增加批量大小或更改模型,您也可以尝试在K40c上同时训练两个模型以利用空闲核心。但是我从来没有试过这个,所以它可能根本不起作用。