#python #ray
#python #ray
Вопрос:
Довольно новичок в ray, поэтому, пожалуйста, наберитесь терпения. Я создал следующий пример, чтобы проверить разницу во времени между лучевой и не лучевой реализацией простой арифметики изображений. Почему следующий код не выполняется параллельно? Я вижу на панели инструментов, что все загружается только одному рабочему
import ray
import cv2
import numpy as np
import time
ray.init(ignore_reinit_error=True)
@ray.remote
class image_import(object):
def __init__(self):
pass
def color(self):
return cv2.imread("frame30.png", flags=0)
def black(self):
return cv2.imread("frame30.png", flags=0)
def green(self):
return cv2.imread("frame30.png", flags=0)
def yellow(self):
return cv2.imread("frame30.png", flags=0)
def blue(self):
return cv2.imread("frame30.png", flags=0)
def orange(self):
return cv2.imread("frame30.png", flags=0)
def multiply_matrices_1(self,clr,b_1):
return np.dot(clr,b_1)
def multiply_matrices_2(self,b_2,b_3):
return np.dot(b_2,b_3)
def multiply_matrices_3(self,b_4,b_5):
return np.dot(b_4,b_5)
def multi_1(self,val_1,val_2):
return np.dot(val_1,val_2)
def multi_2(self,val_2):
return np.dot(val_2,val_2)
def multi_3(self,val_4,val_5):
return np.dot(val_4,val_5)
start = time.time()
counter_actor = image_import.remote()
clr= counter_actor.color.remote()
b_1= counter_actor.black.remote()
b_2= counter_actor.green.remote()
b_3= counter_actor.yellow.remote()
b_4= counter_actor.blue.remote()
b_5= counter_actor.orange.remote()
multi_1= counter_actor.multiply_matrices_1.remote(clr,b_1)
multi_2= counter_actor.multiply_matrices_2.remote(b_2,b_3)
multi_3= counter_actor.multiply_matrices_3.remote(b_3,b_4)
multi_4= counter_actor.multi_1.remote(multi_1,multi_2)
multi_5= counter_actor.multi_2.remote(multi_3)
addition= counter_actor.multi_3.remote(multi_4,multi_5)
results= ray.get(addition)
duration = time.time() - start
print(duration)
Ответ №1:
Вы создаете субъекта (удаленный объект вашего класса), и задачи актера выполняются последовательно:
https://docs.ray.io/en/master/walkthrough.html#calling-the-actor
Для параллельного выполнения просто избавьтесь от класса:
@ray.remote
def color(self):
return cv2.imread("frame30.png", flags=0)
@ray.remote
def black(self):
return cv2.imread("frame30.png", flags=0)
futures = [color.remote(), black.remote()] # Will execute in parallel
ray.get(futures)
Комментарии:
1. спасибо, Кай! Нам, новичкам, нужен этот первый толчок, чтобы начать работу 🙂