我试图在一个全新的24核M2 Ultra Mac Studio上使用NMF包。我成功安装了软件包(install.packages("NMF")
),但当我加载它(library("NMF")
)时,它报告只检测到2个核心:NMF - BioConductor layer [OK] | Shared memory capabilities [OK] | Cores 2/2
下面是一些可复制的代码:
library("parallel")
library("foreach")
library("doParallel")
library("doMC")
library("NMF")
data <- matrix(data = runif(500000), nrow = 10000) # a 10,000 x 50 non-negative data matrix
nmf.options(verbose = TRUE,
pbackend = 'par',
cores = 20) # tried manually setting NMF parameters
doMC::registerDoMC(cores = 20) # tried manually registering a parallel backend with doMC
Sys.setenv("R_PACKAGE_NMF_CORES" = 20) # tried setting whatever this variable that the NMF source code references is
# # Set up parallel workers
# cl <- makeCluster(n.cores.to.use.nmf, type = "FORK")
# registerDoParallel(cl) # tried manually registering a parallel backend with doParallel
nmf.models <- nmf(data,
rank = 5:7,
nrun = 30,
.opt = 'vP20', # tried manually setting it to 20 cores here (v = verbose, P = force parallel, 20 = 20 cores)
# .pbackend = 20, # here too
seed = 123)
# stopCluster(cl)
同样的代码可以在我的8核M1 MacBook Pro上运行,但我似乎无法让它在新电脑上运行超过2核(太慢了)。我真的很感激任何帮助。
Specs:NMF version .26,R version 4.3.1-arm64,macOS Ventura 13.5.1.
我已经尝试了我能想到的那个代码块中手动覆盖的每一种组合。除了两个平行工作者,我什么也得不到。我看了一下源代码,我不确定,但我怀疑问题出在以下两个地方之一:要么在.onload
函数中(因此我尝试手动设置上面的R_PACKAGE_NMF_CORES
的值)...
.onLoad <- function(libname, pkgname) {
# set default number of cores
if( isCHECK() ){
options(cores=2)
}else{
if( nchar(nc <- Sys.getenv('R_PACKAGE_NMF_CORES')) > 0 ){
try({
nmf.options(cores=as.numeric(nc))
})
}
}
...或者在Parallel.R文件(/NMF/R/Parallel.R)中的getMaxCores函数中,它似乎只是将核心数设置为2,而不管:
# Definitions used in the parallel computations of NMF
#
# - reproducible backend
# - reproducible %dopar% operator: %dorng%
#
# Author: Renaud Gaujoux
# Creation: 08-Feb-2011
###############################################################################
#' @include utils.R
#' @import foreach
#' @import doParallel
NULL
# returns the number of cores to use in all NMF computation when no number is
# specified by the user
getMaxCores <- function(limit=TRUE){
#ceiling(parallel::detectCores()/2)
nt <- n <- parallel::detectCores()
# limit to number of cores specified in options if asked for
if(n > 2) n <- 2
# forces limiting maximum number of cores to 2 during CRAN checks
if( n > 2 && isCHECK() ){
message("# NOTE - CRAN check detected: limiting maximum number of cores [2/", nt, "]")
n <- 2L
}
n
}
我不明白为什么这两个问题在我的笔记本电脑上不会有问题,在我的笔记本电脑上,并行代码按预期工作,但这是我唯一能想到的。有什么想法吗?先谢了
1条答案
按热度按时间2guxujil1#
对于任何有同样问题的人,我通过安装以前版本的NMF解决了这个问题:0.25。这个问题似乎是0.26版本特有的。下面是一些代码来修复它:
我选择不更新任何其他软件包(选项
3. None
),不确定这是否重要。