处理通常被称为“中型数据”项目的内容,我能够在4到32个内核中的一个系统上平行我的代码(主要用于Python的建模和预测)。现在,我正在考虑扩大EC2上的群集(可能与StarCluster/Ipython一起使用,但也向其他建议开放),并且对如何在实例上与集群的实例进行调和,使如何调和分布式作品。

在每个实例的跨实例以及跨核心并行化甚至实用吗?如果是这样,任何人都可以快速介绍每个实例,每个实例都有很少的核心与许多核心的几个实例?每个实例的实例与核心的正确比率是否有经验法则?

带宽和RAM在我的项目中是非平凡的问题,但是当这些是瓶颈和调整时,很容易发现。我想,很难在没有重复测试的情况下将核心的正确组合为实例,而我的项目差异太大,以至于任何单个测试都无法应用于所有情况。预先感谢您,如果我只是未能正确地搜索此内容,请随时向我指出正确的答案!

有帮助吗?

解决方案

使用Ipython时,您几乎不必担心它(以效率损失/更大的沟通开销为代价)。 StarCluster中的平行IPYTHON插件默认情况下将在每个节点上的每个物理核心启动一个引擎(我相信这是可配置的,但不确定在哪里)。您只需使用DirectView API(map_sync,apply_sync,...)或%px magic命令来运行所有发动机的任何内容。如果您已经在一台计算机上并行使用ipython,则在群集上使用它也不例外。

解决您的一些特定问题:

“如何在实例上与群集上的实例进行调和分布式工作” - 至少您会得到一个引擎(至少);工作将自动分布在所有内核和所有实例中。

“在每个实例的跨实例以及跨核方面并行化甚至实用吗?” - 是:)如果您正在运行的代码是令人尴尬的并行的(在多个数据集上完全相同的算法),那么您可以大多忽略特定引擎正在运行的位置。如果核心需要在引擎之间进行大量通信,那么您当然需要构造它,以便引擎主要与同一台物理机上的其他引擎进行通信;但是我认为,这种问题并不适合Ipython。

“如果是这样,任何人都可以快速对每个实例进行许多实例的利弊,每个核心几个实例,而有许多内核的几个实例? “ - 使用最大的C3实例进行计算和最小的记忆带宽界限问题;对于通过消息传达的问题,也可以使用最大的实例,但请尝试将问题划分,以便每个分区都在一台物理机器上运行,并且大多数消息传递在同一分区内。在n个四核C3实例上会慢的问题比在2N double C3上较慢(一个人工示例可能是在大量图像上运行多个简单的过滤器,您可以在每个滤镜上浏览所有图像,而不是所有过滤器,而不是所有过滤器相同的图像)。使用最大实例是一个很好的经验法则。

其他提示

一般的经验法则是要等到您必须分发。拥有一定容量的n个服务器通常比该容量一半的2N服务器更有效。更多的数据访问将是本地的,因此在整个网络中的内存与慢速相比,将是局部的。

在某个时刻,扩展一台机器会变得不经济,因为其他资源规模的成本比线性更大。但是,这一点仍然很高。

不过,在亚马逊上,如果您使用现场市场实例,则每种实例类型的经济学可能会有很大差异。默认定价或多或少意味着相同数量的资源成本大约相同的实例类型,可能会有很大的变化;大实例可以比小实例便宜,或者n个小实例比拥有等效资源的一台大型机器便宜得多。

这里的一个大量考虑是,当您从一台计算机转移到多台计算机时,计算范式可能会发生很大变化。通信间接费用的权衡可能会迫使您采用数据并行范式进行扩展。这意味着工具和算法的不同选择。例如,SGD看起来与MapReduce相比,内存和python中的不同。因此,您必须在并行之前考虑这一点。

即使单个节点和非分布式范例适合您,您也可以选择在集群上分发工作。如果单个节点失败,您将失去所有计算;分布式计算可以潜在地恢复并完成丢失的计算部分。

所有认为相等的事物(成本,CPU perf等)您可以选择最小的实例,这些实例可以将我的所有数据集保存在内存中并扩展。那样

  • 您确保不要因网络通信而引起不必要的潜伏期,并且
  • 您倾向于最大程度地提高流程的总体可用内存带宽。

假设您正在运行某种 交叉验证方案 优化一些 元参数 在您的模型中,为每个核心分配一个值,以测试并根据需要选择许多实例,以覆盖您所看到的几轮中的所有参数空间。

如果您的数据不适合一个系统的内存,那么您当然需要在实例上分发。然后,这是将记忆潜伏期(在许多实例中更好)与网络延迟(更好的情况下更好)平衡的问题,但是鉴于EC2的性质,我敢打赌,您通常会更喜欢在很少的脂肪实例中工作。

许可以下: CC-BY-SA归因
scroll top