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

标签 tensorflow deep-learning keras gpu

我正在两台不同的机器上运行深度学习 CNN(4-CNN 层和 3 个 FNN 层)模型(用 Keras 编写,以 tensorflow 作为后端)。

我有 2 台机器(A:带有 2GB 内存和时钟速度的 GTX 960 图形 GPU:1.17 GHz 和 B:带有带有 12GB 内存和时钟速度的 Tesla K40 计算 GPU: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
  • 最佳答案

    TL;博士:使用更大的批量大小再次测量。

    这些结果并不让我感到惊讶。认为昂贵的 Tesla 卡(或 GPU)会自动更快地完成所有事情是一个常见的错误。您必须了解 GPU 的工作原理才能利用其功能。

    如果您比较设备的基本时钟速度,您会发现您的至强 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 上同时训练两个模型以利用空闲内核。但是我从来没有尝试过这个,所以它可能根本不起作用。

    关于tensorflow - 计算 GPU (Tesla K40c) 比图形 GPU (GTX 960) 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48589317/

    相关文章:

    java - 通过 Java API 在 Windows 上使用来自 Tensorflow.contrb 的操作

    tensorflow - 使用张量板绘制单独的学习曲线

    deep-learning - 使用深度学习在回归中获得多个输出

    python - keras LSTM 获取隐藏状态(将句子序列转换为文档上下文向量)

    python - 使用 conv1D 时输入数据和训练数据之间的维度不匹配

    python - 在 TensorFlow 中创建图形时确定张量形状

    python - 在 TensorFlow 中实现准确度指标

    python - 使用 keras 训练模型时出现 TypeError 和 ValueError

    python - 有没有pytorch函数可以把张量的特定连续维度合二为一?

    python - Keras:约束链接输入和输出