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

SUB*_*SUB 6 gpu deep-learning keras tensorflow

我正在两台不同的机器上深入学习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核 - 英特尔(R)核心(TM)i7-6700 CPU @ 3.40GHz
  • 机器B(特斯拉K40c):8核 - 英特尔(R)Xeon(R)CPU E5-2637 v4 @ 3.50GHz

jlh*_*jlh 1

TL;DR:以更大的批量大小再次测量。

这些结果并不令我感到惊讶。人们普遍错误地认为昂贵的 Tesla 卡(或 GPU)会自动更快地完成所有工作。您必须了解 GPU 的工作原理才能利用其强大功能。

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

  • 英伟达 K40c:745MHz
  • 英伟达 GTX 960:1127MHz
  • 英特尔 i7:3400MHz
  • 英特尔至强:3500MHz

这可以让您了解这些设备的运行速度,并给出一个非常粗略的结果估计它们一次只做一件事(即没有并行化)时处理数字的速度。

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

  • Nvidia K40c:2880 个 cuda 核心
  • Nvidia GTX 960:1024 个 cuda 核心
  • 英特尔 i7:8 线程
  • 英特尔至强:8 线程

同样,这些数字可以让您非常粗略地估计这些设备可以同时执行多少操作。

注意:我正在严重简化事情:CPU 核心绝对不能与 cuda 核心相媲美!它们是非常非常不同的东西。并且根本无法像这样比较基本时钟频率!这只是为了让大家了解正在发生的事情。

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

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

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