相关疑难解决方法(0)

Tensorflow:同时预测GPU和CPU

我正在使用tensorflow,我想通过同时使用CPU和一个GPU 来加速预训练的Keras模型的预测阶段(我对训练阶段不感兴趣).

我尝试创建2个不同的线程,这些线程提供两个不同的tensorflow会话(一个在CPU上运行,另一个在GPU上运行).每个线程提供固定数量的批次(例如,如果我们总共有100个批次,我想在一个循环中为CPU分配20个批次,在GPU上分配80个,或者两者中任何可能的组合)并合并结果.如果拆分是自动完成的话会更好.

然而,即使在这种情况下,似乎批处理是以同步方式进行的,因为即使向CPU发送少量批次并计算GPU中的所有其他批次(以GPU作为瓶颈),我观察到整体预测时间是相对于仅使用GPU进行的测试,总是更高.

我希望它更快,因为当只有GPU工作时,CPU使用率约为20-30%,因此有一些CPU可用于加速计算.

我阅读了很多讨论,但它们都涉及多个GPU的并行性,而不是GPU和CPU之间的并行性.

以下是我编写的代码示例:以这种方式从同一个Keras模型加载tensor_cputensor_gpu对象:

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) 
Run Code Online (Sandbox Code Playgroud)

然后预测完成如下:

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()
Run Code Online (Sandbox Code Playgroud)

如何实现CPU/GPU并行化?我想我错过了什么.

任何形式的帮助将非常感谢!

python performance keras tensorflow

7
推荐指数
1
解决办法
4809
查看次数

标签 统计

keras ×1

performance ×1

python ×1

tensorflow ×1