2016-08-12 63 views
0

我试图在HPC上运行R代码,但不知道如何利用多个节点。我使用的特定HPC有100个节点,每个节点有36个核心。R中的多节点处理

这是一个代码示例。

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

如果您对HPC群集非常认真,请使用MPI群集,而不是SOCK。 MPI是非共享内存计算的标准,大多数群集都针对MPI进行了优化。

在HPC的情况下,您还需要一个作业脚本来启动R.有几种启动方法,您可以使用mpirun或直接从R中调用作业。Scheduler将设置MPI环境,R将会找出使用哪个节点。从4名工人开始小,然后增加数量,直到达到最佳水平。大多数任务不能有效使用3600 cpu。

最后,如果您在MPI上使用数十个CPU-s,我强烈建议使用Rhpc而不是Rmpi软件包。它使用更高效的MPI通信并为您提供明显的速度提升。

在我使用的东西沿线的扭矩控制系统:

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() 

具体的扭矩 - 部分是nodefile部分,这样我知道有多少工人创造。在jobcript中,我开始R就像Rscript >>output.txt myScript.R

作为便笺:你确定myfun(files, ...)是正确的?也许你的意思是myfun(files[i], ...)?我们很高兴帮助:-)