【发布时间】: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