我最近继承了一个遗留的 R 脚本,它在某些时候训练了一个带有大回归矩阵的梯度提升模型。此任务使用该doParallel::registerDoParallel
函数并行化。最初,脚本以以下方式启动并行后端:
cl = makeCluster(10)
doParallel::registerDoParallel(c)
该工作站有 12 个 CPU 和 28 GB 的 RAM。回归矩阵刚刚超过 2 GB,我认为这种设置是可以管理的,但是,它会启动数十个子进程,耗尽内存并在几秒钟内使 R 崩溃。cores
最终我了解到,在 Linux 上,可以通过使用以下参数来实现更可预测的设置:
doParallel::registerDoParallel(cores = 1)
其中cores
实际上是每个 CPU 的子进程数,即cores = 2
在这 12 个 CPU 架构中它启动了 24 个子进程。问题是,这么大的回归矩阵,12个子过程也太多了。
启动的子进程的数量如何registerDoParallel
限制为 8 个?使用不同的并行化库会有所帮助吗?
更新:为了确定每个子进程所需的内存,我在没有启动集群或使用的情况下运行了脚本registerDoParallel
;仍然产生了 12 个后端子流程。罪魁祸首是caret::train
功能,它似乎是在没有监督的情况下管理并行化。我在 GitHub 上打开了一个新问题,询问有关如何限制此函数使用的资源的说明。