Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pool.apply\u async测试ML模型的并行处理不允许访问结果_Python_Multiprocessing_Apply Async - Fatal编程技术网

Python 使用pool.apply\u async测试ML模型的并行处理不允许访问结果

Python 使用pool.apply\u async测试ML模型的并行处理不允许访问结果,python,multiprocessing,apply-async,Python,Multiprocessing,Apply Async,我有一个270万个样本的数据集,我需要在上面测试我的ML模型。我的笔记本电脑上有8个内核,我想尝试并行化我的测试代码以节省时间。这是测试功能: def testMTGP(x_sample, y_sample, ind, model, likelihood): x_sample = x_sample.view(1, -1) y_sample = y_sample.view(1, -1) model.eval() likelihood.eval() with

我有一个270万个样本的数据集,我需要在上面测试我的ML模型。我的笔记本电脑上有8个内核,我想尝试并行化我的测试代码以节省时间。这是测试功能:

def testMTGP(x_sample, y_sample, ind, model, likelihood):
    x_sample = x_sample.view(1, -1)
    y_sample = y_sample.view(1, -1)
    model.eval()
    likelihood.eval()
    with torch.no_grad():
        prediction = likelihood(model(x_sample))
        mean = (prediction.mean).detach().numpy()
        prewhiten_error = (y_sample.detach().numpy()) - mean
        cov_matrix = (prediction.covariance_matrix).detach().numpy()
        white_error, matcheck = Whiten(prewhiten_error, cov_matrix)
    return (
        ind,
        {
            "prediction": mean,
            "prewhiten_error": prewhiten_error,
            "white_error": white_error,
            "cov_matrix": cov_matrix,
            "matcheck": matcheck,
        },
    )
我返回与我测试的样本对应的索引,以及与模型为测试所做的计算相关的数据字典。函数
Whiten(prewhiten\u error,cov\u matrix)
也由我定义,并在代码文件的开头导入,因此它是全局可用的。它只需获取输入,转换
cov_矩阵
,并将其与
prewhiten_error
相乘,然后返回答案,以及一个表示有关
cov_矩阵
的一些状态信息的变量

对于多处理,其思想是首先将整个数据集划分为大小大致相等的块;选取每个区块,并向每个岩芯发送一个样本进行处理。我正在使用
池。应用\u async
。代码如下:

test_X = torch.load(test_X_filename) #torch tensor of shape 2.7M x 3
test_Y = torch.load(test_Y_filename) #torch tensor of shape 2.7M x 3
cores = mp.cpu_count()
chunk_size = int(test_X.shape[0] / cores)
start_time = time.time()
parent_list = []
for start_ind in range(0, test_X.shape[0], chunk_size):
    pool = mp.Pool(processes=cores)
    proc_data_size = int(chunk_size / cores)
    stop_ind = min(test_X.shape[0], start_ind + chunk_size)
    results = [
        pool.apply_async(
            testMTGP, (test_X[i].detach(), test_Y[i].detach(), i, model, likelihood,)
        )
        for i in range(start_ind, stop_ind)
    ]
    for res in results:
        print("Length of results list= ", len(results))
        print("Data type of res is: ", type(res))
        res_dict = res.get()
        parent_list.append(res_dict)
    pool.close()
test\ux[i]
test\uy[i]
都是形状为
(3,)
的张量。在执行我得到的代码时:

回溯(最近一次呼叫最后一次):
文件“multiproc_async.py”,第288行,在
res_dict=res.get()#[1]
文件 “/home/aman/anaconda3/envs/thesis/lib/python3.8/multiprocessing/pool.py”, get中的第771行
提高自我价值
文件 “/home/aman/anaconda3/envs/thesis/lib/python3.8/multiprocessing/pool.py”, 第537行,在处理任务中
放置(任务)
文件 “/home/aman/anaconda3/envs/thesis/lib/python3.8/multiprocessing/connection.py”, 第206行,在发送中
self.\u发送\u字节(\u ForkingPickler.dumps(obj))
文件 “/home/aman/anaconda3/envs/thesis/lib/python3.8/multiprocessing/reduce.py”, 第51行,在转储中
cls(buf,协议).dump(obj)
AttributeError:无法pickle本地对象 多任务GaussianLikelihood.__
init__;..


我不熟悉多处理,谷歌搜索这个错误并没有真正的帮助(有些错误与我无关,有些则超出了我的理解)。有人能帮我理解我犯了什么错误吗?

让我们把你的问题简化为根本原因。对于多处理部分,我们需要一个工作示例,否则我们没有可复制的示例来帮助您。然后,您可以在实际训练中修补模型

让我们使用这个虚拟函数:

def testMTGP(x_sample, y_sample, ind, model, likelihood):
    return (
        ind,
        {
            "prediction": 1,
            "prewhiten_error": 1,
            "white_error": 1,
            "cov_matrix": 1,
            "matcheck": 1,
        },
    )
那么,一个有效且干净的例子是:

if __name__ == '__main__':
    cores = mp.cpu_count()
    args = [(None, None, i, None, None,) for i in range(0, 5)]

    start_time = time.time()
    with mp.Pool(processes=3) as pool:
        results = pool.starmap(testMTGP, args)
        
    end_time = time.time()
    
    print(results)
    print("it took %s" % (end_time-start_time))
试着这样做,一点一点地,引入训练模型所需的实际逻辑。我建议您从每次传递所需的实际参数开始,并在结束时更新testMTGP函数(替换伪函数)


当您分离出导致代码崩溃的原因和/或发布堆栈跟踪时,我可以提供更多帮助。

这个问题相当复杂,我从未使用过Torch,而且我绝不是多处理方面的专家。但我确实对这里的概念有相当的理解,所以我会尽我所能解释什么是错误的,但你可能需要提出解决方案,因为这取决于你的最终目标

注意:我注意到您只是在键入python。看起来这是一个Windows商店版的Ubuntu,如果是这样的话,你可能想用python3运行这个程序。(如果已映射别名,请忽略。)

因此stacktrace中的最后一个错误,
无法选择本地对象“多任务高斯相似性”;这是指作为序列化程序库的库。如果您不熟悉seralization,它基本上是跨系统重建某些内容的标准格式。例如,JSON是一个非常常见的序列化程序;它允许您将多个变量作为数组跨多种编程语言传输。Pickle允许对象的searlization,以便将它们传输到另一个程序。我相信这里之所以要序列化是因为python中的功能有限,内核之间可以相互通信,这在多处理文档中都很明显

问题是多任务GaussianLikelihood类似乎使用lambda作为其参数之一,根据AttributeError,pickle无法对lambda进行序列化。这意味着它不能序列化多任务GaussianLikeLikhood,因为它包含一个。我这里没有所有的代码,所以我看不到多任务GaussianLikeLikhood对象在您的返回中的位置,但是我想说的是,您需要从该类中提取所有需要的信息并返回该数据,而不是返回该类并在事后提取它


希望我解释得很好

请将堆栈跟踪作为文本而不是图像发布。此外,建议使用上下文管理器而不是池,pool.close(
与multiprocessing.pool(processs=3)一起作为池: