R脚本在外部集群上运行,性能没有提高

R脚本在外部集群上运行,性能没有提高,r,linux,parallel-processing,slurm,sbatch,R,Linux,Parallel Processing,Slurm,Sbatch,我使用的主题建模方法在我的RStudio计算机上运行良好,只是需要花费一些时间。所以我使用的是linux集群。然而,我似乎也要求很大的容量,它并没有真正加速: 对不起,我是新手。。。这就是我在选美外壳中使用的内容: salloc -N 240 --mem=61440 -t 06:00:00 -p med #!/bin/sh #SBATCH --nodes=200 #SBATCH --time=06:00:00 #SBATCH --partition=med #SBATCH --mem=102

我使用的主题建模方法在我的RStudio计算机上运行良好,只是需要花费一些时间。所以我使用的是linux集群。然而,我似乎也要求很大的容量,它并没有真正加速:

对不起,我是新手。。。这就是我在选美外壳中使用的内容:

salloc -N 240 --mem=61440 -t 06:00:00 -p med 
#!/bin/sh

#SBATCH --nodes=200
#SBATCH --time=06:00:00
#SBATCH --partition=med
#SBATCH --mem=102400
#SBATCH --job-name=TestJobUSERNAME
#SBATCH --mail-user=username@ddomain.com
#SBATCH --mail-type=ALL
#SBATCH --cpus-per-task=100

squeue –u username
cd /work/username/data
module load R
export OMP_NUM_THREADS=100
echo "sbatch: START SLURM_JOB_ID $SLURM_JOB_ID (SLURM_TASK_PID $SLURM_TASK_PID) on $SLURMD_NODENAME" 
echo "sbatch: SLURM_JOB_NODELIST $SLURM_JOB_NODELIST" 
echo "sbatch: SLURM_JOB_ACCOUNT $SLURM_JOB_ACCOUNT"

Rscript myscript.R
我很确定我的输入有问题,因为:

  • 它并不是真的更快(但我的R代码当然也可能很慢——所以我尝试了各种不同计算类型的R代码)
  • 无论我使用的是1个或200个节点,计算同一个R脚本所需的时间几乎完全相同(但至少应该有244个节点)
  • 回送结果没有提供完整的信息,我也没有收到电子邮件通知
这就是我的典型成果:

#just very small request to copy/paste the results, usually I request the one above
[username@gw02 ~]$ salloc -N 2 --mem=512 -t 00:10:00 -p short
salloc: Granted job allocation 1234567
salloc: Waiting for resource configuration
salloc: Nodes cstd01-[218-219] are ready for job
Disk quotas for user username (uid 12345):
                 --    disk space     --
Filesystem       limit  used avail  used
/home/user         32G  432M   32G    2%
/work/user          1T  219M 1024G    0%

[username@gw02 ~]$ squeue -u username 
      JOBID   PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
      1234567     short     bash username  R       2:14      2 cstd01-[218-219]

#(directory, module load, etc.)

#missing outcomes for SLURM_TAST_PID and SLUMD_NODENAME: 
[username@gw02 data]$ echo "sbatch: START SLURM_JOB_ID $SLURM_JOB_ID (SLURM_TASK_PID $SLURM_TASK_PID) on $SLURMD_NODENAME"
sbatch: START SLURM_JOB_ID 1314914 (SLURM_TASK_PID ) on
有人能帮忙吗?非常感谢你

编辑: 正如拉尔夫·斯塔布纳(Ralf Stubner)在他的评论中指出的那样,我不在R代码中进行并行化。我完全不知道该怎么做。 以下是一个计算示例:

# Create the data frame
col1 <- runif (12^5, 0, 2)
col2 <- rnorm (12^5, 0, 2)
col3 <- rpois (12^5, 3)
col4 <- rchisq (12^5, 2)
df <- data.frame (col1, col2, col3, col4)
# Original R code: Before vectorization and pre-allocation
system.time({
  for (i in 1:nrow(df)) { # for every row
    if ((df[i, "col1"] + df[i, "col2"] + df[i, "col3"] + df[i, "col4"]) > 4) { # check if > 4
      df[i, 5] <- "greater_than_4" # assign 5th column
    } else {
      df[i, 5] <- "lesser_than_4" # assign 5th column
    }
  }
})
#创建数据帧

col1快速查看您的R脚本,它看起来像是在:

best.model <- lapply(seq(seq_start,seq_end, by=iteration), function(k){
  LDA(dtm_stripped, k, method = 'Gibbs', control=list(nstart=nstart, seed = seed, best=best, burnin = burnin, iter = iter, thin=thin))
})
我还添加了
future.seed=TRUE
,以确保并行生成的随机数在统计上是合理的。
future\u lappy()
函数在包(*)中,因此您需要执行以下操作:

library(future.apply)
在脚本的顶部。现在,您需要做的最后一件事是,您需要通过添加以下内容来告诉它并行运行(默认为顺序运行):

plan(multiprocess)
也在顶部(在附加future.apply之后)。默认情况下,使用任何“可用”的内核,“可用”意味着它对HPC调度程序(例如Slurm)分配给您的作业的内核数量也是灵活的。如果您在本地计算机上尝试上述操作,它将默认使用其拥有的内核数。也就是说,您也可以在本地机器上验证代码,您应该会看到一些加速。当您知道它可以工作时,您可以通过Slurm分配在集群上重新运行它,它应该可以开箱即用地工作,但可以使用更多并行进程运行

你可能会发现我的建议很有用——最后有一些常见问题


(*)免责声明:我是future.apply的作者。

无需特殊干预,R代码是单线程的。因此,在200个请求的节点中,199个是空闲的。你在做什么使R代码并行工作?你能给我们举个简单的例子吗?C.f.和Hi@RalfStubner,谢谢你的留言。我用我的R代码更新了问题。我不知道R代码是单线程的。我不知道该怎么做。我也会仔细看看你的第二个链接。不幸的是,我对R也是新手,所以这看起来。。。非常具有挑战性;)你好@HenrikB,谢谢你的详细解释。我导入了它,但仍然收到一条错误消息“error in LDA(dtm_,k,method=“Gibbs”,control=list(nstart=nstart),:输入矩阵的每一行至少需要包含一个非零项调用:future_lappy…values.list->value->value.future->resignalCondition”.你有什么天才的想法吗?原因是什么?:)快速浏览一下
topicmodels::LDA()
从错误产生的地方来看,似乎是输入数据的问题。在生成过程中是否存在随机成分?如果是,如果使用纯
lappy()
,您会偶尔看到相同的情况。如果是,请在脚本顶部设置
set.seed(42)
,并验证
lappy()
有效。然后使用
future\u lappy()
重试。感谢您的大力帮助!我对所有变量都做了一些尝试。最让我印象深刻的一件事是:现在的计算速度比在我的计算机上运行脚本快40-60%。但是,无论我使用的是“salloc-N 2-t 04:00:00-p med”还是“salloc-N 2-t 04:00-p med”,都没有任何区别“salloc-N 200-t 06:00:00-p long”。你能再解释一点吗,这样我就可以优化更多?我无法强调你的答案到目前为止有多大帮助。
library(future.apply)
plan(multiprocess)