奇怪的是,我刚刚发现我的CPU在预测方面要快得多。用GPU做推理比用CPU要慢得多。
我有tf.keras(tf2)NN模型,具有一个简单的密集层:
input = tf.keras.layers.Input(shape=(100,), dtype='float32')
X = X = tf.keras.layers.Dense(2)(input)
model = tf.keras.Model(input,X)
#also initiialized with weights from a file
weights = np.load("weights.npy", allow_pickle=True )
model.layers[-1].set_weights(weights)
scores = model.predict_on_batch(data)
对于100个样本进行预测,我得到:
2 s for GPU
0.07 s for CPU (!)
我使用的是一个简单的geforce mx150与2gb
我也尝试了一些人建议的predict_on_batch(x),因为它比预测更快,但这里是相同的时间。
参考:Why does keras model predict slower after compile?
有没有人知道,那里发生了什么?可能有什么问题?
1条答案
按热度按时间9njqaruj1#
使用GPU将数据加载到GPU内存(通过相对较慢的PCI总线)并返回结果会产生大量开销。为了使GPU比CPU更高效,模型必须非常大,拥有大量数据,并使用可以完全在GPU内部运行的算法,而不需要将部分结果移回CPU。
最佳配置取决于GPU内部的内存数量和内核数量,因此您必须进行一些测试,但以下规则适用:
1.神经网络的参数必须大于10k,训练数据集的记录数必须大于10k,否则,系统开销可能会影响GPU的性能
1.当您使用
model.fit
时,请使用较大的batch_size
(请注意,默认值只有32),可能包含整个数据集,或者至少是1024的倍数。请进行一些测试,以找到最适合您的值。1.对于某些GPU,它可能有助于在float16而不是float32中执行计算。请按照this tutorial了解如何激活它。
1.如果你的GPU有特定的Tensor核心,为了有效地使用它的硬件,一些数据必须是8的倍数。在前面的教程中,请参阅“确保使用GPUTensor核心”一节,哪些参数必须更改以及如何更改。一般来说,使用包含的神经元数量不是8的倍数的层是一个坏主意。
1.某些类型的层,即RNN,具有无法直接由GPU求解的架构。在这种情况下,数据必须不断地在CPU之间来回移动,速度会降低。如果确实需要RNN,Tensorflow v2提供了针对GPU优化的LSTM层实现,但存在一些参数限制:请参见this thread和documetation。
1.如果您正在训练强化学习,请激活体验回放,并使用至少大于10倍batch_size的内存缓冲区来存储体验。这样,只有当大量数据准备就绪时,您才会激活NN训练。
1.停用尽可能多的详细信息
如果一切都设置正确,则使用GPU训练模型的速度应该比使用CPU快。