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

Posted

技术标签:

【中文标题】计算 GPU (Tesla K40c) 比图形 GPU (GTX 960) 慢【英文标题】:Computational GPU (Tesla K40c) is slower than graphics GPU (GTX 960) 【发布时间】:2018-07-13 08:18:45 【问题描述】:

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

我有 2 台机器(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 英伟达驱动版本: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 限制怎么办? 您实际上是在本地机器上运行 K40 吗?因为如果您正在运行云实例,它们可能会限制速度。我看到很多人抱怨云实例往往比在本地运行时慢得多。 损失是在 CPU 上计算的。您能否添加机器 A 和机器 B 的 CPU 详细信息?它可以解释一切。 我在问题中添加了 CPU 信息。两台机器都是本地机器。如何检查我的机器上的节流? @bremen_matt @huseyintugrulbuyukisik 如何检查带宽是否受 pci-e 限制? 50,000 是数据样本的数量(在本例中为 50000 张图像)。 【参考方案1】:

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

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

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

Nvidia K40c:745MHz Nvidia 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 相比,更大的 batch size 将使 K40c 更快。增加模型的容量也应该如此:增加全连接层中的单元数量和卷积层中的过滤器数量.在这里添加更多层可能无济于事。 nvidia-smi 工具的输出对于查看 GPU 的实际繁忙程度也非常有用。

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

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

【讨论】:

以上是关于计算 GPU (Tesla K40c) 比图形 GPU (GTX 960) 慢的主要内容,如果未能解决你的问题,请参考以下文章

CUDA 代码使两个 GPU “忙”

新的PGI编译器可将支持GPU的HPC应用从Linux/x86无缝迁移到支持NVLink的OpenPOWER+Tesla

图形流水线

NVIDIA GPU卡有几种架构?

nvidia tesla k40

在 Vertex AI 上使用 Tesla A100 GPU 和 Kubeflow Pipelines