gpt4 book ai didi

python - Tensorflow:在 GPU 和 CPU 上同时进行预测

转载 作者:太空狗 更新时间:2023-10-29 21:54:16 26 4
gpt4 key购买 nike

我正在使用 tensorflow,我想通过同时 CPU 和一个 GPU。

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

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

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

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

这是我编写的代码示例:tensor_cputensor_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 并行化?我想我错过了什么。

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

最佳答案

这是我的代码,演示了如何并行执行 CPU 和 GPU:

import tensorflow as tf
import numpy as np
from time import time
from threading import Thread

n = 1024 * 8

data_cpu = np.random.uniform(size=[n//16, n]).astype(np.float32)
data_gpu = np.random.uniform(size=[n , n]).astype(np.float32)

with tf.device('/cpu:0'):
x = tf.placeholder(name='x', dtype=tf.float32)

def get_var(name):
return tf.get_variable(name, shape=[n, n])

def op(name):
w = get_var(name)
y = x
for _ in range(8):
y = tf.matmul(y, w)
return y

with tf.device('/cpu:0'):
cpu = op('w_cpu')

with tf.device('/gpu:0'):
gpu = op('w_gpu')

def f(session, y, data):
return session.run(y, feed_dict={x : data})


with tf.Session(config=tf.ConfigProto(log_device_placement=True, intra_op_parallelism_threads=8)) as sess:
sess.run(tf.global_variables_initializer())

coord = tf.train.Coordinator()

threads = []

# comment out 0 or 1 of the following 2 lines:
threads += [Thread(target=f, args=(sess, cpu, data_cpu))]
threads += [Thread(target=f, args=(sess, gpu, data_gpu))]

t0 = time()

for t in threads:
t.start()

coord.join(threads)

t1 = time()


print t1 - t0

计时结果为:

  • CPU 线程:4-5 秒(当然会因机器而异)。

  • GPU 线程:5 秒(它做的工作是原来的 16 倍)。

  • 两者同时:5s

请注意,不需要进行 2 次 session (但这对我也很有效)。

您可能会看到不同结果的原因可能是

  • 一些系统资源争用(GPU 执行确实会消耗一些主机系统资源,如果运行 CPU 线程会使它拥挤,这可能会降低性能)

  • 时间不正确

  • 您的部分模型只能在 GPU/CPU 上运行

  • 其他地方的瓶颈

  • 一些其他问题

关于python - Tensorflow:在 GPU 和 CPU 上同时进行预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44255362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com