【问题标题】:Parallel processing in R limitedR中的并行处理受限
【发布时间】:2012-10-16 22:56:12
【问题描述】:

我正在使用并行和 doParallel 包运行 ubuntu 12.04 和 R 2.15.1。当我并行运行任何东西时,我被限制为 100% 的内核,而我应该有高达 800% 的内核,因为我使用 8 个内核运行它。系统监视器上显示的是每个子进程只获得了 12%。

是什么限制了我的执行速度?

【问题讨论】:

  • 您必须发布更多您正在运行的代码才能确定。但是在 ubuntu 12.04 上,我根本没有这个问题,并且多次以 100% 的速度愉快地固定 24 个内核。
  • 它不特定于任何特定的代码。
  • 那我也帮不上什么忙了。因为它对我有用!您也可以尝试doMC 包...但是没有看到您使用doParallel 的方式以及您正在使用的实现(foreach.parallel 来自plyr?)我没有认为任何人都可以提供帮助。

标签: r ubuntu parallel-processing


【解决方案1】:

问题可能在于 R 进程仅限于一个核心(并且子进程继承了该核心)。

试试这个:

> system(sprintf("taskset -p 0xffffffff %d", Sys.getpid()))
pid 3064's current affinity mask: fff
pid 3064's new affinity mask: fff

现在,如果在您的机器上,当前的关联掩码报告为 1,那么这就是问题所在。上面的行应该可以解决它(即第二行应该报告 fff (或类似的)。

Simon Urbanek 编写了一个函数mcaffinity,允许对多核进行这种控制。据我所知,它还在 R-devel 中。

有关详细信息,请参阅例如这个discussion on R-sig-hpc

更新,补充郭鑫的回答:

如果您同时使用通过 openblas 的隐式并行化和显式并行化(通过 parallel/snow/multicore),您可能需要根据您是否在显式并行部分内来更改 openblas 使用的线程数。
这是可能的(在 Linux 下使用 openblas,我不知道有任何其他通常优化的 BLAS' 提供线程数的函数),请参阅Simon Fuller's blog post 了解详细信息。

【讨论】:

    【解决方案2】:

    由于libblas.so(.3gf) 软件包,我遇到了同样的问题,我不知道这是否也会导致您的问题。当R 启动时,它会调用安装在您系统中的BLAS 系统来进行线性代数计算。我有libopenblas.so(.3gf),它使用“CPU Affinity”选项进行了高度优化,也就是说,当你进行数值向量或矩阵计算时,openblas 包将只创建 8 个线程,并使每个线程都粘在一个指定和固定的 CPU 以加快代码速度。然而,通过设置这个,你的系统会被告知所有的 CPU 都非常繁忙,因此如果有更多的并行任务来,系统会尝试将它们挤到一个 CPU 中,以尽量不干扰繁忙的 CPU。

    所以这是我的解决方案,我下载了一个 openblas 包源并用文件“Makefile.rule”编译它更改:有一行“#NO_AFFINITY = 1”,我刚刚删除了“#”,这样编译后,没有选择关联选项。然后我安装了这个包,问题就解决了。

    有关此的参考,请参阅https://github.com/ipython/ipython/issues/840

    请注意,这是一种权衡。去掉 CPU 亲和性会让你在进行数值计算时失去一些效率,这就是为什么 openblas 维护者(张先义博士)虽然知道这个问题,但他仍然将 cpu 亲和性作为默认选项发布代码。

    【讨论】:

    • 是的,这也可能发生。
    • 在我的 Makefile.rule 中,这一行已经被取消注释,所以它使用 NO_AFFINITY=1 编译,但我的问题仍然存在
    • 嗨,Lindon,你能帮我检查一下,如果你编译了源文件(编译时,makefile 将使用多线程,所以输出应该滚动得很快),如果你安装了你自己编译的openblas,如果你用过sudo update-alternatives --config libblas.so.3gfsudo update-alternatives --config libblas.so,那么现在的blas真的是openblas系统吗?希望这会有所帮助。
    • xianyi 在 5 月 17 日的 commit github.com/xianyi/OpenBLAS/blob/… 中禁用了亲和性,因此一旦进入主流发行版,这个问题应该不会再次出现。 (嗯,从技术上讲,它是 wernsaar。也许先义还没有注意到:-P)
    【解决方案3】:

    我的猜测是您可能输入了错误的代码。我想发布一个从网上复制的例子http://www.r-bloggers.com/parallel-r-loops-for-windows-and-linux/

    library(doMC)
    registerDoMC()
    x<- iris[which(iris[,5]!='setosa'),c(1,5)]
    trials<- 10000
    r<- foreach(icount(trials), .combine=cbind) %dopar% {
        ind<- sample(100,100,replace=T)
        result1<- glm(x[ind,2]~x[ind,1],family=binomial(logit))
        coefficients(result1)
    }
    

    您可以定义要并行使用的内核数量:

    options(cores=4)
    

    【讨论】:

    • 但他报告说他看到 8 个子进程,每个子进程的 CPU 使用率为 12%。
    猜你喜欢
    • 2013-01-27
    • 2021-06-04
    • 2016-10-08
    • 2016-05-13
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多