为什么在升级到更好的 GPU 后我没有看到更快的神经网络训练?

计算科学 Python 表现 机器学习 显卡 库达
2021-11-28 01:40:00

我之前使用 Lasagne 库运行我的神经网络,在 NVIDIA GTX 750 Ti 上的 Theano 中构建和训练神经网络。我正在使用遗传算法来调整我的神经网络的超参数,因此我购买了GTX 780 Ti来加快每个神经网络的训练速度。780 Ti 的单精度浮点性能应该是750 Ti的 3 倍以上,但我根本看不到任何加速。

  • 我检查了 GPU-Z 中的 GPU 利用率,两个 GPU 的利用率相同(中高 60%)。为什么更强大的 GPU 使用相同百分比的资源,但运行速度却没有提高?
  • 我卸载了包括驱动程序在内的所有 NVIDIA 软件(在此过程中重新启动了两次),然后使用 CUDA 7.5 Toolkit Installer 重新安装了所有内容,然后我安装了 CUDNN 7.5(5?)库/头文件/二进制文件我重新启动了我的神经网络和它表现还是和以前一样差。

一些可能很重要的信息:

  • 这是在 Windows 7 上
  • 对于我正在使用的 nvcc,cl-version=2013因为这就是我所拥有的并且工作正常
  • CPU 是 Intel Core i5-2500K @ 3.3GHz
  • 8 GB 系统内存
  • 数据从三星 SSD 850 EVO 500GB 驱动器加载
  • 3 GB GPU 内存(其他规格可在上面的链接中找到)
  • 卡插入 PCI-E Gen2 (1x16) 插槽
  • 网络变化很大,但它们都是具有 1-5 个隐藏层的多层感知器
  • 每层 15-150 个神经元,所有 DenseLayers
  • 75 个输入,10 个输出
  • 目前在任何层之前没有丢失或高斯噪声
  • 批量大小为 1024
  • 数据在每个 epoch 之前被打乱
  • 隐藏层激活函数都是 elu
  • 输出激活函数可以是 sigmoid、tanh 或 elu
  • 损失函数是均方误差
  • 更新使用内斯特罗夫动量
  • 训练数据大小为 274MB,包含 934918 个样本
  • 验证数据大小为 30.5MB,包含 103880 个样本

我的第一个想法是我的网络太小,无法在小型和大型 GPU 上产生任何影响,但是运行时较大的 GPU 与较小的 GPU 一样受到压力,而且这些网络在 GRID K520 GPU 上运行得更快Amazon EC2(在 Ubuntu 上)(K520 和 780 Ti 都使用 Kepler GPU 架构,而 750 Ti 是 Nvidia 的第一款 Maxwell 卡)。

什么可能导致我的新卡如此缓慢?我怎样才能让它比旧的更糟糕的卡运行得更快?

编辑:在 Ubuntu 上运行 nn 我看到了显着的加速,虽然没有我希望的那么大,但绝对引人注目。我的小型网络可能没有充分利用 GPU。Windows 运行缓慢的一个可能原因是 WDDM 模式与 TCC 模式:https://devtalk.nvidia.com/default/topic/895331/cuda-setup-and-installation/tesla-k20-vs-titan-x-相同代码的性能/post/4724884/#4724884。我将尝试将我的旧卡安装在 PCI-E 1x 插槽中,并将其作为显示驱动程序,并将我的新卡仅用于计算

编辑第二个:这是我的一个神经网络的样子:

input_var = T.matrix('inputs')
input = lasagne.layers.InputLayer(shape=(1024, 75), input_var=input_var)
network = lasagne.layers.DenseLayer(input, 40,
            nonlinearity=lasagne.nonlinearities.elu,
            W=lasagne.init.GlorotUniform())
network = lasagne.layers.DenseLayer(network, 113,
            nonlinearity=lasagne.nonlinearities.elu,
            W=lasagne.init.GlorotUniform())
network = lasagne.layers.DenseLayer(network, 76,
            nonlinearity=lasagne.nonlinearities.elu,
            W=lasagne.init.GlorotUniform())
output = lasagne.layers.DenseLayer(
            network, num_units=10,
            nonlinearity=lasagne.nonlinearities.tanh)
prediction = lasagne.layers.get_output(output)
loss = lasagne.objectives.squared_error(prediction, target_var)
loss = loss.mean()
updates = lasagne.updates.nesterov_momentum(loss, params, learning_rate=0.5, momentum=0.5)

test_prediction = lasagne.layers.get_output(output, deterministic=True)
test_loss = lasagne.objectives.squared_error(test_prediction, target_var)
test_loss = test_loss.mean()

train_fn = theano.function([input_var, target_var], loss, updates=updates)
val_fn = theano.function([input_var, target_var], test_loss)
1个回答

我想,你是对的,你的网络并没有那么大,不能 100% 使用 GPU。这里的瓶颈似乎不是 GPU 本身,而是 RAM 和 VRAM 之间的传输速率以及 750 Ti 和 780 Ti 之间的差异并不显着。您可以尝试通过隐藏内存传输的延迟来提高训练速度 - 您必须确保在计算前一个数据集时将新数据集传输到卡。您可能还需要将任务分成更小的部分。

同样重要的是要注意,750 Ti 使用更新的 (Maxwell) GPU 架构,而 780 Ti 使用前代 (Kepler) GPU 代。有关更多详细信息,请参见此处