R语言NMF包无法手动设置并行核心数,仅用2核求助
解决NMF包在M2 Ultra Mac Studio上强制限制2核的问题
问题根源
从你提供的NMF包源码来看,getMaxCores函数中存在一行错误的硬编码:
if(n > 2) n <- 2
这行代码会无条件将核心数限制为2,无论当前是否处于CRAN检查环境,这是24核机器只能用2核的直接原因。你的M1 MacBook Pro能正常使用全部核心,大概率是因为安装的NMF版本更早,未加入这行不合理的硬编码。
解决方案
加载NMF包后,立即重写getMaxCores函数,移除这个核心数限制:
步骤1:重写核心数检测函数
library(NMF) # 覆盖原getMaxCores函数,仅保留CRAN官方检查时的2核限制 getMaxCores <- function(limit=TRUE){ nt <- n <- parallel::detectCores() # 仅在CRAN检查环境下限制为2核 if( n > 2 && isCHECK() ){ message("# NOTE - CRAN check detected: limiting maximum number of cores [2/", nt, "]") n <- 2L } # 可选:若需要将核心数限制为系统选项值,保留以下代码;否则注释 # if(limit) n <- min(n, getOption('cores', n)) n } # 验证是否正确检测到全部核心 cat("当前检测到的核心数:", getMaxCores(), "\n")
步骤2:配置并行参数并运行任务
重写函数后,再设置NMF的并行选项和后端:
library(doMC) # 设置NMF并行参数 nmf.options(verbose = TRUE, pbackend = 'par', cores = 20) # 注册doMC并行后端 registerDoMC(cores = 20) # 生成测试数据并运行NMF data <- matrix(data = runif(500000), nrow = 10000) nmf.models <- nmf(data, rank = 5:7, nrun = 30, .opt = 'vP20', seed = 123)
额外说明
- 无需设置
R_PACKAGE_NMF_CORES环境变量,重写后的函数会优先使用系统检测到的核心数,或你手动指定的cores参数。 - 如果偏好使用
doParallel而非doMC,替换注册后端的代码即可:library(doParallel) cl <- makeCluster(20, type = "FORK") registerDoParallel(cl) # 任务完成后记得关闭集群 # stopCluster(cl)
内容的提问来源于stack exchange,提问作者Adam Morgan
相关产品推荐
相关产品推荐

