我正在尝试在HPC上运行R代码,但不确定如何利用多个节点。我使用的特定HPC有100个节点,每个节点有36个核心。
以下是代码示例。
n = 3600 ### This would be my ideal. Set to 3 on my laptop
cl = makeCluster(n, "SOCK")
foreach(i in 1:length(files), packages=c("raster","dismo")) %dopar%
Myfunction(files=files[i],template=comm.path, out = outdir)
此代码适用于我的笔记本电脑和HPC的登录,但它只使用1个节点。我只是想确保我能利用所有核心。
我如何具体利用多个节点,还是“在幕后”完成?
答案 0 :(得分:0)
如果您认真对待HPC群集,请使用MPI群集,而不是SOCK。 MPI是非共享内存计算的标准,大多数集群都针对MPI进行了优化。
对于HPC,您还需要一个作业脚本来启动R.有几种方法可以启动它。您可以使用mpirun
,或直接从R调用工作程序.Scheduler将设置MPI环境并且R将确定要使用的节点。从4个工人开始,然后增加数量,直到达到最佳水平。大多数任务无法有效使用3600 cpu。
最后,如果你在MPI上使用数十个CPU,我强烈建议使用Rhpc而不是Rmpi包。它使用更高效的MPI通信,并为您提供非常明显的速度提升。
在TORQUE控制的系统上,我正在使用一些东西:
Rhpc_initialize()
nodefile <- Sys.getenv("PBS_NODEFILE")
nodes <- readLines(nodefile)
commSize <- length(nodes)
cl <- Rhpc_getHandle(commSize)
Rhpc_Export(cl, c("data"))
...
result <- Rhpc_lapply(cl, 1:1000, runMySimulation)
...
Rhpc_finalize()
特定于TORQUE的部分是nodefile部分,这样我知道要创建多少个worker。在作业中,我开始R Rscript >>output.txt myScript.R
。
作为旁注:您确定myfun(files, ...)
是否正确?也许你的意思是myfun(files[i], ...)
?
让我们知道它是怎么回事,我很乐意提供帮助: - )