【问题标题】:Memory virtualization with R on cluster在集群上使用 R 进行内存虚拟化
【发布时间】:2014-09-17 23:55:48
【问题描述】:

我对并行计算几乎一无所知,所以这个问题可能很愚蠢,可能无法做我想做的事。

我正在使用具有 40 个节点的 linux 集群,但是由于我不知道如何在 R 中编写并行代码,因此我仅限于使用一个。在这个节点上,我试图分析淹没内存的数据(大约 64GB)。所以我的问题不是缺乏计算能力,而是内存限制。

我的问题是,是否甚至可以使用一些 R 包(如 doSnow)进行隐式并行化以使用 2-3 个节点来增加 RAM 限制,或者我是否必须从地面重写脚本以使其显式并行化?

对不起,如果我的问题很幼稚,欢迎提出任何建议。

谢谢,

西蒙

【问题讨论】:

  • 并行编写代码不会帮助您限制 RAM。不过,bigmemory 之类的软件包可以提供帮助。这真的取决于你的需要。您可以采样吗?你需要处理数据吗?我不确定我们是否有足够的信息。

标签: r memory-management parallel-processing cluster-computing


【解决方案1】:

供日后查询:

您可能想看看“snow”和“parallel”两个包。 库“snow”扩展了 apply/lapply/sapply... 的功能,可以在多个核心和/或一个节点上工作。

当然,您可以使用多个内核执行简单的并行计算:

#SBATCH --cpus-per-task=(在此处输入一些数字)

您还可以使用多个节点(最好使用前面提到的库)执行并行计算:

#SBATCH --ntasks-per-node=(在此处输入一些数字)

但是,出于几个方面的考虑,您可能想考虑使用 Python 而不是 R,在这种情况下,使用“Dask”工作线程可以提高并行性。

【讨论】:

    【解决方案2】:

    您可能想看看 TidalScale,它可以让您聚合集群上的节点,以使用底层节点的集合资源运行单个 Linux 实例。 www.tidalscale.com。尽管 R 应用程序可能本质上是单线程的,但您将能够为您的 R 应用程序提供跨节点的单一、简单的连贯内存空间,这对您的应用程序是透明的。

    祝你的项目好运!

    【讨论】:

      【解决方案3】:

      我不认为有这样的包。原因是拥有一个没有多大意义。内存访问速度非常快,与此相比,通过网络从另一台计算机访问数据非常慢。因此,如果存在这样的包,它几乎是无用的,因为处理器需要一直等待网络上的数据,这会使计算变得非常非常慢。

      这对于由现成硬件构建的普通计算集群来说是正确的。如果你碰巧有一个特殊的集群,远程内存访问速度很快,并且作为操作系统的服务提供,那当然可能还不错。

      否则,您需要做的是尝试手动将问题分成多个部分,然后使用 R 或其他工具并行化。

      另一种方法是将一些数据保留在磁盘上,而不是将所有数据加载到内存中。在加载另一部分数据之前,您仍然需要(在某种程度上)划分问题,以确保内存中的这部分数据用于计算的合理时间。

      是否值得(或可能)执行这些选项中的任何一个,完全取决于您的应用程序。

      顺便说一句。 R 中的高性能计算工具列表如下: http://cran.r-project.org/web/views/HighPerformanceComputing.html

      【讨论】:

      • 感谢您提供有用的解释和链接。让整个集群可用而不能使用它的全部功能真的很令人沮丧。我正在使用构建的管道来分析数据,所以除非我完全重写它,否则我无法并行化。
      猜你喜欢
      • 1970-01-01
      • 2016-03-31
      • 2012-05-05
      • 2017-02-14
      • 1970-01-01
      • 2017-09-23
      • 2017-08-24
      • 2013-12-13
      • 2020-07-09
      相关资源
      最近更新 更多