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

如何配置SLURM脚本使HPC的2个节点共40核满负荷运行R并行代码?

解决SLURM环境下R跨节点并行利用40核的问题

你的核心问题在于直接用Rscript启动脚本时,R默认的单节点并行机制无法跨节点调度计算资源,必须结合MPI框架实现分布式并行。以下是修改后的.sbatch脚本及配套的R代码调整方案:

修改后的SLURM作业脚本

#!/bin/bash
#SBATCH --job-name=my_r_script   # 作业名称
#SBATCH --nodes=2                 # 指定使用2个节点
#SBATCH --ntasks-per-node=20       # 每个节点分配20个任务(对应20核)
#SBATCH --cpus-per-task=1         # 每个任务占用1核
#SBATCH --mem=4G                  # 每个节点的内存配额
#SBATCH --time=1:00:00            # 作业时间限制

# 加载R和MPI模块(MPI模块名称需根据集群实际情况调整)
module load R
module load openmpi

# 通过srun启动R脚本,让SLURM将40个任务分发到2个节点
srun --mpi=pmix Rscript my_Rscript.R

关键修改说明

  1. 明确节点任务分配:取消注释--ntasks-per-node=20,配合--nodes=2确保40核均匀分布在2个节点上
  2. 加载MPI模块:跨节点并行依赖MPI实现节点间通信,必须加载集群对应的MPI模块(如openmpi或intelmpi,可通过module avail查看集群可用模块)
  3. 用srun启动R:srun会遵循SLURM的任务分配规则,在所有分配的核上启动R进程,通过MPI完成跨节点数据交互

R代码适配调整

仅修改SLURM脚本不足以实现跨节点并行,R代码需使用支持分布式并行的包(如doMPI或Rmpi),示例如下:

示例1:使用doMPI包

library(doMPI)

# 初始化MPI集群,自动识别SLURM分配的40个核心
cl <- startMPIcluster()
registerDoMPI(cl)

# 验证核心数(输出应为40)
cat("可用核心总数:", getDoParWorkers(), "\n")

# 并行计算示例:计算1-100的平方
results <- foreach(i = 1:100) %dopar% {
  i^2
}

# 关闭集群并退出MPI环境
closeCluster(cl)
mpi.quit()

示例2:使用parallel+Rmpi包

library(parallel)
library(Rmpi)

# 基于MPI创建分布式集群
cl <- makeCluster(mpi.universe.size(), type = "MPI")

# 并行计算示例
results <- parLapply(cl, 1:100, function(x) x^2)

# 清理资源
stopCluster(cl)
mpi.quit()

注意事项

  • 避免使用mclapply:该函数基于系统fork机制,仅支持单节点并行,无法跨节点调度
  • 安装依赖包:如果集群未预装doMPI或Rmpi,需在用户目录自行安装(如install.packages("doMPI"))
  • 适配集群MPI环境:部分集群可能需要调整MPI启动参数,可咨询集群管理员获取具体配置

内容的提问来源于stack exchange,提问作者Arnoneel Sinha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:47:30