我之前使用 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)