【问题标题】:Why tensorflow is slower with GPU instead of CPU?为什么使用 GPU 而不是 CPU 的 tensorflow 更慢?
【发布时间】:2019-07-19 15:47:57
【问题描述】:

这是一个非常简单的神经网络:

n_pts = 500000
np.random.seed(0)
Xa = np.array([np.random.normal(13, 2, n_pts),
           np.random.normal(12, 2, n_pts)]).T
Xb = np.array([np.random.normal(8, 2, n_pts),
           np.random.normal(6, 2, n_pts)]).T

X = np.vstack((Xa, Xb))
y = np.matrix(np.append(np.zeros(n_pts), np.ones(n_pts))).T


# Create a new Keras model
model = Sequential()
model.add(Dense(units=1, input_shape=(2,), activation='sigmoid'))
adam = Adam(lr=0.1)
model.compile(adam, loss='binary_crossentropy', metrics=['accuracy'])
h = model.fit(x=X, y=y, verbose=1, batch_size=100000, epochs=15, shuffle='true')

我将批量大小增加到 100k,但 cpu 比 gpu 快(9 秒 vs 12 大批量大小,小批量大小快 4 倍以上) cpu 是 intel i7-8850H,GPU 是 Nvidia Quadro p600 4gb。 我安装了 tensorflow 1.14.0。 像这样一个更复杂的网络:

model = Sequential()
model.add(Convolution2D(24, 5, 5, subsample=(2, 2), input_shape=(66, 200, 
3), activation='elu'))
model.add(Convolution2D(36, 5, 5, subsample=(2, 2), activation='elu'))
model.add(Convolution2D(48, 5, 5, subsample=(2, 2), activation='elu'))
model.add(Convolution2D(64, 3, 3, activation='elu'))

model.add(Convolution2D(64, 3, 3, activation='elu'))
# model.add(Dropout(0.5))

model.add(Flatten())

model.add(Dense(100, activation = 'elu'))
#   model.add(Dropout(0.5))

 model.add(Dense(50, activation = 'elu'))
#   model.add(Dropout(0.5))

model.add(Dense(10, activation = 'elu'))
#   model.add(Dropout(0.5))

model.add(Dense(1))

optimizer = Adam(lr=1e-3)
model.compile(loss='mse', optimizer=optimizer)

GPU 会比 cpu 快吗? 需要做什么才能充分利用 gpu 的能力?

【问题讨论】:

  • 像第一个示例这样的普通网络只需要很少的计算。在这种情况下,将数据复制到 GPU 内存的开销将大于计算本身。即使您使用更大的批次,这也会增加内存开销。这也可能发生在相对较小的网络中,只有几层,每层的单元不多。第二个网络更有可能从 GPU 中受益。无论如何,performance of the input pipeline 可以产生很大的不同。
  • 也许通过阅读这篇文章:tensorflow.org/api_docs/python/tf/keras/utils/multi_gpu_model,您会发现单个 GPU 不会强制优于单个 CPU。如果您有多个 GPU,则可以并行化训练,这意味着您可以获得准线性加速。
  • 感谢 jdehesa 和 GrizZ 的出色回答!

标签: python tensorflow keras


【解决方案1】:

GPU 最适合处理大规模并行工作负载,您的简单模型无法实现这一点。数据需要在 CPU 和 GPU 之间传输,所以如果这个开销大于实际计算,那么 CPU 很可能会更快,因为不会发生传输开销。

只有更大的模型才能从 GPU 加速中获益。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多