Pracuję z tensorflow i chcę przyspieszyć fazę przewidywania fazę wcześniej wyszkolonego modelu Keras (nie jestem zainteresowany fazą szkolenia), używając jednocześnie procesor i jeden procesor graficzny.Tensorflow: przewidywania symultaniczne na GPU i procesorze
Próbowałem utworzyć 2 różne wątki, które zasilają dwie różne sesje tensorflow (jedna działająca na procesorze, a druga działająca na GPU). Każda nić podaje stałą liczbę partii (np. Jeśli mamy ogółem 100 partii, chcę przypisać 20 partii procesora i 80 na GPU lub jakąkolwiek możliwą kombinację tych dwóch) w pętli i połączyć wynik. Byłoby lepiej, gdyby podział został wykonany automatycznie.
Jednak nawet w tym scenariuszu wydaje się, że partie są podawane w sposób synchroniczny, ponieważ nawet wysyłanie kilku partii do procesora i obliczanie wszystkich pozostałych w GPU (z wykorzystaniem GPU jako wąskiego gardła) zauważyłem, że ogólny czas przewidywania jest zawsze wyższy w odniesieniu do testu wykonanego wyłącznie za pomocą GPU.
Spodziewałabym się, że jest to szybsze, ponieważ gdy działa tylko GPU, zużycie procesora wynosi około 20-30%, dlatego jest dostępny procesor do przyspieszenia obliczeń.
Przeczytałem wiele dyskusji, ale wszystkie dotyczą paralelizmu z wieloma procesorami graficznymi, a nie między procesorem graficznym a procesorem.
Oto przykładowy kod mam napisane: że tensor_cpu
i tensor_gpu
obiekty są ładowane z tego samego modelu Keras w następujący sposób:
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)
Następnie przewidywanie odbywa się w następujący sposób:
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()
Jak mogę osiągnąć to zrównoleglenie CPU/GPU? Chyba coś mi brakuje.
Wszelkiego rodzaju pomoc byłaby bardzo ceniona!
Czy odpowiedziałem na Twoje pytanie? – MaxB
Tak, tak, tak !! Przykro mi z powodu późnej odpowiedzi, byłem zajęty innym projektem i nie miałem czasu, aby to wypróbować. Sprawdziłem twój kod. Czy to możliwe, że jedynym powodem, dla którego to nie zadziałało, była opcja intra_op_parallelism_thread? – battuzz
Każdy pomysł, w jaki sposób mogę pozwolić tensorflow znaleźć odpowiednią ilość partii do zasilania procesora i GPU, dzięki czemu mogę zminimalizować całkowity czas przewidywania? – battuzz