计算GPU(Tesla K40c)比图形GPU(GTX 960)慢

时间:2018-02-02 19:05:03

标签: tensorflow deep-learning keras gpu

我正在两台不同的机器上深入学习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上运行代码。有人可以帮我解释为什么数字如此不同?

  • 数据集:CIFAR-10(32x32 RGB图像)
  • 型号批量:128
  • 型号参数:1.2M
  • 操作系统:Ubuntu 16.04
  • Nvidia驱动程序版本:384.111
  • Cuda版本:7.5,V7.5.17

如果您需要更多数据,请与我们联系。

编辑1 :(添加CPU信息)

  • 机器A(GTX 960):8核 - Intel(R)Core(TM)i7-6700 CPU @ 3.40GHz
  • 机器B(特斯拉K40c):8核 - 英特尔(R)Xeon(R)CPU E5-2637 v4 @ 3.50GHz

1 个答案:

答案 0 :(得分:0)

TL; DR:使用更大的批量大小再次进行测量。

这些结果并没有让我感到惊讶。认为昂贵的特斯拉卡(或者说GPU)可以自动更快地完成所有操作,这是一个常见的错误。您必须了解GPU如何工作以利用其功能。

如果您比较设备的基本时钟速度,您会发现您的Xeon CPU速度最快:

  • Nvidia K40c:745MHz
  • Nvidia GTX 960:1127MHz
  • Intel i7:3400MHz
  • Intel Xeon:3500MHz

这可以让您了解这些设备的运行速度,并给出非常粗略的估计,如果他们一次只做一件事就可以快速判断数字,也就是说,没有并行化。

正如你所看到的,GPU根本不是 (对于某些快速定义),实际上它们非常慢。另请注意K40c实际上比GTX 960慢。  然而,GPU的真正力量来自于它同时处理大量数据的能力!如果您现在再次检查这些设备可以进行多少并行化,您会发现K40c毕竟不是那么糟糕:

  • Nvidia K40c:2880 cuda cores
  • Nvidia GTX 960:1024 cuda cores
  • Intel i7:8个帖子
  • Intel Xeon:8个帖子

同样,这些数字可以让您粗略估计这些设备可以同时执行的操作。

注意:我正在严格简化:绝对没有办法将CPU核心与cuda核心相媲美!它们是非常不同的东西。并且绝不能像这样比较基本时钟频率!只是想知道发生了什么。

因此,您的设备需要能够并行处理大量数据,以便最大化其吞吐量。幸运的是,tensorflow已经为您做到了这一点:它将自动并行化所有重型矩阵乘法,以获得最大吞吐量。然而,如果矩阵具有一定的大小,这只会很快。您的批量大小设置为128,这意味着几乎所有这些矩阵的第一个维度都设置为128.我不知道您的模型的详细信息,但如果其他维度也不大,那么我怀疑大多数K40c在这些矩阵乘法过程中都处于空闲状态。尝试增加批量大小并再次测量。您应该会发现,与GTX 960相比,更大的批量大小将使K40c更快。同样适用于增加型号的容量:增加完全连接层中的单元数量和过滤器数量在卷积层。添加更多图层可能无济于事。 nvidia-smi工具的输出对于了解GPU的实际繁忙程度也非常有用。

但请注意,更改模型的超参数和/或批量大小当然会对模型成功训练的方式产生巨大影响,当然您也可能会遇到内存限制。

也许如果不增加批量大小或更改模型,您也可以尝试在K40c上同时训练两个模型以利用空闲核心。但是我从来没有试过这个,所以它可能根本不起作用。