如何让doFuture在LSF调度的HPC上利用多节点核心?
问题
我正在用R包doFuture计算大计算量的样本量,本地代码如下:
library(MAMS) plan(multisession, workers = 12) mams(K=4, J=3, alpha=0.05, power=0.9, r=1:3, r0=1:3, p=0.65, p0=0.55, ushape="triangular", lshape="triangular", nstart=30)
我想在采用LSF调度器的HPC上运行代码并测试多参数场景,编写了如下批处理文件:
#!/bin/bash #BSUB -J mams #BSUB -P acc_user #BSUB -q premium #BSUB -n 24 #BSUB -W 120:00 #BSUB -oo %J.stdout #BSUB -eo %J.stderr #BSUB -L /bin/bash module load openmpi module load R R CMD BATCH --no-save --no-restore '--args nc=2' sample_size.R output.Rout
根据doFuture文档,我把R代码中plan的参数从multisession改为cluster:
library(MAMS) plan(cluster, workers = 12) mams(K=4, J=3, alpha=0.05, power=0.9, r=1:3, r0=1:3, p=0.65, p0=0.55, ushape="triangular", lshape="triangular", nstart=30)
但HPC管理员指出我的作业无法利用多节点核心,资源使用效率低,要求我在批处理文件中添加#BSUB -R span[hosts=1],我已照做。现在想知道:如何让doFuture在LSF调度的HPC上使用多节点核心?
解决方案
要让doFuture在LSF HPC上利用多节点核心,需从批处理脚本和R代码两方面调整:
1. 修改LSF批处理脚本
删除之前添加的#BSUB -R span[hosts=1]参数——这个参数会强制作业仅使用单个节点,是多节点利用的核心限制。修改后的脚本如下:
#!/bin/bash #BSUB -J mams #BSUB -P acc_user #BSUB -q premium #BSUB -n 24 # 总核心数,可根据需求调整 #BSUB -W 120:00 #BSUB -oo %J.stdout #BSUB -eo %J.stderr #BSUB -L /bin/bash module load openmpi module load R R CMD BATCH --no-save --no-restore sample_size.R output.Rout
2. 调整R代码以适配多节点集群
不要硬指定workers数量,而是通过LSF环境变量自动获取分配的节点信息,创建跨节点的PSOCK集群:
library(MAMS) library(future) library(parallel) library(parallelly) # 自动识别LSF分配的所有节点与核心 workers <- availableWorkers() # 创建跨节点的PSOCK集群 cl <- makeClusterPSOCK(workers) # 设置future执行计划为集群模式 plan(cluster, workers = cl) # 执行样本量计算 mams(K=4, J=3, alpha=0.05, power=0.9, r=1:3, r0=1:3, p=0.65, p0=0.55, ushape="triangular", lshape="triangular", nstart=30) # 计算完成后关闭集群,释放资源 stopCluster(cl)
关键说明
availableWorkers()函数(来自parallelly包)会自动读取LSF的LSB_HOSTS环境变量,返回所有分配节点的地址列表,无需手动指定节点。makeClusterPSOCK()创建的PSOCK集群支持跨节点通信,HPC环境一般已配置好节点间的无密码SSH访问,无需额外设置。- 避免硬编码
workers数量,确保作业能充分利用LSF分配的所有核心。
内容的提问来源于stack exchange,提问作者Márcio Augusto Diniz
相关产品推荐
相关产品推荐

