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

6
我正在两台不同的机器上运行深度学习CNN模型(4个CNN层和3个FNN层),使用Keras编写,TensorFlow作为后端。其中一台机器是A,它有一个GTX 960图形GPU,2GB内存和1.17 GHz的时钟速度;另一台机器是B,它有一个Tesla 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(Tesla K40c):8个核心-Intel(R) Xeon(R) CPU E5-2637 v4 @ 3.50GHz

50000是什么?内核启动次数吗?延迟的原因可能是由于CUDA版本或硬件引起的内核启动开销过大吗?如果数据带宽受PCI-E限制会怎样? - huseyin tugrul buyukisik
2
你是在本地机器上运行K40吗?因为如果你在云实例上运行,它们可能会限制速度。我见过很多人抱怨云实例的速度比本地运行要慢得多。 - bremen_matt
损失是在 CPU 上计算的。请问能否添加机器 A 和机器 B 的 CPU 详细信息?这可能会解释一切。 - Manngo
我已经在问题中添加了CPU信息。这两台机器都是本地机器。我如何检查我的机器是否存在节流现象?@bremen_matt - SUB
@huseyintugrulbuyukisik 我该如何检查PCI-E是否限制了带宽?50000是数据样本的数量(在这种情况下为50000张图像)。 - SUB
显示剩余11条评论
1个回答

1

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核心
  • Nvidia GTX 960:1024个cuda核心
  • Intel i7:8个线程
  • Intel Xeon:8个线程

同样,这些数字仅给出了这些设备可以同时处理多少事情的非常粗略的估计。

注意:我严重简化了问题:CPU核心绝对不能与cuda核心相比较!它们是非常非常不同的东西。而且基本时钟频率也不能像这样进行比较!这只是为了给出一个概念。

因此,为了最大化吞吐量,您的设备需要能够并行处理大量数据。幸运的是,TensorFlow已经为您完成了这一点:它会自动并行化所有这些繁重的矩阵乘法以实现最大吞吐量。但是,只有在矩阵具有一定大小时才能快速进行。您的批量大小设置为128,这意味着几乎所有这些矩阵的第一个维度都设置为128。我不知道您的模型的详细信息,但如果其他维度也不大,则怀疑在这些矩阵乘法期间,大部分K40c仍处于空闲状态。尝试增加批次大小并再次测量。您应该发现,较大的批次大小将使K40c与GTX 960相比更快。对于增加模型容量也应该是如此:增加完全连接层中的单元数和卷积层中的过滤器数量。在这里添加更多层可能不会有帮助。nvidia-smi工具的输出也非常有用,可以查看GPU的实际使用情况。

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

也许如果增加批次大小或更改模型不是一个选项,您还可以尝试在K40c上同时训练两个模型,以利用空闲核心。但是我从未尝试过这样做,所以可能根本行不通。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接