繁体   English   中英

python 并行处理在一个内核上运行所有任务 - 多处理,射线

[英]python parallel processing running all tasks on one core - multiprocessing, ray

我有一个model.predict()方法和 65536 行数据,大约需要 7 秒才能执行。 我想通过这个例子使用joblib.parallel_backend工具来加速这个过程。

这是我的代码:

import numpy as np
from joblib import load, parallel_backend
from time import clock as time

from urllib.request import urlopen

NN_model=load(urlopen("http://clima-dods.ictp.it/Users/tompkins/CRM/nnet_3var.jl"))

npt=65536
t=np.random.uniform(low=-1,high=1,size=npt)
u=np.random.uniform(low=-1,high=1,size=npt)
q=np.random.uniform(low=-1,high=1,size=npt)
X=np.column_stack((u,t,q))

t0=time()
out1=NN_model.predict(X)os.system('taskset -cp 0-%d %s' % (ncore, os.getpid()))

t1=time()
print("serial",t1-t0)
with parallel_backend('threading', n_jobs=-1):
    out2=NN_model.predict(X)
t2=time()
print("parallel",t2-t1)

这些是我的时间安排:

serial   6.481805
parallel 6.389198

我从过去的经验中知道,由于开销,并行共享 memory 技术不会加速非常小的任务, 这里也发布了答案,但这里不是这种情况,因为工作是 7 秒,应该远远超过任何高架。 事实上,我跟踪了机器上的负载,它似乎只是在串行运行。

我对joblib规范做错了什么? 如何在我的桌面上使用线程来将此任务与joblib (或替代方法)并行化?


编辑 1

从下面的帖子中,我想知道 joblib 的应用程序是否尝试将并行化应用于 model 本身,而不是将数据行划分为 ncore 批次以分发到每个核心。 因此,我决定也许我需要自己手动进行这个划分,并将数据“块”分配给每个核心。 因此,我尝试使用 now Parallel 和 delay 代替, 按照这篇文章对数据进行分块

from joblib import Parallel, delayed 

ncore    = 8
nchunk   = int( npt / ncore )
parallel = Parallel( n_jobs = ncore )
results  = parallel( delayed( NN_model.predict )
                            ( X[i*nchunk:(i+1)*nchunk,:] )
                     for i in range( ncore )
                     )

这现在在我的机器上运行ncore -instances,但它们都以1 / ncore效率运行(好像它是门控?)并且挂钟仍然没有改善......


编辑 2

作为替代方案,我现在还尝试使用多处理 package 对数据集进行手动划分,

import  multiprocessing 
def predict_chunk(Xchunk):
    results=NN_model.predict(Xchunk)
    return (results)

pool=multiprocessing.Pool(processes=ncore)
os.system('taskset -cp 0-%d %s' % (ncore, os.getpid()))
stats=pool.starmap(predict_chunk,([X[i*nchunk:(i+1)*nchunk,:]] for i in range(ncore)))
res=np.vstack(stats).flatten()
pool.close()
pool.join()

除了划分输入数据和重新堆叠结果的开销之外,这个问题应该是令人尴尬的并行。 然后我回想起之前的帖子,想知道性能缓慢的问题是否是由于在导入 numpy 时出现的任务关联问题,所以我添加了os.system命令,但这似乎没有帮助,我仍然让 8 个内核中的每一个都使用大约 12% 的 CPU 负载,并且由于上述开销,现在的整体时序比串行解决方案略慢。


编辑 3

我现在尝试使用ray代替

import ray

@ray.remote
def predict_chunk(Xchunk,start,end):
    results=NN_model.predict(Xchunk[start:end,:])
    return (results)

ray.init(num_cpus=ncore)
data_id=ray.put(X)
stats=ray.get([predict_chunk.remote(data_id,i*nchunk,(i+1)*nchunk) for i in range(ncore)])
res=np.vstack(stats).flatten()

同样,这会创建 8 个子进程,但它们都在单个 CPU 上运行,因此并行进程比串行进程慢。

我几乎可以肯定这与上面提到的亲和力问题有关,但解决方案似乎不起作用。

这是架构的摘要:

Linux hp6g4-clima-5.xxxx.it 4.15.0-124-generic #127-Ubuntu SMP Fri Nov 6 10:54:43 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

“我在使用joblib规范时做错了什么?”

最大的罪过(被 FORTRAN 的历史所原谅, COMMON块的巧妙使用拥有无与伦比的美感)
是,
您假设基于进程的 Python 并行性保持共享内存的并行性,这不是基于非进程的 forms 的只是[CONCURRENT]处理流程,您假设它执行得更快(好像它是确实能够从任何数量的基于线程的代码执行的中央 GIL 锁重新[SERIAL]化回到小时间配额驱动的垄断、纯[SERIAL]的幼稚序列(因此并发主要避免)处理,它是(由于python传福音的原因)不是)

“我如何在我的桌面上使用线程来将这个任务与joblib (或替代方案)并行化?”

您的代码没有这种方法。

Python 线程是 python 中计算密集型和繁重的内存 I/O 绑定工作负载的不可行方法。

如果需要更多阅读,请随意阅读这个,也许这个,并使用lstopo尝试您的系统 NUMA-map 详细信息,并与这个对抗。


讨论:

正如时间所暗示的:

serial   6.481805
parallel 6.389198

“改进”不超过 1.5%,但在相同的“运行时”差异范围内也存在其他 O/S 进程噪声,只有少量内存 I/O 访问可能会享受一些有意义的延迟屏蔽,当您在 neural-network 内操作矩阵重的许多-MUL/许多-ADD (变压器)时。


主要小姐:

早在 1972 年,一位METEO大师、数学家和气象学家 Edward N. LORENZ在他在美国科学促进协会第 139 次会议,就在 1972 年 12 月 29 日这一天

在此处输入图像描述

神经网络适用于无模型(统计合理,因为只是惩罚最少)的猜测,非关键对象的分类(人类很快就会疲倦或无法看到/听到破坏性的“隐藏”模式大量样本可供“学习”——否则,我们人类在模式识别和即时“学习”方面非常出色。进化之母已经开发了我们的认知装置,可以非常高效(能量)且显着地做到这一点分层 - 在香蕉池中找到由橙子描绘的“一只猫”)

在所有(已知的)模型驱动领域中“使用”神经网络,抱歉,这本身就是一个可怕的罪过。

当然,热力学模型、状态变化模式、湿度/温度/压力/离子相互作用特定的大气模型很复杂,但已知且物理学不是惩罚驱动的猜测(neural-network 传播许多-MULs/许多-ADDs (变压器)声称盲目地“擅长”)。

当然,我们可以花费无限的 HPC 预算、无限的研发能力,但在相同的时间、能量(是的,HPC-基础设施玩具消耗大量能量用于计算(将其直接转化为散热)和冷却(将另一大量能量转化为冷却 HPC 基础设施在进行任何类型的数字运算游戏时散发的废热(无论他们是否明智)在前面的步骤中)。

最后但同样重要的是,正如中学年级学生应该已经知道的那样,MUL-s/ADD-s 增加了主要不确定性的传播(不仅是由于浮点 IEEE 指定的值存储的限制)。 在这样的过程之后,“结果”的不确定性比输入要差几个数量级。 这是用于 HPC 计算的已知字母表,因此需要提醒您注意,但将 NN- many -MUL/ many -ADD (变压器)引入任何类型的预测系统,对于远程预测系统(如气候进化或天气接近铸造)是一种可怕的反模式(即使它可能从欧盟机构或硬件供应商(又名技术营销)那里获得丰厚的资金 - 抱歉,数字不是这样工作的,负责任的科学家不应该关闭我们的眼睛从这些主要的差距,如果不是有偏见的认知操纵,更不要称之为故意传播的谎言)

在此处输入图像描述

给出尽可能简单的例子,取任何基于模型的超简单混沌吸引子,无论是 { Duffy | 洛伦兹}-一,

在此处输入图像描述
因为我们“知道”精确的 model(因此我们可以计算和模拟不确定性的时空精确演化)及其参数,这给了我们一个独特的机会来使用这些演示器向我们展示,(已知的、可重复的和可检查的)解决方案会因任何和所有不精确和不确定性(在此讨论)的自然传播而受到破坏,因为我们可以在数值模拟的同时定量地“显示”不确定性的增长范围
像这样的未知的经验模型(近似和许多隐藏的自由度被过度简化的模型越少),我们永远不会感到舒适
在此处输入图像描述
它们在视觉上令人印象深刻,可能会因为它们看起来如此可接受而被俘虏(我们有零机会及时审查模型结果与现实的对比,我们不能重复整个现实来重新审查 model 等的增量,所以我们只是让别人“相信”
现在,出于这些原因,让我们转向“已知”的 model 演示器,以及
添加任何微量的初始数据不确定性 - 在 position 中,在速度上,在时间步长上(作为各种持续存在和不可避免的观察的抽象共存/读数的系统+随机误差不精确,数据时间不一致-采集/同化等),你很快就会得到相同的模拟工作,但现在有了“新的”-dataPOINT,但这些很快开始承受越来越大,直到很快它们各自主要相关的不确定性的无限范围(X , Y, Z 位置, dX/dt, dY/dt, dZ/dt 速度), 这使它们的意义较小。

有没有被认真接受的科学领域,
那可以使
任何严重使用DataPOINT == 17.3476 ± ∞

许多-MULs/许多-ADDs (变压器)生产得如此之快?

严谨的科学和批判性思维应该有更多的空间,不是吗?

量子点

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM