makeCluster 函数中的第一个参数究竟做了什么?
what exactly does the first argument in makeCluster function do?
我是 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 但在 运行ning
之后
nCores <- detectCores(logical = FALSE)
我了解到我有 4 个线程可用。我根据指南中提供的消息更改了值。这会让我同时 运行 train 函数同时进行 128 次迭代吗?如果是这样,首先获取我的计算机拥有的线程和内核数量有什么意义?
您要做的是首先检测您拥有的内核数量。
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 也存在,但这取决于您使用的 OS。
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
我不完全相信 parallel::makeCluster
中的 spec
参数明确是要使用的最大内核数(实际上是逻辑处理器)。尽管指定要离开,但我在一些计算量大的进程和 CPU 和 # cores used==detectCores()
的规范参数中使用了 detectCores()-1
和 detectCores()-2
的值一个小空间(在这里,为其他进程留出 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 参数可能会告诉整个过程中使用的最大内核数,但它没有出现该过程同时在多个内核上进行 运行。作为新手并行器,也许需要一个更合适的示例来 reject/support this?
package documentation 建议 spec
是“适合集群类型的规范”。
我已经深入研究了相关的并行文档,但无法确定 spec
到底在做什么。但我不相信这个论点一定会控制参与的最大内核数(逻辑处理器)。
这里是我认为我的假设可能是错误的地方:如果我们指定 spec
小于机器核心(逻辑处理器)的数量,那么,假设没有其他大进程是 运行,机器永远不应该达到 no_cores 倍 100% CPU 使用率(即 1600% CPU 使用率最大值,16 个内核)。
但是,当我使用资源监视器在 Windows OS 上监视 CPU 时),看起来确实存在 no_cores 个图像对于 Rscript.exe 运行.
我是 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 但在 运行ning
nCores <- detectCores(logical = FALSE)
我了解到我有 4 个线程可用。我根据指南中提供的消息更改了值。这会让我同时 运行 train 函数同时进行 128 次迭代吗?如果是这样,首先获取我的计算机拥有的线程和内核数量有什么意义?
您要做的是首先检测您拥有的内核数量。
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 也存在,但这取决于您使用的 OS。
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
我不完全相信 parallel::makeCluster
中的 spec
参数明确是要使用的最大内核数(实际上是逻辑处理器)。尽管指定要离开,但我在一些计算量大的进程和 CPU 和 # cores used==detectCores()
的规范参数中使用了 detectCores()-1
和 detectCores()-2
的值一个小空间(在这里,为其他进程留出 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 参数可能会告诉整个过程中使用的最大内核数,但它没有出现该过程同时在多个内核上进行 运行。作为新手并行器,也许需要一个更合适的示例来 reject/support this?
package documentation 建议 spec
是“适合集群类型的规范”。
我已经深入研究了相关的并行文档,但无法确定 spec
到底在做什么。但我不相信这个论点一定会控制参与的最大内核数(逻辑处理器)。
这里是我认为我的假设可能是错误的地方:如果我们指定 spec
小于机器核心(逻辑处理器)的数量,那么,假设没有其他大进程是 运行,机器永远不应该达到 no_cores 倍 100% CPU 使用率(即 1600% CPU 使用率最大值,16 个内核)。
但是,当我使用资源监视器在 Windows OS 上监视 CPU 时),看起来确实存在 no_cores 个图像对于 Rscript.exe 运行.