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