问题标签 [embarrassingly-parallel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 使用 Python 多处理解决令人尴尬的并行问题
令人尴尬的并行问题通常由三个基本部分组成:
- 读取输入数据(从文件、数据库、tcp 连接等)。
- 对输入数据运行计算,其中每个计算独立于任何其他计算。
- 将计算结果写入(到文件、数据库、tcp 连接等)。
我们可以在两个维度上并行化程序:
- 第 2 部分可以在多个内核上运行,因为每个计算都是独立的;处理顺序无关紧要。
- 每个部分都可以独立运行。第 1 部分可以将数据放入输入队列,第 2 部分可以从输入队列中拉出数据并将结果放入输出队列,第 3 部分可以从输出队列中拉出结果并将其写出。
这似乎是并发编程中最基本的模式,但我仍然在尝试解决它时迷失了方向,所以让我们编写一个规范的示例来说明如何使用 multiprocessing 来完成。
这是示例问题:给定一个以整数行作为输入的CSV 文件,计算它们的总和。将问题分成三个部分,它们都可以并行运行:
- 将输入文件处理为原始数据(整数列表/可迭代)
- 并行计算数据的总和
- 输出总和
下面是解决这三个任务的传统单进程绑定 Python 程序:
让我们使用这个程序并重写它以使用多处理来并行化上述三个部分。下面是这个新的并行程序的骨架,需要充实以解决注释中的部分:
可以在 github 上找到这些代码,以及可以生成示例 CSV 文件以进行测试的另一段代码。
我将不胜感激您对并发专家如何解决此问题的任何见解。
以下是我在思考这个问题时遇到的一些问题。解决任何/所有问题的奖励积分:
- 我应该有子进程来读取数据并将其放入队列中,还是主进程可以在读取所有输入之前不阻塞地执行此操作?
- 同样,我应该有一个子进程来将结果从已处理队列中写出来,还是主进程可以这样做而不必等待所有结果?
- 我应该使用进程池进行求和操作吗?
- 如果是,我应该在池上调用什么方法来让它开始处理进入输入队列的结果,而不阻塞输入和输出进程?应用异步()?地图异步()?地图()?imap_unordered()?
- 假设我们不需要在数据进入时从输入和输出队列中抽出,而是可以等到所有输入都被解析并计算出所有结果(例如,因为我们知道所有输入和输出都将适合系统内存)。我们是否应该以任何方式更改算法(例如,不要在 I/O 的同时运行任何进程)?
java - JVM(尴尬地)并行处理库/工具
我正在寻找可以在集群上轻松运行(正确编码)令人尴尬的并行 JVM 代码的东西(以便我可以使用 Clojure + Incanter)。
我过去曾使用 Parallel Python 来执行此操作。我们有一个新的 PBS 集群,我们的管理员将很快设置使用 PBS 作为后端的 IPython 节点。这两个系统都使得在集群中运行某些类型的代码几乎是一件轻而易举的事。
过去我犯了使用 Hadoop 的错误(Hadoop 只是不适合我使用的那种数据)——延迟使得即使是小的运行也要执行 1-2 分钟。
JPPF 或 Gridgain 是否更适合我的需求?这里有没有人有任何经验?你还有什么可以推荐的吗?
python - 在集群上使用 python 和 PBS 进行“令人尴尬的并行”编程
我有一个生成数字的函数(神经网络模型)。我希望在带有 Torque 的标准集群上使用 PBS 从 python 测试几个参数、方法和不同的输入(意味着函数的数百次运行)。
注意:我尝试了 parallelpython、ipython 等,但从未完全满意,因为我想要更简单的东西。集群处于我无法更改的给定配置中,这种集成 python + qsub 的解决方案肯定会对社区有益。
为了简化事情,我有一个简单的功能,例如:
其中input
是表示输入的对象,input.name
是字符串,并且do_lots_number_crunching
可能持续数小时。
我的问题是:是否有正确的方法来转换诸如参数扫描之类的东西
进入“某事”会为每次调用该model
函数启动一个 PBS 脚本?
我正在考虑一个包含 PBS 模板并从 python 脚本中调用它的函数,但还无法弄清楚(装饰器?)。
c - 在运行令人尴尬的并行作业时,避免并行文件系统过载的最佳方法是什么?
我们有一个令人尴尬的并行问题——我们运行单个程序的大量实例,每个实例具有不同的数据集;我们只需将应用程序多次提交到批处理队列,每次使用不同的参数即可。
然而,由于有大量工作,并非所有工作都完成。队列中似乎没有问题 - 所有作业都已启动。
问题似乎在于,在运行大量应用程序实例的情况下,许多作业大致同时完成,因此都试图几乎同时将它们的数据写入并行文件系统。
然后问题似乎是程序无法写入文件系统并以某种方式崩溃,或者只是坐在那里等待写入并且批处理队列系统在等待太久后终止了作业。(从我收集到的问题来看,大多数未能完成的工作,如果不是全部,不要留下核心文件)
安排磁盘写入以避免此问题的最佳方法是什么?我提到我们的程序是令人尴尬的并行,以强调每个进程都不知道其他进程的事实——它们不能相互交谈以以某种方式安排他们的写入。
虽然我有该程序的源代码,但我们希望解决问题而无需尽可能修改它,因为我们不维护或开发它(加上大多数评论都是意大利语)。
我对这个问题有一些想法:
- 每个作业首先写入节点的本地(暂存)磁盘。然后我们可以运行另一个作业,它不时检查哪些作业已完成并将文件从本地磁盘移动到并行文件系统。
- 在主/从系统中围绕程序使用 MPI 包装器,其中主管理作业队列并将这些作业分配给每个从属;并且从属包装器运行应用程序并捕获异常(我可以可靠地为 C++ 或 Java 中的文件系统超时执行此操作吗?),并将消息发送回主控器以重新运行作业
与此同时,我需要向我的主管询问有关错误本身的更多信息——我个人从未遇到过它,但我还没有必要将程序用于大量数据集。
如果有用:我们在 HPC 系统上使用 SGE(Sun GridEngine)批处理队列系统运行 Solaris。文件系统是 NFS4,存储服务器也运行 Solaris。HPC 节点和存储服务器通过光纤通道链路进行通信。
matlab - Matlab dfeval 开销
我有一个令人尴尬的并行工作,不需要工人之间的沟通。我正在尝试使用 dfeval 函数,但开销似乎很大。首先,我正在尝试运行文档中的示例。
运行后续时间会产生类似的时间。所以我的问题是:
- 鉴于我在新实例中运行 matlabpool open,为什么我需要运行 matlabpool close force local 以使 Number Running 为零?
- 对于这样一个微不足道的例子,真的需要 5 秒的开销吗?特别是考虑到 Matlab 工作人员已经启动?
optimization - 带有矩阵和向量的 OpenMP
将 OpenMP 与矩阵向量乘积结合使用的最佳方式是什么?for 指令是否足够(如果是的话,我应该把它放在哪里?我假设外循环会更有效)还是我需要调度等......?
另外,我将如何利用不同的算法来最有效地尝试这个 mv 产品?
谢谢
bash - 令人尴尬的并行工作流创建了太多的输出文件
在 Linux 集群上,我运行许多 ( N > 10^6
) 独立计算。每次计算只需要几分钟,输出是几行。很小的时候N
,我能够将每个结果存储在一个单独的文件中,以便以后解析。N
但是,我发现我在浪费存储空间(用于文件创建),并且由于 bash: 的内部限制,像需要ls
特别小心的简单命令-bash: /bin/ls: Argument list too long
。
每个计算都需要通过qsub
调度算法运行,因此我无法创建一个简单地将输出数据聚合到单个文件的主程序。当两个程序同时完成并交错输出时,附加到单个的简单解决方案会失败。我没有对集群的管理员访问权限,因此不能选择安装系统范围的数据库。
如何在令人尴尬的并行计算变得无法管理之前整理输出数据?
grid - 是否有适用于 Google Compute Engine (GCE) 的 Starcluster?
有谁知道 GCE 是否有 Starcluster 等价物?我很高兴将 Starcluster 与 EC2 一起用于令人尴尬的并行作业。现在我想试试 GCE。我很乐意为正在进行的任何项目做出贡献,但我没有找到任何东西。
现在,我想我会手动安装我需要的软件(即 Open Grid Engine)并生成一个副本图像。不太难,但我想我会先检查这里。
amazon-ec2 - 内存密集型作业在多核云实例(ec2、gce、机架空间)上的扩展性很差?
在扩展以使用具有一定内存密集型作业(在我的情况下为 2.5GB)的云实例上的所有内核时,是否有其他人注意到糟糕的性能?
当我在我的四核至强芯片上本地运行作业时,使用 1 个内核和所有 4 个内核之间的差异是所有内核的速度降低了大约 25%。据我了解,这是可以预料的;随着内核用完,时钟频率下降是多核芯片设计的一部分。
但是,当我在多核虚拟实例上运行作业时,我发现使用 1 个内核和所有内核之间的处理时间减慢了 2 到 4 倍。我在 GCE、EC2 和 Rackspace 实例上看到了这一点。而且我已经测试了许多不同的实例类型,主要是提供的最快的。
那么其他具有相同大小的内存使用量的工作的其他人是否看到过这种行为?
我正在运行的作业是用 fortran 编写的。我没有写它们,我也不是一个真正的 fortran 人,所以我对它们的了解是有限的。我知道他们的 I/O 需求很低。当我在它们运行时观察它们时,它们似乎受 CPU 限制。它们无需相互通信即可运行,即,令人尴尬的并行。它们每个占用大约 2.5GB 的内存。
所以到目前为止,我最好的猜测是,消耗这么多内存的作业会受到虚拟化层内存管理的巨大打击。也可能是我的工作正在争夺 I/O 资源,但根据专家的说法,这似乎不太可能。
我现在的解决方法是使用 GCE,因为它们具有单核实例,实际上运行工作的速度与我笔记本电脑的芯片一样快,并且几乎按核心按比例定价。
google-compute-engine - 在 Google Compute Engine 上设置和运行网格作业的工具?
我需要在 Google Compute Engine 上设置和运行“令人尴尬”的并行作业。我正在寻找工具来促进这一点。
在 EC2 上,我使用 MIT 的 Starcluster 来设置集群,然后将作业提交给 SGE。
Google Compute Engine 是否有类似的工具可用?
如果没有,我可能会手动设置一个 Condor 集群来完成这些工作。嗡嗡声杀。