Ich arbeite mit tensorflow und ich mag die Vorhersage Phase eines vortrainiert Keras Modells beschleunigen (Ich bin in der Trainingsphase nicht interessiert) von gleichzeitig mit die CPU und eine GPU.Tensorflow: gleichzeitige Vorhersage auf GPU und CPU
Ich habe versucht, 2 verschiedene Threads zu erstellen, die zwei verschiedene Tensorflow-Sitzungen (eine, die auf der CPU und die andere, die auf GPU ausgeführt wird) führen. Jeder Thread füttert eine feste Anzahl von Batches (z. B. wenn wir insgesamt 100 Batches haben, möchte ich 20 Batches für CPU und 80 für GPU zuweisen, oder jede mögliche Kombination der beiden) in einer Schleife und kombiniere das Ergebnis. Es wäre besser, wenn die Aufteilung automatisch erfolgt.
Aber selbst in diesem Szenario scheint es, dass die Chargen auf eine synchrone Art und Weise gefüttert werden, weil sogar einige Chargen an die CPU gesendet und alle anderen in der GPU (mit der GPU als Flaschenhals) berechnet wurden Die Gesamtvorhersagezeit ist immer höher in Bezug auf den Test, der nur unter Verwendung der GPU durchgeführt wird.
Ich würde erwarten, dass es schneller sein wird, denn wenn nur die GPU arbeitet, ist die CPU-Auslastung etwa 20-30%, daher ist etwas CPU verfügbar, um die Berechnung zu beschleunigen.
Ich lese viele Diskussionen, aber sie alle befassen sich mit Parallelität mit mehreren GPUs und nicht zwischen GPU und CPU. Hier
ist ein Beispiel für den Code habe ich geschrieben: die tensor_cpu
und tensor_gpu
Objekte aus dem gleichen Keras Modell auf diese Weise geladen:
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)
Dann ist die Vorhersage, wie folgend getan wird:
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()
Wie kann ich diese CPU/GPU-Parallelisierung erreichen? Ich denke, ich vermisse etwas.
Jede Art von Hilfe wäre sehr willkommen!
Habe ich Ihre Frage beantwortet? – MaxB
Ja, ja, ja !! Es tut mir leid für die späte Antwort, ich war mit einem anderen Projekt beschäftigt und ich hatte keine Zeit, das auszuprobieren. Ich habe Ihren Code überprüft .. könnte es sein, dass der einzige Grund, warum es nicht funktioniert hat, die Option intra_op_parallelism_thread? – battuzz
Irgendeine Idee, wie ich Tensorflow finden kann, die richtige Menge von Chargen zu CPU und GPU zu füttern, so dass ich die gesamte Vorhersagezeit minimieren kann? – battuzz