以数据帧作为输入的模型上的多重处理

2024-03-31

我想在模型上使用多重处理,以使用数据帧作为输入来获得预测。我有以下代码:

def perform_model_predictions(model, dataFrame, cores=4): 
    try:
        with Pool(processes=cores) as pool:
            result = pool.map(model.predict, dataFrame)
            return result
        # return model.predict(dataFrame)
    except AttributeError:
        logging.error("AttributeError occurred", exc_info=True)

我收到的错误是:

raise TypeError("sparse matrix length is ambiguous; use getnnz()"
TypeError: sparse matrix length is ambiguous; use getnnz() or shape[0]

我认为问题在于我将数据帧作为第二个参数传递给pool.map功能。任何建议或帮助将不胜感激。


诀窍是将数据帧分割成块。map期望将要处理的对象列表model.predict。这是一个完整的工作示例,模型明显被嘲笑:

import numpy as np
import pandas as pd
from multiprocessing import Pool

no_cores = 4

large_df = pd.concat([pd.Series(np.random.rand(1111)), pd.Series(np.random.rand(1111))], axis = 1)
chunk_size = len(large_df) // no_cores + no_cores
chunks = [df_chunk for g, df_chunk in large_df.groupby(np.arange(len(large_df)) // chunk_size)]

class model(object):
    @staticmethod
    def predict(df):
        return np.random.randint(0,2)

def perform_model_predictions(model, dataFrame, cores): 
    try:
        with Pool(processes=cores) as pool:
            result = pool.map(model.predict, dataFrame)
            return result
        # return model.predict(dataFrame)
    except AttributeError:
        logging.error("AttributeError occurred", exc_info=True)

perform_model_predictions(model, chunks, no_cores)

请注意,此处选择的块数量应与核心数量(或您想要分配的任何数量)相匹配。这样每个核心都能获得公平的份额multiprocessing不会在对象序列化上花费太多时间。

如果您想处理每一行(pd.Series)单独而言,序列化所花费的时间可能是一个问题。在这种情况下我建议使用joblib并阅读其各种后端的文档。我没有写它,因为你似乎想调用预测pd.Dataframe.

额外警告

有可能发生这样的情况multiprocessing,不但不会让你有更好的表现,反而会让你的表现变得更糟。它发生在相当罕见的情况下,当你model.predict调用本身产生线程的外部模块。我写了关于这个问题的文章here https://stackoverflow.com/questions/54731815/multiprocessing-pool-slow-when-calling-external-module/54756707#54756707。长话短说,joblib再次可能是一个答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以数据帧作为输入的模型上的多重处理 的相关文章

随机推荐