无法手动设置 R“NMF”包中并行工作线程的数量——仅使用 2 个核心

问题描述 投票:0回答:2

我正在尝试在具有 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 个以上的核(太慢了)。 真的非常感谢任何帮助。

规格:NMF 版本 .26、R 版本 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
}

我不明白为什么这些问题在我的笔记本电脑上不会出现问题,并行代码按预期工作,但这是我唯一能想到的。 有什么想法吗? 预先感谢

r parallel-processing apple-silicon nmf
2个回答
4
投票

对于遇到同样问题的人,我通过安装以前版本的 NMF 解决了它:0.25。 该问题似乎是 0.26 版本特有的。 这是一些修复它的代码:

# install.packages("devtools")
library("devtools")
install_version("NMF", version = "0.25")

我选择不更新任何其他软件包(选项

3. None
),不确定这是否重要。


0
投票

谢谢!甚至 ChatGPT o-1 也无法解决这个问题。我花了很多问题试图解决它......你的解决方案也对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.