Почему я получаю PicklingError при распараллеливании задач с помощью Ray в Python?

Я пытаюсь запустить задание прогнозирования машинного обучения параллельно на огромном фрейме данных pandas. Похоже, что ray — хороший пакет для многопроцессорной обработки в Python. Это код:

model_path = './models/lr.pkl'
df = pd.read_csv('./data/input.csv')
dfs = np.array_split(df, 4)

features = ['item_text', 'description', 'amount']
ray.init()

@ray.remote
def predict(model_path, df, features):
    model = joblib.load(model_path)
    pred_df = model.predict(df[features])
    
    return pred_df

result_ids = []
for i in range(4):
    result_ids.append(predict.remote(model_path, dfs[i], features))
    
results = ray.get(result_ids) 

Когда я запустил его, я получил следующую ошибку:

PicklingError: args[0] from __newobj__ args has the wrong class 

Я так понимаю, args[0] относится к model_path. Это просто строка, почему неправильный класс? Что мне не хватает?


person ddd    schedule 27.06.2020    source источник
comment
Возможно, этот пост SO помогает. Если вы импортируете класс, который хотите загрузить в def, это может сработать.   -  person above_c_level    schedule 27.06.2020


Ответы (1)


Оказывается, удаленная функция не может принимать более двух аргументов. После того, как я объединил два статических аргумента, это сработало.

@ray.remote
def predict(df, args):
    model_path, features = args
    model = joblib.load(model_path)
    pred_df = model.predict(df[features])
    
    return pred_df

args = (model_path, features)
result_ids = []
for i in range(4):
    result_ids.append(predict.remote(dfs[i], args))
person ddd    schedule 03.07.2020
comment
Обратите внимание, что вы также можете добавить num_return_vals к @ray.remote(num_return_vals=2) - person Sang; 07.07.2020