我正在使用Tensorflow,并希望通过同时使用CPU和一个GPU来加速预先训练的Keras模型的预测阶段(不关心训练阶段)。
我尝试创建两个不同的线程,分别提供两个不同的TensorFlow会话(一个在CPU上运行,另一个在GPU上运行)。每个线程以循环方式提供一定数量的批次(例如,如果总共有100个批次,则我想将20个批次分配给CPU,80个批次分配给GPU,或任何可能的组合),然后将结果组合起来。最好自动进行拆分。
然而,即使在这种情况下,似乎批次是以同步方式提供的,因为即使将少量批次发送到CPU并在GPU上计算所有其他批次(以GPU为瓶颈),我观察到总体预测时间始终高于仅使用GPU进行测试的时间。
我期望它更快,因为当只有GPU在工作时,CPU使用率约为20-30%,因此有一些CPU可用于加速计算。
我阅读了很多讨论,但它们都处理使用多个GPU进行并行处理,而不是在GPU和CPU之间进行并行处理。
以下是我编写的代码示例:在这种方式下,tensor_cpu
和tensor_gpu
对象从同一Keras模型中加载:
with tf.device('/gpu:0'):
model_gpu = load_model('model1.h5')
tensor_gpu = model_gpu(x)
with tf.device('/cpu:0'):
model_cpu = load_model('model1.h5')
tensor_cpu = model_cpu(x)
然后按以下方式进行预测:
def predict_on_device(session, predict_tensor, batches):
for batch in batches:
session.run(predict_tensor, feed_dict={x: batch})
def split_cpu_gpu(batches, num_batches_cpu, tensor_cpu, tensor_gpu):
session1 = tf.Session(config=tf.ConfigProto(log_device_placement=True))
session1.run(tf.global_variables_initializer())
session2 = tf.Session(config=tf.ConfigProto(log_device_placement=True))
session2.run(tf.global_variables_initializer())
coord = tf.train.Coordinator()
t_cpu = Thread(target=predict_on_device, args=(session1, tensor_cpu, batches[:num_batches_cpu]))
t_gpu = Thread(target=predict_on_device, args=(session2, tensor_gpu, batches[num_batches_cpu:]))
t_cpu.start()
t_gpu.start()
coord.join([t_cpu, t_gpu])
session1.close()
session2.close()
我怎样才能实现CPU/GPU并行化?我觉得我错过了什么。
任何形式的帮助都将不胜感激!