You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:51:00