【问题标题】:what exactly does the first argument in makeCluster function do?makeCluster 函数中的第一个参数究竟是做什么的?
【发布时间】:2019-04-25 23:17:42
【问题描述】:

从我的问题的性质可以看出,我是 r 编程的新手。我正在尝试利用 train 函数的并行计算能力。

library(parallel)
#detects number of cores available to use for parallel package
nCores <- detectCores(logical = FALSE)
cat(nCores, " cores detected.")  

# detect threads with parallel()
nThreads<- detectCores(logical = TRUE)
cat(nThreads, " threads detected.")

# Create doSNOW compute cluster (try 64)
# One can increase up to 128 nodes
# Each node requires 44 Mbyte RAM under WINDOWS.
cluster <- makeCluster(128, type = "SOCK")
class(cluster);

我需要有人帮我解释这段代码。最初makeCluster() 的第一个参数有 nthreads 但在运行之后

nCores <- detectCores(logical = FALSE)

我了解到我有 4 个线程可用。我根据指南中提供的消息更改了值。这能让我一次同时运行 128 次 train 函数迭代吗?如果是这样,首先获取我的计算机拥有的线程和内核数量有什么意义?

【问题讨论】:

    标签: r rparallel


    【解决方案1】:

    您要做的是首先检测您拥有的核心数量。

    nCores <- detectCores() - 1
    

    大多数情况下,人们加负 1 是为了确保您还有一个核心可以做其他事情。

    cluster <- makeCluster(nCores)
    

    这将设置您希望代码运行的集群数量。有几种并行方法(doParallel、parApply、parLapply、foreach、..)。 根据您选择的并行方法,将在您创建的一个特定集群上运行一种方法。

    我在我的代码中使用的小例子

      no_cores <- detectCores() - 1
      cluster <- makeCluster(no_cores)
      result <- parLapply(cluster, docs$text, preProcessChunk)
      stopCluster(cluster)
    

    我也看到你在使用袜子。不确定“type=SOCK”是否有效。 我总是使用“type=PSOCK”。 FORK 也存在,但取决于您使用的操作系统。

    FORK: "to divide in branches and go separate ways"
    Systems: Unix/Mac (not Windows)
    Environment: Link all
    
    PSOCK: Parallel Socket Cluster
    Systems: All (including Windows)
    Environment: Empty
    

    【讨论】:

      【解决方案2】:

      我不完全相信parallel::makeCluster 中的spec 参数明确是要使用的最大内核数(实际上是逻辑处理器)。尽管指定留出一点空间(这里,留下 1 个逻辑处理器其他进程免费)。

      下面的例子很粗糙,因为我没有捕捉到核心使用的任何定量输出。请建议编辑。

      您可以在运行一个简单示例的同时通过任务管理器等监控来可视化核心使用情况:

      no_cores <- 5
      cl<-makeCluster(no_cores)#, outfile = "debug.txt")
      parallel::clusterEvalQ(cl,{
        library(foreach)
        
        foreach(i = 1:1e5) %do% {
          print(sqrt(i))
        }
      })
      stopCluster(cl)
      #browseURL("debug.txt")
      

      然后,使用例如 ncores-1 重新运行:

      no_cores <- parallel::detectCores()-1
      
      cl<-makeCluster(no_cores)#, outfile = "debug.txt")
          parallel::clusterEvalQ(cl,{
            library(foreach)
            
            foreach(i = 1:1e5) %do% {
              print(sqrt(i))
            }
          })
          stopCluster(cl)
      

      尽管 no_cores 被指定为 15,但所有 16 个核心似乎都在使用:

      根据上面的示例和我非常粗略(仅视觉)的分析...看起来 spec 参数可能会告诉在整个过程中使用的最大内核数,但它并没有出现在过程中同时在多个内核上运行。作为一个新手并行化器,也许需要一个更合适的例子来拒绝/支持这一点?

      package documentation 建议 spec 是“适合集群类型的规范。”

      我已经深入研究了相关的并行文档,但无法确定 spec 到底在做什么。但我不相信这个论点必然控制要参与的核心(逻辑处理器)的最大数量。

      以下是我认为我的假设可能有误的地方:如果我们将 spec 指定为小于机器内核(逻辑处理器)的数量,那么假设没有其他大型进程正在运行,则机器永远不会实现no_cores 乘以 100% CPU 使用率(即 16 核的最大 CPU 使用率 1600%)。

      但是,当我使用资源监视器监视 Windows 操作系统上的 CPU 时,似乎确实存在运行 Rscript.exe 的 no_cores 图像。

      【讨论】:

        猜你喜欢
        • 2015-01-05
        • 2014-08-23
        • 2021-04-26
        • 2011-12-16
        • 2011-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-26
        相关资源
        最近更新 更多