为什么在Python中使用Ray并行化任务时会出现PicklingError?

为什么在Python中使用Ray并行化任务时会出现PicklingError?,python,pandas,multiprocessing,ray,Python,Pandas,Multiprocessing,Ray,我试图在一个巨大的pandasdataframe上并行运行一个机器学习预测作业。看起来,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 predi

我试图在一个巨大的
pandas
dataframe上并行运行一个机器学习预测作业。看起来,
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\u路径
。这只是一个字符串,为什么错了类?我遗漏了什么?

原来远程函数不能接受两个以上的参数。在我将这两个静态参数组合在一起之后,它就工作了

@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))

结果证明远程函数不能接受两个以上的参数。在我将这两个静态参数组合在一起之后,它就工作了

@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))

也许有帮助。如果导入要加载到def中的类,它可能会起作用。可能会有帮助。如果导入要在def中加载的类,则可能会起作用。请注意,您还可以将
num\u return\u vals
添加到@ray.remote(num\u return\u vals=2)请注意,您还可以将
num\u return\u vals
添加到@ray.remote(num\u return\u vals=2)